diff --git a/desktop/src/sections/messages/Conversation.tsx b/desktop/src/sections/messages/Conversation.tsx index bf1c8c5..455dd38 100644 --- a/desktop/src/sections/messages/Conversation.tsx +++ b/desktop/src/sections/messages/Conversation.tsx @@ -16,10 +16,18 @@ import { sendEnvelope, resolveRecipientKeys } from '@/lib/relay'; import { appendMessage as persist } from '@/lib/storage'; import type { Message } from '@/lib/types'; +// A module-level stable reference for "no messages yet". Without this the +// selector `s.messages[address] ?? []` allocates a fresh empty array on +// every render when the conversation has no cached entries, which zustand +// sees as a changed value → triggers another render → new empty array +// again → "Maximum update depth exceeded". Returning the exact same +// reference every time breaks the cycle. +const EMPTY_MESSAGES: Message[] = []; + export function Conversation({ address }: { address: string }): React.ReactElement { const keyFile = useStore(s => s.keyFile); const contact = useStore(s => s.contacts.find(c => c.address === address)); - const messages = useStore(s => s.messages[address] ?? []); + const messages = useStore(s => s.messages[address] ?? EMPTY_MESSAGES); const clearUnread = useStore(s => s.clearUnread); const appendMsg = useStore(s => s.appendMessage);