mirror of
https://github.com/Luchexx/wacrm.git
synced 2026-11-02 17:29:45 +00:00
Addresses #106 (issue stays open until the reporter confirms in prod). #105's `let foundInList = false; setState(p => { foundInList = ...; ... })` pattern is broken: setState updaters run during reconciliation, *after* the synchronous handler returns, so `foundInList` reads `false` in the same tick and `hydrateConversation()` fires on every code path the flag was meant to gate. Every incoming message and every conversation UPDATE (read receipts, status flips, agent assignment) triggered a redundant DB fetch, queuing HTTP behind realtime WS frames on the same supabase client and starving the channel — which surfaced as exactly what #106 reports: messages that never arrive, threads stuck on "No messages yet", events landing out of order. The fix: 1. Synchronous known-IDs ref. `knownConvIdsRef` mirrors the conv ids currently in state, kept in sync via a useEffect on `conversations`. Event handlers check it synchronously to decide between a cheap in-place patch and a hydrate refetch — no more closure-flag pattern. 2. Reconnect + visibility resync. Realtime is best-effort: events sent while the WS was disconnected or while the tab was background-throttled are gone. A `resyncToken` state bumped on (a) `isConnected` false→true transitions after the initial connect and (b) tab visibility → visible drives `ConversationList` and `MessageThread` to refire their fetch effects. The reactions effect in MessageThread is split into fetch + channel-subscribe so a resync only refetches the rows without tearing down and rebuilding the realtime channel. 3. Keep the conv-INSERT hydrate. Still the right fix for #104 (realtime payloads never carry the `contact` join); now it only fires when the conversation is genuinely unknown to state. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| automations | ||
| broadcasts | ||
| contacts | ||
| dashboard | ||
| inbox | ||
| pipelines | ||
| settings | ||
| dashboard-shell.tsx | ||
| layout.tsx | ||