export function fetchFavouritedStatuses() {
return (dispatch, getState) => {
+ if (getState().getIn(['status_lists', 'favourites', 'isLoading'])) {
+ return;
+ }
+
dispatch(fetchFavouritedStatusesRequest());
api(getState).get('/api/v1/favourites').then(response => {
return (dispatch, getState) => {
const url = getState().getIn(['status_lists', 'favourites', 'next'], null);
- if (url === null) {
+ if (url === null || getState().getIn(['status_lists', 'favourites', 'isLoading'])) {
return;
}
import StatusList from '../../components/status_list';
import { defineMessages, injectIntl } from 'react-intl';
import ImmutablePureComponent from 'react-immutable-pure-component';
+import { debounce } from 'lodash';
const messages = defineMessages({
heading: { id: 'column.favourites', defaultMessage: 'Favourites' },
const mapStateToProps = state => ({
statusIds: state.getIn(['status_lists', 'favourites', 'items']),
+ isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true),
hasMore: !!state.getIn(['status_lists', 'favourites', 'next']),
});
columnId: PropTypes.string,
multiColumn: PropTypes.bool,
hasMore: PropTypes.bool,
+ isLoading: PropTypes.bool,
};
componentWillMount () {
this.column = c;
}
- handleScrollToBottom = () => {
+ handleScrollToBottom = debounce(() => {
this.props.dispatch(expandFavouritedStatuses());
- }
+ }, 300, { leading: true })
render () {
- const { intl, statusIds, columnId, multiColumn, hasMore } = this.props;
+ const { intl, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;
const pinned = !!columnId;
return (
statusIds={statusIds}
scrollKey={`favourited_statuses-${columnId}`}
hasMore={hasMore}
+ isLoading={isLoading}
onScrollToBottom={this.handleScrollToBottom}
/>
</Column>
import {
+ FAVOURITED_STATUSES_FETCH_REQUEST,
FAVOURITED_STATUSES_FETCH_SUCCESS,
+ FAVOURITED_STATUSES_FETCH_FAIL,
+ FAVOURITED_STATUSES_EXPAND_REQUEST,
FAVOURITED_STATUSES_EXPAND_SUCCESS,
+ FAVOURITED_STATUSES_EXPAND_FAIL,
} from '../actions/favourites';
import {
PINNED_STATUSES_FETCH_SUCCESS,
return state.update(listType, listMap => listMap.withMutations(map => {
map.set('next', next);
map.set('loaded', true);
+ map.set('isLoading', false);
map.set('items', ImmutableList(statuses.map(item => item.id)));
}));
};
const appendToList = (state, listType, statuses, next) => {
return state.update(listType, listMap => listMap.withMutations(map => {
map.set('next', next);
+ map.set('isLoading', false);
map.set('items', map.get('items').concat(statuses.map(item => item.id)));
}));
};
export default function statusLists(state = initialState, action) {
switch(action.type) {
+ case FAVOURITED_STATUSES_FETCH_REQUEST:
+ case FAVOURITED_STATUSES_EXPAND_REQUEST:
+ return state.setIn(['favourites', 'isLoading'], true);
+ case FAVOURITED_STATUSES_FETCH_FAIL:
+ case FAVOURITED_STATUSES_EXPAND_FAIL:
+ return state.setIn(['favourites', 'isLoading'], false);
case FAVOURITED_STATUSES_FETCH_SUCCESS:
return normalizeList(state, 'favourites', action.statuses, action.next);
case FAVOURITED_STATUSES_EXPAND_SUCCESS: