From 2dbf1b69d32fdbeb851d5d2da1734f450636cb27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Salavisa?= Date: Tue, 17 Mar 2026 14:33:45 +0000 Subject: [PATCH] fix(ui): prevent duplicate workflow on create (#438) --- .../app/settings/workspace/workspace-workflows-client.tsx | 6 ++---- apps/web/hooks/domains/settings/use-workflow-settings.ts | 7 ++++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/web/app/settings/workspace/workspace-workflows-client.tsx b/apps/web/app/settings/workspace/workspace-workflows-client.tsx index 6bb29b218a..c6a26c430a 100644 --- a/apps/web/app/settings/workspace/workspace-workflows-client.tsx +++ b/apps/web/app/settings/workspace/workspace-workflows-client.tsx @@ -51,7 +51,6 @@ type WorkflowActionsArgs = { workflowTemplates: WorkflowTemplate[]; setWorkflowItems: React.Dispatch>; setSavedWorkflowItems: React.Dispatch>; - router: ReturnType; }; function buildWorkflowSteps(workflow: Workflow, definitions: StepDefinition[]): WorkflowStep[] { @@ -157,7 +156,6 @@ function useWorkflowActions({ workflowTemplates, setWorkflowItems, setSavedWorkflowItems, - router, }: WorkflowActionsArgs) { const [isAddWorkflowDialogOpen, setIsAddWorkflowDialogOpen] = useState(false); const [newWorkflowName, setNewWorkflowName] = useState(""); @@ -209,7 +207,8 @@ function useWorkflowActions({ const handleWorkflowCreated = (tempId: string, created: Workflow) => { setWorkflowItems((prev) => prev.map((item) => (item.id === tempId ? created : item))); setSavedWorkflowItems((prev) => [{ ...created }, ...prev]); - router.refresh(); + // Note: No router.refresh() needed. Local state already has the correct workflow, + // and SSR will fetch fresh data on next navigation. }; const handleSaveWorkflow = async (workflowId: string) => { @@ -444,7 +443,6 @@ function useWorkspaceWorkflowsPage( workflowTemplates, setWorkflowItems, setSavedWorkflowItems, - router, }); const { isAddWorkflowDialogOpen, diff --git a/apps/web/hooks/domains/settings/use-workflow-settings.ts b/apps/web/hooks/domains/settings/use-workflow-settings.ts index e8690e6e5f..3347970709 100644 --- a/apps/web/hooks/domains/settings/use-workflow-settings.ts +++ b/apps/web/hooks/domains/settings/use-workflow-settings.ts @@ -55,8 +55,13 @@ export function useWorkflowSettings(initialWorkflows: Workflow[]) { const newFromStore = (prev: Workflow[]) => { const localIds = new Set(prev.map((w) => w.id)); + // Don't add workflows from store for workspaces where we have temp (pending create) workflows. + // This prevents race conditions where WS event arrives before the create API callback. + const tempWorkspaceIds = new Set( + prev.filter((w) => w.id.startsWith("temp-")).map((w) => w.workspace_id), + ); return storeWorkflows - .filter((sw) => !localIds.has(sw.id)) + .filter((sw) => !localIds.has(sw.id) && !tempWorkspaceIds.has(sw.workspaceId)) .map((sw) => storeItemToWorkflow(sw)); };