mirror of https://github.com/tootsuite/mastodon
Fix unsupported grouped notifications from streaming causing duplicate IDs (#32243)
parent
463f9197d8
commit
77f5b127fa
|
@ -206,50 +206,53 @@ function processNewNotification(
|
||||||
groups: NotificationGroupsState['groups'],
|
groups: NotificationGroupsState['groups'],
|
||||||
notification: ApiNotificationJSON,
|
notification: ApiNotificationJSON,
|
||||||
) {
|
) {
|
||||||
if (shouldGroupNotificationType(notification.type)) {
|
if (!shouldGroupNotificationType(notification.type)) {
|
||||||
const existingGroupIndex = groups.findIndex(
|
notification = {
|
||||||
(group) =>
|
...notification,
|
||||||
group.type !== 'gap' && group.group_key === notification.group_key,
|
group_key: `ungrouped-${notification.id}`,
|
||||||
);
|
};
|
||||||
|
|
||||||
// In any case, we are going to add a group at the top
|
|
||||||
// If there is currently a gap at the top, now is the time to update it
|
|
||||||
if (groups.length > 0 && groups[0]?.type === 'gap') {
|
|
||||||
groups[0].maxId = notification.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existingGroupIndex > -1) {
|
|
||||||
const existingGroup = groups[existingGroupIndex];
|
|
||||||
|
|
||||||
if (
|
|
||||||
existingGroup &&
|
|
||||||
existingGroup.type !== 'gap' &&
|
|
||||||
!existingGroup.sampleAccountIds.includes(notification.account.id) // This can happen for example if you like, then unlike, then like again the same post
|
|
||||||
) {
|
|
||||||
// Update the existing group
|
|
||||||
if (
|
|
||||||
existingGroup.sampleAccountIds.unshift(notification.account.id) >
|
|
||||||
NOTIFICATIONS_GROUP_MAX_AVATARS
|
|
||||||
)
|
|
||||||
existingGroup.sampleAccountIds.pop();
|
|
||||||
|
|
||||||
existingGroup.most_recent_notification_id = notification.id;
|
|
||||||
existingGroup.page_max_id = notification.id;
|
|
||||||
existingGroup.latest_page_notification_at = notification.created_at;
|
|
||||||
existingGroup.notifications_count += 1;
|
|
||||||
|
|
||||||
groups.splice(existingGroupIndex, 1);
|
|
||||||
mergeGapsAround(groups, existingGroupIndex);
|
|
||||||
|
|
||||||
groups.unshift(existingGroup);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have not found an existing group, create a new one
|
const existingGroupIndex = groups.findIndex(
|
||||||
groups.unshift(createNotificationGroupFromNotificationJSON(notification));
|
(group) =>
|
||||||
|
group.type !== 'gap' && group.group_key === notification.group_key,
|
||||||
|
);
|
||||||
|
|
||||||
|
// In any case, we are going to add a group at the top
|
||||||
|
// If there is currently a gap at the top, now is the time to update it
|
||||||
|
if (groups.length > 0 && groups[0]?.type === 'gap') {
|
||||||
|
groups[0].maxId = notification.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingGroupIndex > -1) {
|
||||||
|
const existingGroup = groups[existingGroupIndex];
|
||||||
|
|
||||||
|
if (
|
||||||
|
existingGroup &&
|
||||||
|
existingGroup.type !== 'gap' &&
|
||||||
|
!existingGroup.sampleAccountIds.includes(notification.account.id) // This can happen for example if you like, then unlike, then like again the same post
|
||||||
|
) {
|
||||||
|
// Update the existing group
|
||||||
|
if (
|
||||||
|
existingGroup.sampleAccountIds.unshift(notification.account.id) >
|
||||||
|
NOTIFICATIONS_GROUP_MAX_AVATARS
|
||||||
|
)
|
||||||
|
existingGroup.sampleAccountIds.pop();
|
||||||
|
|
||||||
|
existingGroup.most_recent_notification_id = notification.id;
|
||||||
|
existingGroup.page_max_id = notification.id;
|
||||||
|
existingGroup.latest_page_notification_at = notification.created_at;
|
||||||
|
existingGroup.notifications_count += 1;
|
||||||
|
|
||||||
|
groups.splice(existingGroupIndex, 1);
|
||||||
|
mergeGapsAround(groups, existingGroupIndex);
|
||||||
|
|
||||||
|
groups.unshift(existingGroup);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// We have not found an existing group, create a new one
|
||||||
|
groups.unshift(createNotificationGroupFromNotificationJSON(notification));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function trimNotifications(state: NotificationGroupsState) {
|
function trimNotifications(state: NotificationGroupsState) {
|
||||||
|
|
Loading…
Reference in New Issue