Count unread notifications when window loses focus

This commit is contained in:
Thibaut Girka
2018-09-06 17:47:33 +02:00
committed by ThibG
parent c8875b4d8a
commit d315f1dc02
3 changed files with 65 additions and 6 deletions

View File

@ -1,6 +1,7 @@
import {
NOTIFICATIONS_MOUNT,
NOTIFICATIONS_UNMOUNT,
NOTIFICATIONS_SET_VISIBILITY,
NOTIFICATIONS_UPDATE,
NOTIFICATIONS_EXPAND_SUCCESS,
NOTIFICATIONS_EXPAND_REQUEST,
@ -31,6 +32,7 @@ const initialState = ImmutableMap({
lastReadId: '0',
isLoading: false,
cleaningMode: false,
isTabVisible: true,
// notification removal mark of new notifs loaded whilst cleaningMode is true.
markNewForDelete: false,
});
@ -44,7 +46,7 @@ const notificationToMap = (state, notification) => ImmutableMap({
});
const normalizeNotification = (state, notification) => {
const top = state.get('top') && state.get('mounted') > 0;
const top = !shouldCountUnreadNotifications(state);
if (top) {
state = state.set('lastReadId', notification.id);
@ -62,7 +64,7 @@ const normalizeNotification = (state, notification) => {
};
const expandNormalizedNotifications = (state, notifications, next) => {
const top = state.get('top') && state.get('mounted') > 0;
const top = !(shouldCountUnreadNotifications(state));
const lastReadId = state.get('lastReadId');
let items = ImmutableList();
@ -112,7 +114,9 @@ const clearUnread = (state) => {
}
const updateTop = (state, top) => {
if (top && state.get('mounted') > 0) {
state = state.set('top', top);
if (!shouldCountUnreadNotifications(state)) {
state = clearUnread(state);
}
@ -120,7 +124,7 @@ const updateTop = (state, top) => {
};
const deleteByStatus = (state, statusId) => {
const top = state.get('top') && state.get('mounted') > 0;
const top = !(shouldCountUnreadNotifications(state));
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);
@ -157,14 +161,36 @@ const deleteMarkedNotifs = (state) => {
return state.update('items', list => list.filterNot(item => item.get('markedForDelete')));
};
const updateMounted = (state) => {
state = state.update('mounted', count => count + 1);
if (!shouldCountUnreadNotifications(state)) {
state = clearUnread(state);
}
return state;
};
const updateVisibility = (state, visibility) => {
state = state.set('isTabVisible', visibility);
if (!shouldCountUnreadNotifications(state)) {
state = clearUnread(state);
}
return state;
};
const shouldCountUnreadNotifications = (state) => {
return !(state.get('isTabVisible') && state.get('top') && state.get('mounted') > 0);
};
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);
return updateMounted(state);
case NOTIFICATIONS_UNMOUNT:
return state.update('mounted', count => count - 1);
case NOTIFICATIONS_SET_VISIBILITY:
return updateVisibility(state, action.visibility);
case NOTIFICATIONS_EXPAND_REQUEST:
case NOTIFICATIONS_DELETE_MARKED_REQUEST:
return state.set('isLoading', true);