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';
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 {