From 8996771ff48c99463bf0e3d99f194a7b14cf8440 Mon Sep 17 00:00:00 2001 From: shad Date: Sun, 14 Jun 2026 19:42:59 +0400 Subject: [PATCH] revert(app): cold-start chat seed (it regressed idle-poll budget) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The seedHeadsIfMissing path I added fired N listMessages calls on first refresh after auth, blowing idle-poll budget (landing went to 11 reqs at 30s). Reverting to the prior behavior: - Topbar Chat badge shows real unread when localStorage heads are populated (i.e. after the user has visited Chat at least once) - Cold-start (fresh browser / cleared storage) the badge shows 0 until Chat is opened — same accepted caveat Oracle named on sha-c3515707 and PASS'd Idle-poll budget protected; Wizard 'Manual review' label change from prior commit stays. --- src/App.tsx | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 21f5e5c..4ba0359 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -102,28 +102,6 @@ export default function App() { } return n; }; - // Cold-start: if localStorage heads map is empty/stale (fresh browser, - // private window, cleared site data), fetch the last message per thread - // ONCE on first mount so the badge isn't lying. Subsequent ticks reuse the - // localStorage cache — same idle-poll budget as before. - const seedHeadsIfMissing = async (threads: { _key: string }[]) => { - try { - const existing = JSON.parse(localStorage.getItem(`fm.canvas.chat.heads.${userEmail}`) || "{}"); - if (Object.keys(existing).length >= threads.length) return; - } catch { /* fall through */ } - const { chatApi } = await import("./lib/chatApi"); - const heads: Record = {}; - await Promise.all( - threads.map(async (t) => { - try { - const rows = await chatApi.listMessages(t._key); - const last = rows[rows.length - 1]; - if (last) heads[t._key] = { at: last.created_at, by: last.author_email }; - } catch { /* ignore */ } - }) - ); - try { localStorage.setItem(`fm.canvas.chat.heads.${userEmail}`, JSON.stringify(heads)); } catch { /* ignore */ } - }; const refresh = async () => { try { const { chatApi } = await import("./lib/chatApi"); @@ -133,8 +111,6 @@ export default function App() { apiMod.workItems().catch(() => []), ]); if (cancelled) return; - await seedHeadsIfMissing(threads); - if (cancelled) return; setChatUnreadCount(computeUnread(threads.map((t) => t._key))); setQueueCount(items.filter((it) => (it as any).tenant_id === tenantId).length); } catch { /* ignore */ }