From ddf0f6f994bebd20b29ccf8f578d63707d3de0d5 Mon Sep 17 00:00:00 2001 From: shrimbly Date: Sat, 21 Feb 2026 22:15:51 +1300 Subject: [PATCH] fix: pass array item index directly via edgeDataOverrides in auto-route Instead of mutating selectedOutputIndex N times in a loop (which races with React renders), pass { arrayItemIndex: index } as an edge data override through onConnect. Adds optional edgeDataOverrides parameter to onConnect and addEdgeWithType. Co-Authored-By: Claude Opus 4.6 --- src/components/nodes/ArrayNode.tsx | 24 ++++++++++++------------ src/store/workflowStore.ts | 12 ++++++------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/components/nodes/ArrayNode.tsx b/src/components/nodes/ArrayNode.tsx index 8e634ba2..8f591fa2 100644 --- a/src/components/nodes/ArrayNode.tsx +++ b/src/components/nodes/ArrayNode.tsx @@ -126,7 +126,6 @@ export function ArrayNode({ id, data, selected }: NodeProps) { const baseY = sourceNode.position.y; const promptHeight = 220; const verticalGap = 24; - const previousSelected = nodeData.selectedOutputIndex ?? null; items.forEach((item, index) => { const promptNodeId = addNode( @@ -135,18 +134,19 @@ export function ArrayNode({ id, data, selected }: NodeProps) { { prompt: item } ); - // Force each generated edge to bind to the matching array item index. - updateNodeData(id, { selectedOutputIndex: index }); - onConnect({ - source: id, - sourceHandle: "text", - target: promptNodeId, - targetHandle: "text", - }); + // Pass the array item index directly as an edge data override + // instead of mutating selectedOutputIndex in a loop. + onConnect( + { + source: id, + sourceHandle: "text", + target: promptNodeId, + targetHandle: "text", + }, + { arrayItemIndex: index } + ); }); - - updateNodeData(id, { selectedOutputIndex: previousSelected }); - }, [addNode, getNodes, id, nodeData.selectedOutputIndex, onConnect, previewItems, updateNodeData]); + }, [addNode, getNodes, id, onConnect, previewItems]); // Reset selection if it no longer points to a valid parsed item. useEffect(() => { diff --git a/src/store/workflowStore.ts b/src/store/workflowStore.ts index 3421958e..84b068aa 100644 --- a/src/store/workflowStore.ts +++ b/src/store/workflowStore.ts @@ -185,8 +185,8 @@ interface WorkflowStore { // Edge operations onEdgesChange: (changes: EdgeChange[]) => void; - onConnect: (connection: Connection) => void; - addEdgeWithType: (connection: Connection, edgeType: string) => void; + onConnect: (connection: Connection, edgeDataOverrides?: Record) => void; + addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record) => void; removeEdge: (edgeId: string) => void; toggleEdgePause: (edgeId: string) => void; @@ -532,7 +532,7 @@ export const useWorkflowStore = create((set, get) => ({ } }, - onConnect: (connection: Connection) => { + onConnect: (connection: Connection, edgeDataOverrides?: Record) => { set((state) => ({ edges: addEdge( (() => { @@ -540,7 +540,7 @@ export const useWorkflowStore = create((set, get) => ({ return { ...connection, id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`, - data: baseData, + data: edgeDataOverrides ? { ...baseData, ...edgeDataOverrides } : baseData, }; })(), state.edges @@ -550,7 +550,7 @@ export const useWorkflowStore = create((set, get) => ({ get().incrementManualChangeCount(); }, - addEdgeWithType: (connection: Connection, edgeType: string) => { + addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record) => { set((state) => ({ edges: addEdge( (() => { @@ -559,7 +559,7 @@ export const useWorkflowStore = create((set, get) => ({ ...connection, id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`, type: edgeType, - data: baseData, + data: edgeDataOverrides ? { ...baseData, ...edgeDataOverrides } : baseData, }; })(), state.edges