From d585fabb7ad6b0eb3fbb18f75e6eed8158b965a1 Mon Sep 17 00:00:00 2001 From: wmq Date: Mon, 3 Aug 2026 01:50:43 +0800 Subject: [PATCH] fix(inbox): guard realtime cache updates during reload --- src/pages/inbox/InboxPage.tsx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/pages/inbox/InboxPage.tsx b/src/pages/inbox/InboxPage.tsx index fd404d2..1eda7bc 100644 --- a/src/pages/inbox/InboxPage.tsx +++ b/src/pages/inbox/InboxPage.tsx @@ -94,7 +94,7 @@ function updateRealtimeConversationList( conversationId: string, patch: Partial, ) { - if (!current) return current + if (!current || !Array.isArray(current.list)) return current let matched = false const list = current.list.map((item) => { if (item.id !== conversationId) return item @@ -255,10 +255,14 @@ export function InboxPage() { queryClient.setQueryData(['conversation', convId], (current: any) => current ? { ...current, conversation: { ...current.conversation, ...conversation } } : current) - queryClient.setQueriesData({ queryKey: ['conversations'] }, (current: any) => current ? { - ...current, - list: current.list.map((item: any) => item.id === convId ? { ...item, unreadCount: 0 } : item), - } : current) + queryClient.setQueriesData({ queryKey: ['conversations'] }, (current: any) => ( + current && Array.isArray(current.list) + ? { + ...current, + list: current.list.map((item: any) => item.id === convId ? { ...item, unreadCount: 0 } : item), + } + : current + )) }) .catch(() => undefined) }, [convId, lastMessageId, queryClient]) @@ -305,7 +309,7 @@ export function InboxPage() { queryClient.removeQueries({ queryKey: ['messages', event.conversationId] }) queryClient.setQueriesData<{ list: ConversationListItem[]; total: number }>( { queryKey: ['conversations'] }, - (current) => current + (current) => current && Array.isArray(current.list) ? { ...current, list: current.list.filter((item) => item.id !== event.conversationId), @@ -326,7 +330,8 @@ export function InboxPage() { ) const conversationWasVisible = Boolean( event.conversationId - && activeConversationCache?.list.some((item) => item.id === event.conversationId), + && Array.isArray(activeConversationCache?.list) + && activeConversationCache.list.some((item) => item.id === event.conversationId), ) if ( ['message.created', 'message.received'].includes(event.type || '') && @@ -356,7 +361,9 @@ export function InboxPage() { { queryKey: ['conversations'] }, (current) => { const typed = current as { list: ConversationListItem[]; total: number } | undefined - const item = typed?.list.find((entry) => entry.id === event.conversationId) + const item = Array.isArray(typed?.list) + ? typed.list.find((entry) => entry.id === event.conversationId) + : undefined const isNewMessage = ['message.created', 'message.received'].includes(event.type || '') const isCurrentLastMessage = String(item?.lastMessage?.id || '') === String(event.message?.id || '')