~cytrogen/masto-fe

47c30be8d810fd6d5d27285a097d01843f4dd9f6 — ThibG 6 years ago 894d82a
[Glitch] Memoize ancestorIds and descendantIds in detailed status view

Port 99924f282f53593e670c70a38450a1c0e2d24c20 to glitch-soc
1 files changed, 44 insertions(+), 24 deletions(-)

M app/javascript/flavours/glitch/features/status/index.js
M app/javascript/flavours/glitch/features/status/index.js => app/javascript/flavours/glitch/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 'flavours/glitch/actions/statuses';
import MissingIndicator from 'flavours/glitch/components/missing_indicator';
import DetailedStatus from './components/detailed_status';


@@ 61,39 62,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 {