Skip to content

Commit df8836e

Browse files
committed
Delay workspace restore until settings load
1 parent b62b42f commit df8836e

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

src/App.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,7 @@ function MainApp() {
14661466
useWorkspaceRestore({
14671467
workspaces,
14681468
hasLoaded,
1469+
enabled: !appSettingsLoading,
14691470
connectWorkspace,
14701471
listThreadsForWorkspace
14711472
});

src/features/workspaces/hooks/useWorkspaceRestore.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,46 @@ describe("useWorkspaceRestore", () => {
136136
expect(listThreadsForWorkspace).toHaveBeenCalledTimes(1);
137137
expect(listThreadsForWorkspace).toHaveBeenCalledWith(workspace);
138138
});
139+
140+
it("waits until restore is enabled before reconnecting workspaces", async () => {
141+
const workspace = createWorkspace();
142+
const connectWorkspace = vi
143+
.fn<WorkspaceRestoreOptions["connectWorkspace"]>()
144+
.mockResolvedValue(undefined);
145+
const listThreadsForWorkspace = vi
146+
.fn<WorkspaceRestoreOptions["listThreadsForWorkspace"]>()
147+
.mockResolvedValue(undefined);
148+
149+
const { rerender } = renderHook(
150+
({ enabled }) =>
151+
useWorkspaceRestore({
152+
workspaces: [workspace],
153+
hasLoaded: true,
154+
enabled,
155+
connectWorkspace,
156+
listThreadsForWorkspace,
157+
}),
158+
{
159+
initialProps: { enabled: false },
160+
},
161+
);
162+
163+
await act(async () => {
164+
await flushMicrotasks();
165+
});
166+
167+
expect(connectWorkspace).not.toHaveBeenCalled();
168+
expect(listThreadsForWorkspace).not.toHaveBeenCalled();
169+
170+
rerender({ enabled: true });
171+
172+
await act(async () => {
173+
await flushMicrotasks();
174+
});
175+
176+
expect(connectWorkspace).toHaveBeenCalledTimes(1);
177+
expect(listThreadsForWorkspace).toHaveBeenCalledTimes(1);
178+
});
139179
});
140180

141181
type WorkspaceRestoreOptions = {

src/features/workspaces/hooks/useWorkspaceRestore.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const MAX_RESTORE_RETRIES = 5;
77
type WorkspaceRestoreOptions = {
88
workspaces: WorkspaceInfo[];
99
hasLoaded: boolean;
10+
enabled?: boolean;
1011
connectWorkspace: (workspace: WorkspaceInfo) => Promise<void>;
1112
listThreadsForWorkspace: (
1213
workspace: WorkspaceInfo,
@@ -17,6 +18,7 @@ type WorkspaceRestoreOptions = {
1718
export function useWorkspaceRestore({
1819
workspaces,
1920
hasLoaded,
21+
enabled = true,
2022
connectWorkspace,
2123
listThreadsForWorkspace,
2224
}: WorkspaceRestoreOptions) {
@@ -27,6 +29,7 @@ export function useWorkspaceRestore({
2729
const optionsRef = useRef({
2830
workspaces,
2931
hasLoaded,
32+
enabled,
3033
connectWorkspace,
3134
listThreadsForWorkspace,
3235
});
@@ -35,6 +38,7 @@ export function useWorkspaceRestore({
3538
optionsRef.current = {
3639
workspaces,
3740
hasLoaded,
41+
enabled,
3842
connectWorkspace,
3943
listThreadsForWorkspace,
4044
};
@@ -51,7 +55,7 @@ export function useWorkspaceRestore({
5155
);
5256

5357
useEffect(() => {
54-
if (!hasLoaded) {
58+
if (!hasLoaded || !enabled) {
5559
return;
5660
}
5761

@@ -83,10 +87,11 @@ export function useWorkspaceRestore({
8387
const {
8488
workspaces: latestWorkspaces,
8589
hasLoaded: latestHasLoaded,
90+
enabled: latestEnabled,
8691
connectWorkspace: latestConnectWorkspace,
8792
listThreadsForWorkspace: latestListThreadsForWorkspace,
8893
} = optionsRef.current;
89-
if (!latestHasLoaded) {
94+
if (!latestHasLoaded || !latestEnabled) {
9095
return;
9196
}
9297
const workspace = latestWorkspaces.find((entry) => entry.id === workspaceId);
@@ -136,5 +141,5 @@ export function useWorkspaceRestore({
136141
workspaces.forEach((workspace) => {
137142
restoreWorkspace(workspace.id);
138143
});
139-
}, [connectWorkspace, hasLoaded, listThreadsForWorkspace, workspaces]);
144+
}, [connectWorkspace, enabled, hasLoaded, listThreadsForWorkspace, workspaces]);
140145
}

0 commit comments

Comments
 (0)