Browse Source

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 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 5 months ago
parent
commit
ddf0f6f994
  1. 24
      src/components/nodes/ArrayNode.tsx
  2. 12
      src/store/workflowStore.ts

24
src/components/nodes/ArrayNode.tsx

@ -126,7 +126,6 @@ export function ArrayNode({ id, data, selected }: NodeProps<ArrayNodeType>) {
const baseY = sourceNode.position.y; const baseY = sourceNode.position.y;
const promptHeight = 220; const promptHeight = 220;
const verticalGap = 24; const verticalGap = 24;
const previousSelected = nodeData.selectedOutputIndex ?? null;
items.forEach((item, index) => { items.forEach((item, index) => {
const promptNodeId = addNode( const promptNodeId = addNode(
@ -135,18 +134,19 @@ export function ArrayNode({ id, data, selected }: NodeProps<ArrayNodeType>) {
{ prompt: item } { prompt: item }
); );
// Force each generated edge to bind to the matching array item index. // Pass the array item index directly as an edge data override
updateNodeData(id, { selectedOutputIndex: index }); // instead of mutating selectedOutputIndex in a loop.
onConnect({ onConnect(
source: id, {
sourceHandle: "text", source: id,
target: promptNodeId, sourceHandle: "text",
targetHandle: "text", target: promptNodeId,
}); targetHandle: "text",
},
{ arrayItemIndex: index }
);
}); });
}, [addNode, getNodes, id, onConnect, previewItems]);
updateNodeData(id, { selectedOutputIndex: previousSelected });
}, [addNode, getNodes, id, nodeData.selectedOutputIndex, onConnect, previewItems, updateNodeData]);
// Reset selection if it no longer points to a valid parsed item. // Reset selection if it no longer points to a valid parsed item.
useEffect(() => { useEffect(() => {

12
src/store/workflowStore.ts

@ -185,8 +185,8 @@ interface WorkflowStore {
// Edge operations // Edge operations
onEdgesChange: (changes: EdgeChange<WorkflowEdge>[]) => void; onEdgesChange: (changes: EdgeChange<WorkflowEdge>[]) => void;
onConnect: (connection: Connection) => void; onConnect: (connection: Connection, edgeDataOverrides?: Record<string, unknown>) => void;
addEdgeWithType: (connection: Connection, edgeType: string) => void; addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record<string, unknown>) => void;
removeEdge: (edgeId: string) => void; removeEdge: (edgeId: string) => void;
toggleEdgePause: (edgeId: string) => void; toggleEdgePause: (edgeId: string) => void;
@ -532,7 +532,7 @@ export const useWorkflowStore = create<WorkflowStore>((set, get) => ({
} }
}, },
onConnect: (connection: Connection) => { onConnect: (connection: Connection, edgeDataOverrides?: Record<string, unknown>) => {
set((state) => ({ set((state) => ({
edges: addEdge( edges: addEdge(
(() => { (() => {
@ -540,7 +540,7 @@ export const useWorkflowStore = create<WorkflowStore>((set, get) => ({
return { return {
...connection, ...connection,
id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`, id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`,
data: baseData, data: edgeDataOverrides ? { ...baseData, ...edgeDataOverrides } : baseData,
}; };
})(), })(),
state.edges state.edges
@ -550,7 +550,7 @@ export const useWorkflowStore = create<WorkflowStore>((set, get) => ({
get().incrementManualChangeCount(); get().incrementManualChangeCount();
}, },
addEdgeWithType: (connection: Connection, edgeType: string) => { addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record<string, unknown>) => {
set((state) => ({ set((state) => ({
edges: addEdge( edges: addEdge(
(() => { (() => {
@ -559,7 +559,7 @@ export const useWorkflowStore = create<WorkflowStore>((set, get) => ({
...connection, ...connection,
id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`, id: `edge-${connection.source}-${connection.target}-${connection.sourceHandle || "default"}-${connection.targetHandle || "default"}`,
type: edgeType, type: edgeType,
data: baseData, data: edgeDataOverrides ? { ...baseData, ...edgeDataOverrides } : baseData,
}; };
})(), })(),
state.edges state.edges

Loading…
Cancel
Save