Fix duplicate notifications in notification groups when using slow mode

Fixes #32993
This commit is contained in:
Claire 2024-11-21 11:05:39 +01:00
parent 7fc6ce0959
commit 1009459760
2 changed files with 15 additions and 4 deletions

View file

@ -17,6 +17,7 @@ export const NOTIFICATIONS_GROUP_MAX_AVATARS = 8;
interface BaseNotificationGroup interface BaseNotificationGroup
extends Omit<BaseNotificationGroupJSON, 'sample_account_ids'> { extends Omit<BaseNotificationGroupJSON, 'sample_account_ids'> {
sampleAccountIds: string[]; sampleAccountIds: string[];
partial: boolean;
} }
interface BaseNotificationWithStatus<Type extends NotificationWithStatusType> interface BaseNotificationWithStatus<Type extends NotificationWithStatusType>
@ -142,6 +143,7 @@ export function createNotificationGroupFromJSON(
return { return {
statusId: statusId ?? undefined, statusId: statusId ?? undefined,
sampleAccountIds, sampleAccountIds,
partial: false,
...groupWithoutStatus, ...groupWithoutStatus,
}; };
} }
@ -150,12 +152,14 @@ export function createNotificationGroupFromJSON(
return { return {
report: createReportFromJSON(report), report: createReportFromJSON(report),
sampleAccountIds, sampleAccountIds,
partial: false,
...groupWithoutTargetAccount, ...groupWithoutTargetAccount,
}; };
} }
case 'severed_relationships': case 'severed_relationships':
return { return {
...group, ...group,
partial: false,
event: createAccountRelationshipSeveranceEventFromJSON(group.event), event: createAccountRelationshipSeveranceEventFromJSON(group.event),
sampleAccountIds, sampleAccountIds,
}; };
@ -163,6 +167,7 @@ export function createNotificationGroupFromJSON(
const { moderation_warning, ...groupWithoutModerationWarning } = group; const { moderation_warning, ...groupWithoutModerationWarning } = group;
return { return {
...groupWithoutModerationWarning, ...groupWithoutModerationWarning,
partial: false,
moderationWarning: createAccountWarningFromJSON(moderation_warning), moderationWarning: createAccountWarningFromJSON(moderation_warning),
sampleAccountIds, sampleAccountIds,
}; };
@ -171,6 +176,7 @@ export function createNotificationGroupFromJSON(
const { annual_report, ...groupWithoutAnnualReport } = group; const { annual_report, ...groupWithoutAnnualReport } = group;
return { return {
...groupWithoutAnnualReport, ...groupWithoutAnnualReport,
partial: false,
annualReport: createAnnualReportEventFromJSON(annual_report), annualReport: createAnnualReportEventFromJSON(annual_report),
sampleAccountIds, sampleAccountIds,
}; };
@ -178,6 +184,7 @@ export function createNotificationGroupFromJSON(
default: default:
return { return {
sampleAccountIds, sampleAccountIds,
partial: false,
...group, ...group,
}; };
} }
@ -194,6 +201,7 @@ export function createNotificationGroupFromNotificationJSON(
page_min_id: notification.id, page_min_id: notification.id,
page_max_id: notification.id, page_max_id: notification.id,
latest_page_notification_at: notification.created_at, latest_page_notification_at: notification.created_at,
partial: true,
}; };
switch (notification.type) { switch (notification.type) {

View file

@ -534,10 +534,13 @@ export const notificationGroupsReducer = createReducer<NotificationGroupsState>(
if (existingGroupIndex > -1) { if (existingGroupIndex > -1) {
const existingGroup = state.groups[existingGroupIndex]; const existingGroup = state.groups[existingGroupIndex];
if (existingGroup && existingGroup.type !== 'gap') { if (existingGroup && existingGroup.type !== 'gap') {
group.notifications_count += existingGroup.notifications_count; if (group.partial) {
group.sampleAccountIds = group.sampleAccountIds group.notifications_count +=
.concat(existingGroup.sampleAccountIds) existingGroup.notifications_count;
.slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS); group.sampleAccountIds = group.sampleAccountIds
.concat(existingGroup.sampleAccountIds)
.slice(0, NOTIFICATIONS_GROUP_MAX_AVATARS);
}
state.groups.splice(existingGroupIndex, 1); state.groups.splice(existingGroupIndex, 1);
} }
} }