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 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<ArrayNodeType>) {
{ 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(() => {

12
src/store/workflowStore.ts

@ -185,8 +185,8 @@ interface WorkflowStore {
// Edge operations
onEdgesChange: (changes: EdgeChange<WorkflowEdge>[]) => void;
onConnect: (connection: Connection) => void;
addEdgeWithType: (connection: Connection, edgeType: string) => void;
onConnect: (connection: Connection, edgeDataOverrides?: Record<string, unknown>) => void;
addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record<string, unknown>) => void;
removeEdge: (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) => ({
edges: addEdge(
(() => {
@ -540,7 +540,7 @@ export const useWorkflowStore = create<WorkflowStore>((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<WorkflowStore>((set, get) => ({
get().incrementManualChangeCount();
},
addEdgeWithType: (connection: Connection, edgeType: string) => {
addEdgeWithType: (connection: Connection, edgeType: string, edgeDataOverrides?: Record<string, unknown>) => {
set((state) => ({
edges: addEdge(
(() => {
@ -559,7 +559,7 @@ export const useWorkflowStore = create<WorkflowStore>((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

Loading…
Cancel
Save