diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index 348a34ae4..a7592a466 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -2188,10 +2188,9 @@ const WorkflowContent = React.memo(() => { selected: selectedIds.has(node.id), })) }) - }, [derivedNodes, blocks, pendingSelection, clearPendingSelection, syncPanelWithSelection]) + }, [derivedNodes, blocks, pendingSelection, clearPendingSelection]) // Phase 2: When displayNodes updates, check if pending zoom blocks are ready - // (Phase 1 is located earlier in the file where pendingZoomBlockIdsRef is defined) useEffect(() => { const pendingBlockIds = pendingZoomBlockIdsRef.current if (!pendingBlockIds || pendingBlockIds.size === 0) { diff --git a/apps/sim/stores/workflows/workflow/store.ts b/apps/sim/stores/workflows/workflow/store.ts index 98048c7ab..b4d74860f 100644 --- a/apps/sim/stores/workflows/workflow/store.ts +++ b/apps/sim/stores/workflows/workflow/store.ts @@ -615,7 +615,20 @@ export const useWorkflowStore = create()( options?: { updateLastSaved?: boolean } ) => { set((state) => { - const nextBlocks = workflowState.blocks || {} + const incomingBlocks = workflowState.blocks || {} + + const nextBlocks: typeof incomingBlocks = {} + for (const [id, block] of Object.entries(incomingBlocks)) { + if (block.data?.parentId && !incomingBlocks[block.data.parentId]) { + nextBlocks[id] = { + ...block, + data: { ...block.data, parentId: undefined, extent: undefined }, + } + } else { + nextBlocks[id] = block + } + } + const nextEdges = filterValidEdges(workflowState.edges || [], nextBlocks) const nextLoops = Object.keys(workflowState.loops || {}).length > 0