~cytrogen/masto-fe

99924f282f53593e670c70a38450a1c0e2d24c20 — ThibG 6 years ago 3bc0c4a
Memoize ancestorIds and descendantIds in detailed status view (#11234)

1 files changed, 44 insertions(+), 24 deletions(-)

M app/javascript/mastodon/features/status/index.js
M app/javascript/mastodon/features/status/index.js => app/javascript/mastodon/features/status/index.js +44 -24
@@ 4,6 4,7 @@ import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { createSelector } from 'reselect';
import { fetchStatus } from '../../actions/statuses';
import MissingIndicator from '../../components/missing_indicator';
import DetailedStatus from './components/detailed_status';


@@ 63,39 64,58 @@ const messages = defineMessages({
const makeMapStateToProps = () => {
  const getStatus = makeGetStatus();

  const mapStateToProps = (state, props) => {
    const status = getStatus(state, { id: props.params.statusId });
  const getAncestorsIds = createSelector([
    (_, { id }) => id,
    state => state.getIn(['contexts', 'inReplyTos']),
  ], (statusId, inReplyTos) => {
    let ancestorsIds = Immutable.List();
    ancestorsIds = ancestorsIds.withMutations(mutable => {
      let id = statusId;

      while (id) {
        mutable.unshift(id);
        id = inReplyTos.get(id);
      }
    });

    return ancestorsIds;
  });

  const getDescendantsIds = createSelector([
    (_, { id }) => id,
    state => state.getIn(['contexts', 'replies']),
  ], (statusId, contextReplies) => {
    let descendantsIds = Immutable.List();
    descendantsIds = descendantsIds.withMutations(mutable => {
      const ids = [statusId];

    if (status) {
      ancestorsIds = ancestorsIds.withMutations(mutable => {
        let id = status.get('in_reply_to_id');
      while (ids.length > 0) {
        let id        = ids.shift();
        const replies = contextReplies.get(id);

        while (id) {
          mutable.unshift(id);
          id = state.getIn(['contexts', 'inReplyTos', id]);
        if (statusId !== id) {
          mutable.push(id);
        }
      });

      descendantsIds = descendantsIds.withMutations(mutable => {
        const ids = [status.get('id')];
        if (replies) {
          replies.reverse().forEach(reply => {
            ids.unshift(reply);
          });
        }
      }
    });

        while (ids.length > 0) {
          let id        = ids.shift();
          const replies = state.getIn(['contexts', 'replies', id]);
    return descendantsIds;
  });

          if (status.get('id') !== id) {
            mutable.push(id);
          }
  const mapStateToProps = (state, props) => {
    const status = getStatus(state, { id: props.params.statusId });
    let ancestorsIds = Immutable.List();
    let descendantsIds = Immutable.List();

          if (replies) {
            replies.reverse().forEach(reply => {
              ids.unshift(reply);
            });
          }
        }
      });
    if (status) {
      ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
      descendantsIds = getDescendantsIds(state, { id: status.get('id') });
    }

    return {