fix(channels): re-hydrate per-account manager state once the account is pinned
The provider tree mounts above <App>, which pins this tab's account only after /api/me resolves — so on a genuinely fresh tab (empty sessionStorage) the manager's sort, filters, view and layout initialised from an unknown account and stayed at defaults until a second reload. Make the active account reactive (a subscribable store + useActiveAccountId via useSyncExternalStore; setActiveAccount/clearActiveAccount notify) and re-read the stored value when the account transitions null→id, via a shared useAccountRehydrate hook. A markDirty guard (called by each owning setter) prevents clobbering a value the user changed in the brief pre-pin window; the effect is keyed on the account id only, so the user's own writes can't loop it. useSortState, useFilterState and ChannelsProvider (view/layout) all adopt it. Affects sort identically — this was a long-standing caveat, not new to R13.
This commit is contained in:
@@ -12,6 +12,9 @@ vi.mock("./storage", () => ({
|
||||
setAccountRaw: (k: string, v: string) => {
|
||||
store.set(k, v);
|
||||
},
|
||||
// A stable account id keeps useAccountRehydrate a no-op here (no null→id transition); the re-hydrate
|
||||
// path itself is covered in useAccountRehydrate.dom.test.ts.
|
||||
useActiveAccountId: () => 1,
|
||||
}));
|
||||
|
||||
import { useSortState } from "./useSortState";
|
||||
|
||||
Reference in New Issue
Block a user