diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2019-09-21 09:12:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-21 09:12:13 +0200 |
commit | ba0de8fb68f5e67312446d1ac351f06d093fc2b8 (patch) | |
tree | 1b7ba14373d38b49275887e5b613086e5cb5a14f /app/javascript/mastodon/reducers | |
parent | a90243a712ac17708de898e302e337de05b7699d (diff) |
Fix updates being hidden behind pending items on unmounted components (#11898)
Diffstat (limited to 'app/javascript/mastodon/reducers')
-rw-r--r-- | app/javascript/mastodon/reducers/notifications.js | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js index 45d3a5c51..aac644950 100644 --- a/app/javascript/mastodon/reducers/notifications.js +++ b/app/javascript/mastodon/reducers/notifications.js @@ -7,6 +7,8 @@ import { NOTIFICATIONS_CLEAR, NOTIFICATIONS_SCROLL_TOP, NOTIFICATIONS_LOAD_PENDING, + NOTIFICATIONS_MOUNT, + NOTIFICATIONS_UNMOUNT, } from '../actions/notifications'; import { ACCOUNT_BLOCK_SUCCESS, @@ -22,6 +24,7 @@ const initialState = ImmutableMap({ items: ImmutableList(), hasMore: true, top: false, + mounted: false, unread: 0, isLoading: false, }); @@ -35,9 +38,10 @@ const notificationToMap = notification => ImmutableMap({ }); const normalizeNotification = (state, notification, usePendingItems) => { - const top = state.get('top'); + const top = state.get('top'); + const mounted = state.get('mounted'); - if (usePendingItems || !top || !state.get('pendingItems').isEmpty()) { + if (usePendingItems || (!top && mounted) || !state.get('pendingItems').isEmpty()) { return state.update('pendingItems', list => list.unshift(notificationToMap(notification))).update('unread', unread => unread + 1); } @@ -63,7 +67,7 @@ const expandNormalizedNotifications = (state, notifications, next, isLoadingRece return state.withMutations(mutable => { if (!items.isEmpty()) { - usePendingItems = isLoadingRecent && (usePendingItems || !mutable.get('top') || !mutable.get('pendingItems').isEmpty()); + usePendingItems = isLoadingRecent && (usePendingItems || (!mutable.get('top') && mutable.get('mounted')) || !mutable.get('pendingItems').isEmpty()); mutable.update(usePendingItems ? 'pendingItems' : 'items', list => { const lastIndex = 1 + list.findLastIndex( @@ -134,6 +138,10 @@ export default function notifications(state = initialState, action) { return action.timeline === 'home' ? state.update(action.usePendingItems ? 'pendingItems' : 'items', items => items.first() ? items.unshift(null) : items) : state; + case NOTIFICATIONS_MOUNT: + return state.set('mounted', true); + case NOTIFICATIONS_UNMOUNT: + return state.set('mounted', false); default: return state; } |