From c6f993b6104cdda0fea5ab4284c272c1ebc67d8e Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:23:56 +0100 Subject: [PATCH] fix(base): only re-seed column state when view identity changes --- .../src/features/base/hooks/use-base-table.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/apps/client/src/features/base/hooks/use-base-table.ts b/apps/client/src/features/base/hooks/use-base-table.ts index 8038c713..ed443ff5 100644 --- a/apps/client/src/features/base/hooks/use-base-table.ts +++ b/apps/client/src/features/base/hooks/use-base-table.ts @@ -258,13 +258,21 @@ export function useBaseTable( const [columnOrder, setColumnOrder] = useState(derivedColumnOrder); const [columnVisibility, setColumnVisibility] = useState(derivedColumnVisibility); + // Re-seed from server only when the user switches views. Within the same + // view, local state is the source of truth — the debounced persist flushes + // it. Without this guard, any ws-driven `invalidateQueries(["bases", baseId])` + // or concurrent view mutation lands a new `derivedColumnVisibility` + // reference and the effect would overwrite a pending hide/reorder toggle + // before `persistViewConfig` has a chance to flush it. + const lastSyncedViewIdRef = useRef(activeView?.id); useEffect(() => { - setColumnOrder(derivedColumnOrder); - }, [derivedColumnOrder]); - - useEffect(() => { - setColumnVisibility(derivedColumnVisibility); - }, [derivedColumnVisibility]); + const currentViewId = activeView?.id; + if (currentViewId !== lastSyncedViewIdRef.current) { + lastSyncedViewIdRef.current = currentViewId; + setColumnOrder(derivedColumnOrder); + setColumnVisibility(derivedColumnVisibility); + } + }, [activeView?.id, derivedColumnOrder, derivedColumnVisibility]); const columnPinning = useMemo( () => buildColumnPinning(properties),