Skip to content

Commit 943c3d2

Browse files
committed
🤖 fix: expose setWorkspaceMetadata from WorkspaceContext
App.tsx needs to optimistically update workspace metadata when creating/forking workspaces to avoid race condition with validation effect. WorkspaceContext now: - Exposes setWorkspaceMetadata to allow App.tsx to update metadata immediately - Updates metadata map immediately in createWorkspace before returning - Passes through setWorkspaceMetadata in AppLoader instead of no-op This ensures metadata is available when setSelectedWorkspace is called, preventing the validation effect from clearing the selection before the async subscription fires.
1 parent 1b9a1b5 commit 943c3d2

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/components/AppLoader.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,7 @@ function AppLoaderInner(props: {
164164
addProject={props.addProject}
165165
removeProject={props.removeProject}
166166
workspaceMetadata={workspaceContext.workspaceMetadata}
167-
setWorkspaceMetadata={() => {
168-
/* no-op now since WorkspaceContext handles it */
169-
}}
167+
setWorkspaceMetadata={workspaceContext.setWorkspaceMetadata}
170168
createWorkspace={workspaceContext.createWorkspace}
171169
removeWorkspace={workspaceContext.removeWorkspace}
172170
renameWorkspace={workspaceContext.renameWorkspace}

src/contexts/WorkspaceContext.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ export interface WorkspaceContext {
5353
newName: string
5454
) => Promise<{ success: boolean; error?: string }>;
5555
refreshWorkspaceMetadata: () => Promise<void>;
56+
setWorkspaceMetadata: React.Dispatch<
57+
React.SetStateAction<Map<string, FrontendWorkspaceMetadata>>
58+
>;
5659

5760
// Selection
5861
selectedWorkspace: WorkspaceSelection | null;
@@ -173,8 +176,13 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
173176
const loadedProjects = new Map<string, ProjectConfig>(projectsList);
174177
props.onProjectsUpdate(loadedProjects);
175178

176-
// Reload workspace metadata to get the new workspace ID
177-
await loadWorkspaceMetadata();
179+
// Update metadata immediately to avoid race condition with validation effect
180+
ensureCreatedAt(result.metadata);
181+
setWorkspaceMetadata((prev) => {
182+
const updated = new Map(prev);
183+
updated.set(result.metadata.id, result.metadata);
184+
return updated;
185+
});
178186

179187
// Return the new workspace selection
180188
return {
@@ -187,7 +195,7 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
187195
throw new Error(result.error);
188196
}
189197
},
190-
[loadWorkspaceMetadata, props]
198+
[props]
191199
);
192200

193201
const removeWorkspace = useCallback(
@@ -298,6 +306,7 @@ export function WorkspaceProvider(props: WorkspaceProviderProps) {
298306
removeWorkspace,
299307
renameWorkspace,
300308
refreshWorkspaceMetadata,
309+
setWorkspaceMetadata,
301310
selectedWorkspace: props.selectedWorkspace,
302311
setSelectedWorkspace: props.onSelectedWorkspaceUpdate,
303312
pendingNewWorkspaceProject,

0 commit comments

Comments
 (0)