Fix multiple bugs in notification requests and notification policies (#32062)

This commit is contained in:
Claire 2024-09-24 17:03:38 +02:00 committed by GitHub
parent cfb8fc6222
commit 0a6b75b71e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 18 additions and 39 deletions

View file

@ -17,6 +17,6 @@ export const updateNotificationsPolicy = createDataLoadingThunk(
(policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy), (policy: Partial<NotificationPolicy>) => apiUpdateNotificationsPolicy(policy),
); );
export const decreasePendingNotificationsCount = createAction<number>( export const decreasePendingRequestsCount = createAction<number>(
'notificationPolicy/decreasePendingNotificationCount', 'notificationPolicy/decreasePendingRequestsCount',
); );

View file

@ -13,11 +13,11 @@ import type {
ApiNotificationJSON, ApiNotificationJSON,
} from 'mastodon/api_types/notifications'; } from 'mastodon/api_types/notifications';
import type { ApiStatusJSON } from 'mastodon/api_types/statuses'; import type { ApiStatusJSON } from 'mastodon/api_types/statuses';
import type { AppDispatch, RootState } from 'mastodon/store'; import type { AppDispatch } from 'mastodon/store';
import { createDataLoadingThunk } from 'mastodon/store/typed_functions'; import { createDataLoadingThunk } from 'mastodon/store/typed_functions';
import { importFetchedAccounts, importFetchedStatuses } from './importer'; import { importFetchedAccounts, importFetchedStatuses } from './importer';
import { decreasePendingNotificationsCount } from './notification_policies'; import { decreasePendingRequestsCount } from './notification_policies';
// TODO: refactor with notification_groups // TODO: refactor with notification_groups
function dispatchAssociatedRecords( function dispatchAssociatedRecords(
@ -169,19 +169,11 @@ export const expandNotificationsForRequest = createDataLoadingThunk(
}, },
); );
const selectNotificationCountForRequest = (state: RootState, id: string) => {
const requests = state.notificationRequests.items;
const thisRequest = requests.find((request) => request.id === id);
return thisRequest ? thisRequest.notifications_count : 0;
};
export const acceptNotificationRequest = createDataLoadingThunk( export const acceptNotificationRequest = createDataLoadingThunk(
'notificationRequest/accept', 'notificationRequest/accept',
({ id }: { id: string }) => apiAcceptNotificationRequest(id), ({ id }: { id: string }) => apiAcceptNotificationRequest(id),
(_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => { (_data, { dispatch, discardLoadData }) => {
const count = selectNotificationCountForRequest(getState(), id); dispatch(decreasePendingRequestsCount(1));
dispatch(decreasePendingNotificationsCount(count));
// The payload is not used in any functions // The payload is not used in any functions
return discardLoadData; return discardLoadData;
@ -191,10 +183,8 @@ export const acceptNotificationRequest = createDataLoadingThunk(
export const dismissNotificationRequest = createDataLoadingThunk( export const dismissNotificationRequest = createDataLoadingThunk(
'notificationRequest/dismiss', 'notificationRequest/dismiss',
({ id }: { id: string }) => apiDismissNotificationRequest(id), ({ id }: { id: string }) => apiDismissNotificationRequest(id),
(_data, { dispatch, getState, discardLoadData, actionArg: { id } }) => { (_data, { dispatch, discardLoadData }) => {
const count = selectNotificationCountForRequest(getState(), id); dispatch(decreasePendingRequestsCount(1));
dispatch(decreasePendingNotificationsCount(count));
// The payload is not used in any functions // The payload is not used in any functions
return discardLoadData; return discardLoadData;
@ -204,13 +194,8 @@ export const dismissNotificationRequest = createDataLoadingThunk(
export const acceptNotificationRequests = createDataLoadingThunk( export const acceptNotificationRequests = createDataLoadingThunk(
'notificationRequests/acceptBulk', 'notificationRequests/acceptBulk',
({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids), ({ ids }: { ids: string[] }) => apiAcceptNotificationRequests(ids),
(_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => { (_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
const count = ids.reduce( dispatch(decreasePendingRequestsCount(ids.length));
(count, id) => count + selectNotificationCountForRequest(getState(), id),
0,
);
dispatch(decreasePendingNotificationsCount(count));
// The payload is not used in any functions // The payload is not used in any functions
return discardLoadData; return discardLoadData;
@ -220,13 +205,8 @@ export const acceptNotificationRequests = createDataLoadingThunk(
export const dismissNotificationRequests = createDataLoadingThunk( export const dismissNotificationRequests = createDataLoadingThunk(
'notificationRequests/dismissBulk', 'notificationRequests/dismissBulk',
({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids), ({ ids }: { ids: string[] }) => apiDismissNotificationRequests(ids),
(_data, { dispatch, getState, discardLoadData, actionArg: { ids } }) => { (_data, { dispatch, discardLoadData, actionArg: { ids } }) => {
const count = ids.reduce( dispatch(decreasePendingRequestsCount(ids.length));
(count, id) => count + selectNotificationCountForRequest(getState(), id),
0,
);
dispatch(decreasePendingNotificationsCount(count));
// The payload is not used in any functions // The payload is not used in any functions
return discardLoadData; return discardLoadData;

View file

@ -91,5 +91,5 @@ export const apiAcceptNotificationRequests = async (id: string[]) => {
}; };
export const apiDismissNotificationRequests = async (id: string[]) => { export const apiDismissNotificationRequests = async (id: string[]) => {
return apiRequestPost('v1/notifications/dismiss/dismiss', { id }); return apiRequestPost('v1/notifications/requests/dismiss', { id });
}; };

View file

@ -31,7 +31,7 @@ export const FilteredNotificationsIconButton: React.FC<{
history.push('/notifications/requests'); history.push('/notifications/requests');
}, [history]); }, [history]);
if (policy === null || policy.summary.pending_notifications_count === 0) { if (policy === null || policy.summary.pending_requests_count <= 0) {
return null; return null;
} }
@ -70,7 +70,7 @@ export const FilteredNotificationsBanner: React.FC = () => {
}; };
}, [dispatch]); }, [dispatch]);
if (policy === null || policy.summary.pending_notifications_count === 0) { if (policy === null || policy.summary.pending_requests_count <= 0) {
return null; return null;
} }

View file

@ -2,7 +2,7 @@ import { createReducer, isAnyOf } from '@reduxjs/toolkit';
import { import {
fetchNotificationPolicy, fetchNotificationPolicy,
decreasePendingNotificationsCount, decreasePendingRequestsCount,
updateNotificationsPolicy, updateNotificationsPolicy,
} from 'mastodon/actions/notification_policies'; } from 'mastodon/actions/notification_policies';
import type { NotificationPolicy } from 'mastodon/models/notification_policy'; import type { NotificationPolicy } from 'mastodon/models/notification_policy';
@ -10,10 +10,9 @@ import type { NotificationPolicy } from 'mastodon/models/notification_policy';
export const notificationPolicyReducer = export const notificationPolicyReducer =
createReducer<NotificationPolicy | null>(null, (builder) => { createReducer<NotificationPolicy | null>(null, (builder) => {
builder builder
.addCase(decreasePendingNotificationsCount, (state, action) => { .addCase(decreasePendingRequestsCount, (state, action) => {
if (state) { if (state) {
state.summary.pending_notifications_count -= action.payload; state.summary.pending_requests_count -= action.payload;
state.summary.pending_requests_count -= 1;
} }
}) })
.addMatcher( .addMatcher(