diff --git a/app/javascript/mastodon/actions/notification_policies.ts b/app/javascript/mastodon/actions/notification_policies.ts index fcc9919c49..b182bcf699 100644 --- a/app/javascript/mastodon/actions/notification_policies.ts +++ b/app/javascript/mastodon/actions/notification_policies.ts @@ -1,3 +1,5 @@ +import { createAction } from '@reduxjs/toolkit'; + import { apiGetNotificationPolicy, apiUpdateNotificationsPolicy, @@ -14,3 +16,7 @@ export const updateNotificationsPolicy = createDataLoadingThunk( 'notificationPolicy/update', (policy: Partial) => apiUpdateNotificationsPolicy(policy), ); + +export const decreasePendingNotificationsCount = createAction( + 'notificationPolicy/decreasePendingNotificationCount', +); diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 7e4320c27b..48afb003ad 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -18,6 +18,7 @@ import { importFetchedStatuses, } from './importer'; import { submitMarkers } from './markers'; +import { decreasePendingNotificationsCount } from './notification_policies'; import { notificationsUpdate } from "./notifications_typed"; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; @@ -84,6 +85,12 @@ const fetchRelatedRelationships = (dispatch, notifications) => { } }; +const selectNotificationCountForRequest = (state, id) => { + const requests = state.getIn(['notificationRequests', 'items']); + const thisRequest = requests.find(request => request.get('id') === id); + return thisRequest ? thisRequest.get('notifications_count') : 0; +}; + export const loadPending = () => ({ type: NOTIFICATIONS_LOAD_PENDING, }); @@ -433,11 +440,13 @@ export const fetchNotificationRequestFail = (id, error) => ({ error, }); -export const acceptNotificationRequest = id => (dispatch) => { +export const acceptNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(acceptNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/accept`).then(() => { dispatch(acceptNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(acceptNotificationRequestFail(id, err)); }); @@ -459,11 +468,13 @@ export const acceptNotificationRequestFail = (id, error) => ({ error, }); -export const dismissNotificationRequest = id => (dispatch) => { +export const dismissNotificationRequest = (id) => (dispatch, getState) => { + const count = selectNotificationCountForRequest(getState(), id); dispatch(dismissNotificationRequestRequest(id)); api().post(`/api/v1/notifications/requests/${id}/dismiss`).then(() =>{ dispatch(dismissNotificationRequestSuccess(id)); + dispatch(decreasePendingNotificationsCount(count)); }).catch(err => { dispatch(dismissNotificationRequestFail(id, err)); }); diff --git a/app/javascript/mastodon/reducers/notification_policy.ts b/app/javascript/mastodon/reducers/notification_policy.ts index ab111066cc..ed912dde5d 100644 --- a/app/javascript/mastodon/reducers/notification_policy.ts +++ b/app/javascript/mastodon/reducers/notification_policy.ts @@ -2,17 +2,25 @@ import { createReducer, isAnyOf } from '@reduxjs/toolkit'; import { fetchNotificationPolicy, + decreasePendingNotificationsCount, updateNotificationsPolicy, } from 'mastodon/actions/notification_policies'; import type { NotificationPolicy } from 'mastodon/models/notification_policy'; export const notificationPolicyReducer = createReducer(null, (builder) => { - builder.addMatcher( - isAnyOf( - fetchNotificationPolicy.fulfilled, - updateNotificationsPolicy.fulfilled, - ), - (_state, action) => action.payload, - ); + builder + .addCase(decreasePendingNotificationsCount, (state, action) => { + if (state) { + state.summary.pending_notifications_count -= action.payload; + state.summary.pending_requests_count -= 1; + } + }) + .addMatcher( + isAnyOf( + fetchNotificationPolicy.fulfilled, + updateNotificationsPolicy.fulfilled, + ), + (_state, action) => action.payload, + ); });