Keep track of unread notifications when the notification column isn't mounted
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
import {
|
||||
NOTIFICATIONS_MOUNT,
|
||||
NOTIFICATIONS_UNMOUNT,
|
||||
NOTIFICATIONS_UPDATE,
|
||||
NOTIFICATIONS_EXPAND_SUCCESS,
|
||||
NOTIFICATIONS_EXPAND_REQUEST,
|
||||
@@ -24,6 +26,7 @@ const initialState = ImmutableMap({
|
||||
items: ImmutableList(),
|
||||
hasMore: true,
|
||||
top: true,
|
||||
mounted: 0,
|
||||
unread: 0,
|
||||
lastReadId: '0',
|
||||
isLoading: false,
|
||||
@@ -41,7 +44,7 @@ const notificationToMap = (state, notification) => ImmutableMap({
|
||||
});
|
||||
|
||||
const normalizeNotification = (state, notification) => {
|
||||
const top = state.get('top');
|
||||
const top = state.get('top') && state.get('mounted') > 0;
|
||||
|
||||
if (top) {
|
||||
state = state.set('lastReadId', notification.id);
|
||||
@@ -59,7 +62,7 @@ const normalizeNotification = (state, notification) => {
|
||||
};
|
||||
|
||||
const expandNormalizedNotifications = (state, notifications, next) => {
|
||||
const top = state.get('top');
|
||||
const top = state.get('top') && state.get('mounted') > 0;
|
||||
const lastReadId = state.get('lastReadId');
|
||||
let items = ImmutableList();
|
||||
|
||||
@@ -102,18 +105,23 @@ const filterNotifications = (state, relationship) => {
|
||||
return state.update('items', list => list.filterNot(item => item !== null && item.get('account') === relationship.id));
|
||||
};
|
||||
|
||||
const clearUnread = (state) => {
|
||||
state = state.set('unread', 0);
|
||||
const lastNotification = state.get('items').find(item => item !== null);
|
||||
return state.set('lastReadId', lastNotification ? lastNotification.get('id') : '0');
|
||||
}
|
||||
|
||||
const updateTop = (state, top) => {
|
||||
if (top) {
|
||||
state = state.set('unread', 0);
|
||||
const lastNotification = state.get('items').find(item => item !== null);
|
||||
state = state.set('lastReadId', lastNotification ? lastNotification.get('id') : '0');
|
||||
if (top && state.get('mounted') > 0) {
|
||||
state = clearUnread(state);
|
||||
}
|
||||
|
||||
return state.set('top', top);
|
||||
};
|
||||
|
||||
const deleteByStatus = (state, statusId) => {
|
||||
if (!state.get('top')) {
|
||||
const top = state.get('top') && state.get('mounted') > 0;
|
||||
if (!top) {
|
||||
const lastReadId = state.get('lastReadId');
|
||||
const deletedUnread = state.get('items').filter(item => item !== null && item.get('status') === statusId && compareId(item.get('id'), lastReadId) > 0);
|
||||
state = state.update('unread', unread => unread - deletedUnread.size);
|
||||
@@ -153,6 +161,10 @@ export default function notifications(state = initialState, action) {
|
||||
let st;
|
||||
|
||||
switch(action.type) {
|
||||
case NOTIFICATIONS_MOUNT:
|
||||
return (state.get('top') ? clearUnread(state) : state).update('mounted', count => count + 1);
|
||||
case NOTIFICATIONS_UNMOUNT:
|
||||
return state.update('mounted', count => count - 1);
|
||||
case NOTIFICATIONS_EXPAND_REQUEST:
|
||||
case NOTIFICATIONS_DELETE_MARKED_REQUEST:
|
||||
return state.set('isLoading', true);
|
||||
|
Reference in New Issue
Block a user