commit: 21c209636d12ea601379e7abd3d370ad0d22ea18
parent: 1f5792c83475aed785cdd8eb148aa4fdc53b5671
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Tue, 24 Jan 2017 13:04:12 +0100
Set isLoading false on timelines when request fails
Diffstat:
3 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/app/assets/javascripts/components/actions/timelines.jsx b/app/assets/javascripts/components/actions/timelines.jsx
@@ -63,6 +63,10 @@ export function refreshTimelineRequest(timeline, id, skipLoading) {
export function refreshTimeline(timeline, id = null) {
return function (dispatch, getState) {
+ if (getState().getIn(['timelines', timeline, 'isLoading'])) {
+ return;
+ }
+
const ids = getState().getIn(['timelines', timeline, 'items'], Immutable.List());
const newestId = ids.size > 0 ? ids.first() : null;
@@ -102,8 +106,9 @@ export function expandTimeline(timeline, id = null) {
return (dispatch, getState) => {
const lastId = getState().getIn(['timelines', timeline, 'items'], Immutable.List()).last();
- if (!lastId) {
+ if (!lastId || getState().getIn(['timelines', timeline, 'isLoading'])) {
// If timeline is empty, don't try to load older posts since there are none
+ // Also if already loading
return;
}
diff --git a/app/assets/javascripts/components/features/notifications/index.jsx b/app/assets/javascripts/components/features/notifications/index.jsx
@@ -62,6 +62,7 @@ const Notifications = React.createClass({
if (trackScroll) {
return (
<Column icon='bell' heading={intl.formatMessage(messages.title)}>
+ <ColumnSettingsContainer />
<ScrollContainer scrollKey='notifications'>
{scrollableArea}
</ScrollContainer>
diff --git a/app/assets/javascripts/components/reducers/timelines.jsx b/app/assets/javascripts/components/reducers/timelines.jsx
@@ -1,10 +1,12 @@
import {
TIMELINE_REFRESH_REQUEST,
TIMELINE_REFRESH_SUCCESS,
+ TIMELINE_REFRESH_FAIL,
TIMELINE_UPDATE,
TIMELINE_DELETE,
TIMELINE_EXPAND_SUCCESS,
TIMELINE_EXPAND_REQUEST,
+ TIMELINE_EXPAND_FAIL,
TIMELINE_SCROLL_TOP
} from '../actions/timelines';
import {
@@ -16,8 +18,10 @@ import {
import {
ACCOUNT_TIMELINE_FETCH_REQUEST,
ACCOUNT_TIMELINE_FETCH_SUCCESS,
+ ACCOUNT_TIMELINE_FETCH_FAIL,
ACCOUNT_TIMELINE_EXPAND_REQUEST,
ACCOUNT_TIMELINE_EXPAND_SUCCESS,
+ ACCOUNT_TIMELINE_EXPAND_FAIL,
ACCOUNT_BLOCK_SUCCESS
} from '../actions/accounts';
import {
@@ -232,31 +236,37 @@ const resetTimeline = (state, timeline, id) => {
export default function timelines(state = initialState, action) {
switch(action.type) {
- case TIMELINE_REFRESH_REQUEST:
- case TIMELINE_EXPAND_REQUEST:
- return resetTimeline(state, action.timeline, action.id);
- case TIMELINE_REFRESH_SUCCESS:
- return normalizeTimeline(state, action.timeline, Immutable.fromJS(action.statuses));
- case TIMELINE_EXPAND_SUCCESS:
- return appendNormalizedTimeline(state, action.timeline, Immutable.fromJS(action.statuses));
- case TIMELINE_UPDATE:
- return updateTimeline(state, action.timeline, Immutable.fromJS(action.status), action.references);
- case TIMELINE_DELETE:
- return deleteStatus(state, action.id, action.accountId, action.references, action.reblogOf);
- case CONTEXT_FETCH_SUCCESS:
- return normalizeContext(state, action.id, Immutable.fromJS(action.ancestors), Immutable.fromJS(action.descendants));
- case ACCOUNT_TIMELINE_FETCH_REQUEST:
- case ACCOUNT_TIMELINE_EXPAND_REQUEST:
- return state.updateIn(['accounts_timelines', action.id], Immutable.Map(), map => map.set('isLoading', true));
- case ACCOUNT_TIMELINE_FETCH_SUCCESS:
- return normalizeAccountTimeline(state, action.id, Immutable.fromJS(action.statuses), action.replace);
- case ACCOUNT_TIMELINE_EXPAND_SUCCESS:
- return appendNormalizedAccountTimeline(state, action.id, Immutable.fromJS(action.statuses));
- case ACCOUNT_BLOCK_SUCCESS:
- return filterTimelines(state, action.relationship, action.statuses);
- case TIMELINE_SCROLL_TOP:
- return state.setIn([action.timeline, 'top'], action.top);
- default:
- return state;
+ case TIMELINE_REFRESH_REQUEST:
+ case TIMELINE_EXPAND_REQUEST:
+ return resetTimeline(state, action.timeline, action.id);
+ case TIMELINE_REFRESH_FAIL:
+ case TIMELINE_EXPAND_FAIL:
+ return state.setIn([action.timeline, 'isLoading'], false);
+ case TIMELINE_REFRESH_SUCCESS:
+ return normalizeTimeline(state, action.timeline, Immutable.fromJS(action.statuses));
+ case TIMELINE_EXPAND_SUCCESS:
+ return appendNormalizedTimeline(state, action.timeline, Immutable.fromJS(action.statuses));
+ case TIMELINE_UPDATE:
+ return updateTimeline(state, action.timeline, Immutable.fromJS(action.status), action.references);
+ case TIMELINE_DELETE:
+ return deleteStatus(state, action.id, action.accountId, action.references, action.reblogOf);
+ case CONTEXT_FETCH_SUCCESS:
+ return normalizeContext(state, action.id, Immutable.fromJS(action.ancestors), Immutable.fromJS(action.descendants));
+ case ACCOUNT_TIMELINE_FETCH_REQUEST:
+ case ACCOUNT_TIMELINE_EXPAND_REQUEST:
+ return state.updateIn(['accounts_timelines', action.id], Immutable.Map(), map => map.set('isLoading', true));
+ case ACCOUNT_TIMELINE_FETCH_FAIL:
+ case ACCOUNT_TIMELINE_EXPAND_FAIL:
+ return state.updateIn(['accounts_timelines', action.id], Immutable.Map(), map => map.set('isLoading', false));
+ case ACCOUNT_TIMELINE_FETCH_SUCCESS:
+ return normalizeAccountTimeline(state, action.id, Immutable.fromJS(action.statuses), action.replace);
+ case ACCOUNT_TIMELINE_EXPAND_SUCCESS:
+ return appendNormalizedAccountTimeline(state, action.id, Immutable.fromJS(action.statuses));
+ case ACCOUNT_BLOCK_SUCCESS:
+ return filterTimelines(state, action.relationship, action.statuses);
+ case TIMELINE_SCROLL_TOP:
+ return state.setIn([action.timeline, 'top'], action.top);
+ default:
+ return state;
}
};