123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- import { createSelector } from '@reduxjs/toolkit';
- import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
- import { connect } from 'react-redux';
- import { debounce } from 'lodash';
- import { scrollTopTimeline, loadPending } from '../../../actions/timelines';
- import StatusList from '../../../components/status_list';
- import { me } from '../../../initial_state';
- const makeGetStatusIds = (pending = false) => createSelector([
- (state, { type }) => state.getIn(['settings', type], ImmutableMap()),
- (state, { type }) => state.getIn(['timelines', type, pending ? 'pendingItems' : 'items'], ImmutableList()),
- (state) => state.get('statuses'),
- ], (columnSettings, statusIds, statuses) => {
- return statusIds.filter(id => {
- if (id === null || id === 'inline-follow-suggestions') return true;
- const statusForId = statuses.get(id);
- let showStatus = true;
- if (statusForId.get('account') === me) return true;
- if (columnSettings.getIn(['shows', 'reblog']) === false) {
- showStatus = showStatus && statusForId.get('reblog') === null;
- }
- if (columnSettings.getIn(['shows', 'reply']) === false) {
- showStatus = showStatus && (statusForId.get('in_reply_to_id') === null || statusForId.get('in_reply_to_account_id') === me);
- }
- return showStatus;
- });
- });
- const makeMapStateToProps = () => {
- const getStatusIds = makeGetStatusIds();
- const getPendingStatusIds = makeGetStatusIds(true);
- const mapStateToProps = (state, { timelineId }) => ({
- statusIds: getStatusIds(state, { type: timelineId }),
- lastId: state.getIn(['timelines', timelineId, 'items'])?.last(),
- isLoading: state.getIn(['timelines', timelineId, 'isLoading'], true),
- isPartial: state.getIn(['timelines', timelineId, 'isPartial'], false),
- hasMore: state.getIn(['timelines', timelineId, 'hasMore']),
- numPending: getPendingStatusIds(state, { type: timelineId }).size,
- });
- return mapStateToProps;
- };
- const mapDispatchToProps = (dispatch, { timelineId }) => ({
- onScrollToTop: debounce(() => {
- dispatch(scrollTopTimeline(timelineId, true));
- }, 100),
- onScroll: debounce(() => {
- dispatch(scrollTopTimeline(timelineId, false));
- }, 100),
- onLoadPending: () => dispatch(loadPending(timelineId)),
- });
- export default connect(makeMapStateToProps, mapDispatchToProps)(StatusList);
|