Memoize ancestorIds and descendantIds in detailed status view (#11234)
parent
3ce4cdd552
commit
eda4094171
|
@ -4,6 +4,7 @@ import { connect } from 'react-redux';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
import { fetchStatus } from '../../actions/statuses';
|
import { fetchStatus } from '../../actions/statuses';
|
||||||
import MissingIndicator from '../../components/missing_indicator';
|
import MissingIndicator from '../../components/missing_indicator';
|
||||||
import DetailedStatus from './components/detailed_status';
|
import DetailedStatus from './components/detailed_status';
|
||||||
|
@ -63,39 +64,58 @@ const messages = defineMessages({
|
||||||
const makeMapStateToProps = () => {
|
const makeMapStateToProps = () => {
|
||||||
const getStatus = makeGetStatus();
|
const getStatus = makeGetStatus();
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
while (ids.length > 0) {
|
||||||
|
let id = ids.shift();
|
||||||
|
const replies = contextReplies.get(id);
|
||||||
|
|
||||||
|
if (statusId !== id) {
|
||||||
|
mutable.push(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (replies) {
|
||||||
|
replies.reverse().forEach(reply => {
|
||||||
|
ids.unshift(reply);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return descendantsIds;
|
||||||
|
});
|
||||||
|
|
||||||
const mapStateToProps = (state, props) => {
|
const mapStateToProps = (state, props) => {
|
||||||
const status = getStatus(state, { id: props.params.statusId });
|
const status = getStatus(state, { id: props.params.statusId });
|
||||||
let ancestorsIds = Immutable.List();
|
let ancestorsIds = Immutable.List();
|
||||||
let descendantsIds = Immutable.List();
|
let descendantsIds = Immutable.List();
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
ancestorsIds = ancestorsIds.withMutations(mutable => {
|
ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });
|
||||||
let id = status.get('in_reply_to_id');
|
descendantsIds = getDescendantsIds(state, { id: status.get('id') });
|
||||||
|
|
||||||
while (id) {
|
|
||||||
mutable.unshift(id);
|
|
||||||
id = state.getIn(['contexts', 'inReplyTos', id]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
descendantsIds = descendantsIds.withMutations(mutable => {
|
|
||||||
const ids = [status.get('id')];
|
|
||||||
|
|
||||||
while (ids.length > 0) {
|
|
||||||
let id = ids.shift();
|
|
||||||
const replies = state.getIn(['contexts', 'replies', id]);
|
|
||||||
|
|
||||||
if (status.get('id') !== id) {
|
|
||||||
mutable.push(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (replies) {
|
|
||||||
replies.reverse().forEach(reply => {
|
|
||||||
ids.unshift(reply);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
Loading…
Reference in New Issue