diff --git a/web/src/hooks/useRealtime.ts b/web/src/hooks/useRealtime.ts index 34cc326..120a555 100644 --- a/web/src/hooks/useRealtime.ts +++ b/web/src/hooks/useRealtime.ts @@ -42,6 +42,7 @@ export function useRealtime() { ws.onopen = () => { reconnectAttemptsRef.current = 0; + void useChatStore.getState().loadChats(); }; ws.onmessage = (messageEvent) => { @@ -60,17 +61,18 @@ export function useRealtime() { if (!Number.isFinite(chatId) || !message?.id) { return; } + let wasInserted = false; if (clientMessageId && message.sender_id === authStore.me?.id) { chatStore.confirmMessageByClientId(chatId, clientMessageId, message); } else { - chatStore.prependMessage(chatId, message); + wasInserted = chatStore.prependMessage(chatId, message); } if (message.sender_id !== authStore.me?.id) { ws.send(JSON.stringify({ event: "message_delivered", payload: { chat_id: chatId, message_id: message.id } })); if (chatId === chatStore.activeChatId) { ws.send(JSON.stringify({ event: "message_read", payload: { chat_id: chatId, message_id: message.id } })); chatStore.clearUnread(chatId); - } else { + } else if (wasInserted) { chatStore.incrementUnread(chatId); } } diff --git a/web/src/store/chatStore.ts b/web/src/store/chatStore.ts index 49ed688..7ac738a 100644 --- a/web/src/store/chatStore.ts +++ b/web/src/store/chatStore.ts @@ -12,7 +12,7 @@ interface ChatState { loadChats: (query?: string) => Promise; setActiveChatId: (chatId: number | null) => void; loadMessages: (chatId: number) => Promise; - prependMessage: (chatId: number, message: Message) => void; + prependMessage: (chatId: number, message: Message) => boolean; addOptimisticMessage: (params: { chatId: number; senderId: number; @@ -70,11 +70,12 @@ export const useChatStore = create((set, get) => ({ prependMessage: (chatId, message) => { const old = get().messagesByChat[chatId] ?? []; if (old.some((m) => m.id === message.id || (message.client_message_id && m.client_message_id === message.client_message_id))) { - return; + return false; } set((state) => ({ messagesByChat: { ...state.messagesByChat, [chatId]: [...old, message] } })); + return true; }, addOptimisticMessage: ({ chatId, senderId, type, text, clientMessageId }) => { const old = get().messagesByChat[chatId] ?? [];