From 0d85a79f19fef0c604e8fecfd5dfa9654adc4b95 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 14 Aug 2024 08:47:15 +0200 Subject: [PATCH] Fix notification screen crashing in rare cases where the status no longer exists (#31403) --- app/javascript/mastodon/actions/notification_groups.ts | 4 ++-- app/javascript/mastodon/api_types/notifications.ts | 4 ++-- .../notifications_v2/components/notification_mention.tsx | 6 +++++- .../components/notification_with_status.tsx | 4 +++- app/javascript/mastodon/models/notification_group.ts | 6 +++--- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/app/javascript/mastodon/actions/notification_groups.ts b/app/javascript/mastodon/actions/notification_groups.ts index ab62f8715c4..fd6a48e9f37 100644 --- a/app/javascript/mastodon/actions/notification_groups.ts +++ b/app/javascript/mastodon/actions/notification_groups.ts @@ -47,7 +47,7 @@ function dispatchAssociatedRecords( fetchedAccounts.push(notification.moderation_warning.target_account); } - if ('status' in notification) { + if ('status' in notification && notification.status) { fetchedStatuses.push(notification.status); } }); @@ -119,7 +119,7 @@ export const processNewNotificationForGroups = createAppAsyncThunk( if ( (notification.type === 'mention' || notification.type === 'update') && - notification.status.filtered + notification.status?.filtered ) { const filters = notification.status.filtered.filter((result) => result.filter.context.includes('notifications'), diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index ed73ceda6b3..4ab9a4c90a7 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -60,12 +60,12 @@ export interface BaseNotificationGroupJSON { interface NotificationGroupWithStatusJSON extends BaseNotificationGroupJSON { type: NotificationWithStatusType; - status_id: string; + status_id: string | null; } interface NotificationWithStatusJSON extends BaseNotificationJSON { type: NotificationWithStatusType; - status: ApiStatusJSON; + status: ApiStatusJSON | null; } interface ReportNotificationGroupJSON extends BaseNotificationGroupJSON { diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx index b7cd995118a..1929446bb22 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx @@ -37,7 +37,11 @@ export const NotificationMention: React.FC<{ unread: boolean; }> = ({ notification, unread }) => { const [isDirect, isReply] = useAppSelector((state) => { - const status = state.statuses.get(notification.statusId) as Status; + const status = state.statuses.get(notification.statusId) as + | Status + | undefined; + + if (!status) return [false, false] as const; return [ status.get('visibility') === 'direct', diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx index c7dd9f6be2e..5d5cb98185b 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_with_status.tsx @@ -23,7 +23,7 @@ export const NotificationWithStatus: React.FC<{ icon: IconProp; iconId: string; accountIds: string[]; - statusId: string; + statusId: string | undefined; count: number; labelRenderer: LabelRenderer; unread: boolean; @@ -76,6 +76,8 @@ export const NotificationWithStatus: React.FC<{ [dispatch, statusId], ); + if (!statusId) return null; + return (
extends BaseNotificationGroup { type: Type; - statusId: string; + statusId: string | undefined; } interface BaseNotification @@ -126,7 +126,7 @@ export function createNotificationGroupFromJSON( case 'update': { const { status_id: statusId, ...groupWithoutStatus } = group; return { - statusId, + statusId: statusId ?? undefined, sampleAccountIds, ...groupWithoutStatus, }; @@ -183,7 +183,7 @@ export function createNotificationGroupFromNotificationJSON( case 'mention': case 'poll': case 'update': - return { ...group, statusId: notification.status.id }; + return { ...group, statusId: notification.status?.id }; case 'admin.report': return { ...group, report: createReportFromJSON(notification.report) }; case 'severed_relationships':