Keep track of unread notifications when the notification column isn't mounted

This commit is contained in:
Thibaut Girka
2018-09-06 15:47:13 +02:00
committed by ThibG
parent 711826cb37
commit c8875b4d8a
3 changed files with 58 additions and 7 deletions

View File

@@ -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);