fix(inbox): guard realtime cache updates during reload

This commit is contained in:
wmq
2026-08-03 01:50:43 +08:00
parent 48d719e520
commit d585fabb7a
+13 -6
View File
@@ -94,7 +94,7 @@ function updateRealtimeConversationList(
conversationId: string, conversationId: string,
patch: Partial<ConversationListItem>, patch: Partial<ConversationListItem>,
) { ) {
if (!current) return current if (!current || !Array.isArray(current.list)) return current
let matched = false let matched = false
const list = current.list.map((item) => { const list = current.list.map((item) => {
if (item.id !== conversationId) return item if (item.id !== conversationId) return item
@@ -255,10 +255,14 @@ export function InboxPage() {
queryClient.setQueryData(['conversation', convId], (current: any) => current queryClient.setQueryData(['conversation', convId], (current: any) => current
? { ...current, conversation: { ...current.conversation, ...conversation } } ? { ...current, conversation: { ...current.conversation, ...conversation } }
: current) : current)
queryClient.setQueriesData<any>({ queryKey: ['conversations'] }, (current: any) => current ? { queryClient.setQueriesData<any>({ queryKey: ['conversations'] }, (current: any) => (
current && Array.isArray(current.list)
? {
...current, ...current,
list: current.list.map((item: any) => item.id === convId ? { ...item, unreadCount: 0 } : item), list: current.list.map((item: any) => item.id === convId ? { ...item, unreadCount: 0 } : item),
} : current) }
: current
))
}) })
.catch(() => undefined) .catch(() => undefined)
}, [convId, lastMessageId, queryClient]) }, [convId, lastMessageId, queryClient])
@@ -305,7 +309,7 @@ export function InboxPage() {
queryClient.removeQueries({ queryKey: ['messages', event.conversationId] }) queryClient.removeQueries({ queryKey: ['messages', event.conversationId] })
queryClient.setQueriesData<{ list: ConversationListItem[]; total: number }>( queryClient.setQueriesData<{ list: ConversationListItem[]; total: number }>(
{ queryKey: ['conversations'] }, { queryKey: ['conversations'] },
(current) => current (current) => current && Array.isArray(current.list)
? { ? {
...current, ...current,
list: current.list.filter((item) => item.id !== event.conversationId), list: current.list.filter((item) => item.id !== event.conversationId),
@@ -326,7 +330,8 @@ export function InboxPage() {
) )
const conversationWasVisible = Boolean( const conversationWasVisible = Boolean(
event.conversationId event.conversationId
&& activeConversationCache?.list.some((item) => item.id === event.conversationId), && Array.isArray(activeConversationCache?.list)
&& activeConversationCache.list.some((item) => item.id === event.conversationId),
) )
if ( if (
['message.created', 'message.received'].includes(event.type || '') && ['message.created', 'message.received'].includes(event.type || '') &&
@@ -356,7 +361,9 @@ export function InboxPage() {
{ queryKey: ['conversations'] }, { queryKey: ['conversations'] },
(current) => { (current) => {
const typed = current as { list: ConversationListItem[]; total: number } | undefined 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 isNewMessage = ['message.created', 'message.received'].includes(event.type || '')
const isCurrentLastMessage = const isCurrentLastMessage =
String(item?.lastMessage?.id || '') === String(event.message?.id || '') String(item?.lastMessage?.id || '') === String(event.message?.id || '')