From df8836e540a15d393128cc04d8c08c133e4e8a69 Mon Sep 17 00:00:00 2001 From: jacobjmc Date: Sun, 8 Mar 2026 18:58:19 +1100 Subject: [PATCH] Delay workspace restore until settings load --- src/App.tsx | 1 + .../hooks/useWorkspaceRestore.test.tsx | 40 +++++++++++++++++++ .../workspaces/hooks/useWorkspaceRestore.ts | 11 +++-- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 49a894a..8408e9b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1466,6 +1466,7 @@ function MainApp() { useWorkspaceRestore({ workspaces, hasLoaded, + enabled: !appSettingsLoading, connectWorkspace, listThreadsForWorkspace }); diff --git a/src/features/workspaces/hooks/useWorkspaceRestore.test.tsx b/src/features/workspaces/hooks/useWorkspaceRestore.test.tsx index dfa5c8d..1e744f2 100644 --- a/src/features/workspaces/hooks/useWorkspaceRestore.test.tsx +++ b/src/features/workspaces/hooks/useWorkspaceRestore.test.tsx @@ -136,6 +136,46 @@ describe("useWorkspaceRestore", () => { expect(listThreadsForWorkspace).toHaveBeenCalledTimes(1); expect(listThreadsForWorkspace).toHaveBeenCalledWith(workspace); }); + + it("waits until restore is enabled before reconnecting workspaces", async () => { + const workspace = createWorkspace(); + const connectWorkspace = vi + .fn() + .mockResolvedValue(undefined); + const listThreadsForWorkspace = vi + .fn() + .mockResolvedValue(undefined); + + const { rerender } = renderHook( + ({ enabled }) => + useWorkspaceRestore({ + workspaces: [workspace], + hasLoaded: true, + enabled, + connectWorkspace, + listThreadsForWorkspace, + }), + { + initialProps: { enabled: false }, + }, + ); + + await act(async () => { + await flushMicrotasks(); + }); + + expect(connectWorkspace).not.toHaveBeenCalled(); + expect(listThreadsForWorkspace).not.toHaveBeenCalled(); + + rerender({ enabled: true }); + + await act(async () => { + await flushMicrotasks(); + }); + + expect(connectWorkspace).toHaveBeenCalledTimes(1); + expect(listThreadsForWorkspace).toHaveBeenCalledTimes(1); + }); }); type WorkspaceRestoreOptions = { diff --git a/src/features/workspaces/hooks/useWorkspaceRestore.ts b/src/features/workspaces/hooks/useWorkspaceRestore.ts index 39e5041..b3f1b77 100644 --- a/src/features/workspaces/hooks/useWorkspaceRestore.ts +++ b/src/features/workspaces/hooks/useWorkspaceRestore.ts @@ -7,6 +7,7 @@ const MAX_RESTORE_RETRIES = 5; type WorkspaceRestoreOptions = { workspaces: WorkspaceInfo[]; hasLoaded: boolean; + enabled?: boolean; connectWorkspace: (workspace: WorkspaceInfo) => Promise; listThreadsForWorkspace: ( workspace: WorkspaceInfo, @@ -17,6 +18,7 @@ type WorkspaceRestoreOptions = { export function useWorkspaceRestore({ workspaces, hasLoaded, + enabled = true, connectWorkspace, listThreadsForWorkspace, }: WorkspaceRestoreOptions) { @@ -27,6 +29,7 @@ export function useWorkspaceRestore({ const optionsRef = useRef({ workspaces, hasLoaded, + enabled, connectWorkspace, listThreadsForWorkspace, }); @@ -35,6 +38,7 @@ export function useWorkspaceRestore({ optionsRef.current = { workspaces, hasLoaded, + enabled, connectWorkspace, listThreadsForWorkspace, }; @@ -51,7 +55,7 @@ export function useWorkspaceRestore({ ); useEffect(() => { - if (!hasLoaded) { + if (!hasLoaded || !enabled) { return; } @@ -83,10 +87,11 @@ export function useWorkspaceRestore({ const { workspaces: latestWorkspaces, hasLoaded: latestHasLoaded, + enabled: latestEnabled, connectWorkspace: latestConnectWorkspace, listThreadsForWorkspace: latestListThreadsForWorkspace, } = optionsRef.current; - if (!latestHasLoaded) { + if (!latestHasLoaded || !latestEnabled) { return; } const workspace = latestWorkspaces.find((entry) => entry.id === workspaceId); @@ -136,5 +141,5 @@ export function useWorkspaceRestore({ workspaces.forEach((workspace) => { restoreWorkspace(workspace.id); }); - }, [connectWorkspace, hasLoaded, listThreadsForWorkspace, workspaces]); + }, [connectWorkspace, enabled, hasLoaded, listThreadsForWorkspace, workspaces]); }