- Shipped
- August 26, 2026 at 8:21 AM UTC
- Author
- kamo
- Commit
- 694503a
Review found the pane had dropped the old chats-list component's prefsLoaded gate: activeBucket started at initialBucket/DEFAULT_BUCKET and was handed to useConversationRows on the very first render, while the saved-preference GET resolved separately and uncoordinated. A member with a saved preference got a fetch for the wrong bucket, a visible wrong-tab flash, then a second fetch once the GET resolved -- and the switcher column mounts on every maximize, not once per page load, so it flashed constantly. useConversationRows gains a fourth `enabled` argument (default true) that suppresses both the initial/bucket-change load and the observer-driven pagination while false. The pane now holds it at its own `prefsLoaded` state, flipped true in the same batched update that (when a value was saved) corrects `activeBucket` -- so the hook is never invoked enabled with any bucket other than the one actually resolved. Cases 6a/6b now assert that property across every recorded call rather than just the last one, which is the exact blind spot that let the flash ship the first time. Also: the multi-field search match **************** externalPhoneNumber, on top of member names/connectionTitle) had no coverage at all despite being an explicit requirement -- it was correct on inspection, now it is pinned down, for both input paths (searchQuery prop and the pane's own showSearch field). And handleNewAiChat gains a re-entrancy guard: a fast double-click landed both events before either POST resolved, creating two sessions and opening two windows from one intended click.