Skip to content

Commit 8396c6f

Browse files
committed
Migrate Legacy NodeId Utilities to NodeManager
1 parent 5d08de1 commit 8396c6f

22 files changed

+509
-385
lines changed

src/components/Editor/IOEditor/InputValueEditor/InputValueEditor.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import { Icon } from "@/components/ui/icon";
99
import { BlockStack } from "@/components/ui/layout";
1010
import { Heading, Paragraph } from "@/components/ui/typography";
1111
import useConfirmationDialog from "@/hooks/useConfirmationDialog";
12+
import { useNodeManager } from "@/hooks/useNodeManager";
1213
import { useNodeSelectionTransfer } from "@/hooks/useNodeSelectionTransfer";
1314
import useToastNotification from "@/hooks/useToastNotification";
1415
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
1516
import { useContextPanel } from "@/providers/ContextPanelProvider";
1617
import { type InputSpec } from "@/utils/componentSpec";
1718
import { checkInputConnectionToRequiredFields } from "@/utils/inputConnectionUtils";
18-
import { inputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
19+
import { inputNameToInputId } from "@/utils/nodes/conversions";
1920

2021
import { NameField, TextField, TypeField } from "./FormFields/FormFields";
2122
import { checkNameCollision } from "./FormFields/utils";
@@ -30,6 +31,16 @@ export const InputValueEditor = ({
3031
input,
3132
disabled = false,
3233
}: InputValueEditorProps) => {
34+
const { getInputNodeId } = useNodeManager();
35+
36+
const inputNameToNodeId = useCallback(
37+
(inputName: string): string => {
38+
const inputId = inputNameToInputId(inputName);
39+
return getInputNodeId(inputId);
40+
},
41+
[getInputNodeId],
42+
);
43+
3344
const notify = useToastNotification();
3445
const { transferSelection } = useNodeSelectionTransfer(inputNameToNodeId);
3546
const { componentSpec, setComponentSpec } = useComponentSpec();

src/components/Editor/IOEditor/OutputNameEditor/OutputNameEditor.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import { Icon } from "@/components/ui/icon";
77
import { BlockStack, InlineStack } from "@/components/ui/layout";
88
import { Heading, Paragraph } from "@/components/ui/typography";
99
import useConfirmationDialog from "@/hooks/useConfirmationDialog";
10+
import { useNodeManager } from "@/hooks/useNodeManager";
1011
import { useNodeSelectionTransfer } from "@/hooks/useNodeSelectionTransfer";
1112
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
1213
import { useContextPanel } from "@/providers/ContextPanelProvider";
1314
import { type OutputSpec } from "@/utils/componentSpec";
14-
import { outputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
1515

1616
import { type OutputConnectedDetails } from "../../utils/getOutputConnectedDetails";
1717
import { updateOutputNameOnComponentSpec } from "../../utils/updateOutputNameOnComponentSpec";
@@ -29,6 +29,16 @@ export const OutputNameEditor = ({
2929
disabled,
3030
connectedDetails,
3131
}: OutputNameEditorProps) => {
32+
const { getOutputNodeId } = useNodeManager();
33+
34+
const outputNameToNodeId = useCallback(
35+
(outputName: string): string => {
36+
const outputId = outputNameToNodeId(outputName);
37+
return getOutputNodeId(outputId);
38+
},
39+
[getOutputNodeId],
40+
);
41+
3242
const { transferSelection } = useNodeSelectionTransfer(outputNameToNodeId);
3343
const { setComponentSpec, componentSpec } = useComponentSpec();
3444
const { clearContent } = useContextPanel();

src/components/shared/ReactFlow/FlowCanvas/FlowCanvas.tsx

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -303,15 +303,23 @@ const FlowCanvas = ({
303303
let updatedComponentSpec = { ...componentSpec };
304304

305305
for (const edge of params.edges) {
306-
updatedComponentSpec = removeEdge(edge, updatedComponentSpec);
306+
updatedComponentSpec = removeEdge(
307+
edge,
308+
updatedComponentSpec,
309+
nodeManager,
310+
);
307311
}
308312
for (const node of params.nodes) {
309-
updatedComponentSpec = removeNode(node, updatedComponentSpec);
313+
updatedComponentSpec = removeNode(
314+
node,
315+
updatedComponentSpec,
316+
nodeManager,
317+
);
310318
}
311319

312320
setComponentSpec(updatedComponentSpec);
313321
},
314-
[componentSpec, setComponentSpec],
322+
[componentSpec, nodeManager, setComponentSpec],
315323
);
316324

317325
const nodeCallbacks = useNodeCallbacks({
@@ -334,7 +342,11 @@ const FlowCanvas = ({
334342
(connection: Connection) => {
335343
if (connection.source === connection.target) return;
336344

337-
const updatedGraphSpec = handleConnection(graphSpec, connection);
345+
const updatedGraphSpec = handleConnection(
346+
graphSpec,
347+
connection,
348+
nodeManager,
349+
);
338350
updateGraphSpec(updatedGraphSpec);
339351
},
340352
[graphSpec, handleConnection, updateGraphSpec],
@@ -374,19 +386,30 @@ const FlowCanvas = ({
374386
);
375387

376388
if (existingInputEdge) {
377-
newComponentSpec = removeEdge(existingInputEdge, newComponentSpec);
389+
newComponentSpec = removeEdge(
390+
existingInputEdge,
391+
newComponentSpec,
392+
nodeManager,
393+
);
378394
}
379395

380396
const updatedComponentSpec = addAndConnectNode({
381397
componentRef,
382398
fromHandle,
383399
position,
384400
componentSpec: newComponentSpec,
401+
nodeManager,
385402
});
386403

387404
setComponentSpec(updatedComponentSpec);
388405
},
389-
[reactFlowInstance, componentSpec, setComponentSpec, updateOrAddNodes],
406+
[
407+
reactFlowInstance,
408+
componentSpec,
409+
nodeManager,
410+
setComponentSpec,
411+
updateOrAddNodes,
412+
],
390413
);
391414

392415
useEffect(() => {
@@ -633,14 +656,15 @@ const FlowCanvas = ({
633656
const updatedComponentSpec = updateNodePositions(
634657
updatedNodes,
635658
componentSpec,
659+
nodeManager,
636660
);
637661
setComponentSpec(updatedComponentSpec);
638662
}
639663
}
640664

641665
onNodesChange(changes);
642666
},
643-
[nodes, componentSpec, setComponentSpec, onNodesChange],
667+
[nodes, componentSpec, nodeManager, setComponentSpec, onNodesChange],
644668
);
645669

646670
const handleBeforeDelete = async (params: NodesAndEdges) => {

src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskNodeCard/TaskNodeInputs.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useConnection } from "@xyflow/react";
22
import { AlertCircle } from "lucide-react";
33
import { type MouseEvent, useCallback, useEffect, useState } from "react";
44

5+
import { useNodeManager } from "@/hooks/useNodeManager";
56
import { cn } from "@/lib/utils";
67
import { useForcedSearchContext } from "@/providers/ComponentLibraryProvider/ForcedSearchProvider";
78
import { isValidFilterRequest } from "@/providers/ComponentLibraryProvider/types";
@@ -10,7 +11,7 @@ import { useTaskNode } from "@/providers/TaskNodeProvider";
1011
import { inputsWithInvalidArguments } from "@/services/componentService";
1112
import type { InputSpec } from "@/utils/componentSpec";
1213
import { ComponentSearchFilter } from "@/utils/constants";
13-
import { inputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
14+
import { inputNameToInputId } from "@/utils/nodes/conversions";
1415
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";
1516

1617
import { InputHandle } from "./Handles";
@@ -27,6 +28,7 @@ export function TaskNodeInputs({
2728
expanded,
2829
onBackgroundClick,
2930
}: TaskNodeInputsProps) {
31+
const { getInputNodeId } = useNodeManager();
3032
const { inputs, taskSpec, state, select } = useTaskNode();
3133
const { graphSpec } = useComponentSpec();
3234
const {
@@ -145,7 +147,7 @@ export function TaskNodeInputs({
145147
}
146148

147149
const input = inputs.find(
148-
(i) => inputNameToNodeId(i.name) === fromHandle?.id,
150+
(i) => getInputNodeId(inputNameToInputId(i.name)) === fromHandle?.id,
149151
);
150152

151153
if (!input) return;

src/components/shared/ReactFlow/FlowCanvas/TaskNode/TaskNodeCard/TaskNodeOutputs.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { useConnection, useEdges } from "@xyflow/react";
22
import { type MouseEvent, useCallback, useEffect, useState } from "react";
33

4+
import { useNodeManager } from "@/hooks/useNodeManager";
45
import { cn } from "@/lib/utils";
56
import { useForcedSearchContext } from "@/providers/ComponentLibraryProvider/ForcedSearchProvider";
67
import { isValidFilterRequest } from "@/providers/ComponentLibraryProvider/types";
78
import { useTaskNode } from "@/providers/TaskNodeProvider";
89
import type { OutputSpec } from "@/utils/componentSpec";
910
import { ComponentSearchFilter } from "@/utils/constants";
10-
import { outputNameToNodeId } from "@/utils/nodes/nodeIdUtils";
11+
import { outputNameToOutputId } from "@/utils/nodes/conversions";
1112
import { checkArtifactMatchesSearchFilters } from "@/utils/searchUtils";
1213

1314
import { OutputHandle } from "./Handles";
@@ -23,6 +24,7 @@ export function TaskNodeOutputs({
2324
expanded,
2425
onBackgroundClick,
2526
}: TaskNodeOutputsProps) {
27+
const { getOutputNodeId } = useNodeManager();
2628
const { nodeId, outputs, state, select } = useTaskNode();
2729
const {
2830
highlightSearchFilter,
@@ -40,7 +42,8 @@ export function TaskNodeOutputs({
4042
edges.some(
4143
(edge) =>
4244
edge.source === nodeId &&
43-
edge.sourceHandle === outputNameToNodeId(output.name),
45+
edge.sourceHandle ===
46+
getOutputNodeId(outputNameToOutputId(output.name)),
4447
),
4548
);
4649

@@ -138,7 +141,7 @@ export function TaskNodeOutputs({
138141
}
139142

140143
const output = outputs.find(
141-
(o) => outputNameToNodeId(o.name) === fromHandle?.id,
144+
(o) => getOutputNodeId(outputNameToOutputId(o.name)) === fromHandle?.id,
142145
);
143146

144147
if (!output) return;

src/components/shared/ReactFlow/FlowCanvas/utils/addAndConnectNode.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import type { Connection, Handle } from "@xyflow/react";
22

3-
import type {
4-
ComponentReference,
5-
ComponentSpec,
6-
TaskSpec,
7-
TypeSpecType,
3+
import type { NodeManager } from "@/nodeManager";
4+
import {
5+
type ComponentReference,
6+
type ComponentSpec,
7+
isGraphImplementation,
8+
type TaskSpec,
9+
type TypeSpecType,
810
} from "@/utils/componentSpec";
911
import { DEFAULT_NODE_DIMENSIONS } from "@/utils/constants";
1012
import {
11-
inputNameToNodeId,
12-
nodeIdToTaskId,
13-
outputNameToNodeId,
14-
taskIdToNodeId,
15-
} from "@/utils/nodes/nodeIdUtils";
13+
inputNameToInputId,
14+
outputNameToOutputId,
15+
} from "@/utils/nodes/conversions";
1616

1717
import addTask from "./addTask";
1818
import { handleConnection } from "./handleConnection";
@@ -22,21 +22,23 @@ type AddAndConnectNodeParams = {
2222
fromHandle: Handle | null;
2323
position: { x: number; y: number };
2424
componentSpec: ComponentSpec;
25+
nodeManager: NodeManager;
2526
};
2627

2728
export function addAndConnectNode({
2829
componentRef,
2930
fromHandle,
3031
position,
3132
componentSpec,
33+
nodeManager,
3234
}: AddAndConnectNodeParams): ComponentSpec {
3335
// 1. Add the new node
3436
const taskSpec: TaskSpec = {
3537
annotations: {},
3638
componentRef: { ...componentRef },
3739
};
3840

39-
if (!("graph" in componentSpec.implementation)) {
41+
if (!isGraphImplementation(componentSpec.implementation)) {
4042
return componentSpec;
4143
}
4244

@@ -58,7 +60,7 @@ export function addAndConnectNode({
5860
);
5961

6062
// 2. Find the new node
61-
if (!("graph" in newComponentSpec.implementation)) {
63+
if (!isGraphImplementation(newComponentSpec.implementation)) {
6264
return newComponentSpec;
6365
}
6466

@@ -72,14 +74,17 @@ export function addAndConnectNode({
7274
return newComponentSpec;
7375
}
7476

75-
const newNodeId = taskIdToNodeId(newTaskId);
77+
const newNodeId = nodeManager.getNodeId(newTaskId, "task");
7678

7779
// 3. Determine the connection data type and find the first matching handle on the new node
7880
if (!fromHandle) {
7981
return newComponentSpec;
8082
}
8183

82-
const fromTaskId = nodeIdToTaskId(fromHandle.nodeId);
84+
const fromTaskId = nodeManager.getTaskId(fromHandle.nodeId);
85+
if (!fromTaskId) {
86+
return newComponentSpec;
87+
}
8388

8489
const fromTaskSpec = graphSpec.tasks[fromTaskId];
8590
const fromComponentSpec = fromTaskSpec?.componentRef.spec;
@@ -112,7 +117,8 @@ export function addAndConnectNode({
112117
return newComponentSpec;
113118
}
114119

115-
targetHandleId = inputNameToNodeId(handleName);
120+
const inputId = inputNameToInputId(handleName);
121+
targetHandleId = nodeManager.getNodeId(inputId, "input");
116122
} else if (toHandleType === "output") {
117123
const handleName = componentRef.spec?.outputs?.find(
118124
(io) => io.type === connectionType,
@@ -121,7 +127,8 @@ export function addAndConnectNode({
121127
return newComponentSpec;
122128
}
123129

124-
targetHandleId = outputNameToNodeId(handleName);
130+
const outputId = outputNameToOutputId(handleName);
131+
targetHandleId = nodeManager.getNodeId(outputId, "output");
125132
}
126133

127134
// 4. Build a Connection object and use handleConnection to add the edge
@@ -144,7 +151,11 @@ export function addAndConnectNode({
144151
targetHandle: targetHandleId,
145152
};
146153

147-
const updatedGraphSpec = handleConnection(graphSpec, connection);
154+
const updatedGraphSpec = handleConnection(
155+
graphSpec,
156+
connection,
157+
nodeManager,
158+
);
148159

149160
return {
150161
...newComponentSpec,

src/components/shared/ReactFlow/FlowCanvas/utils/addTask.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
type OutputSpec,
1010
type TaskSpec,
1111
} from "@/utils/componentSpec";
12+
import { taskNameToTaskId } from "@/utils/nodes/conversions";
1213
import {
1314
getUniqueInputName,
1415
getUniqueOutputName,
@@ -61,11 +62,13 @@ const addTask = (
6162
arguments: taskArguments ?? {},
6263
};
6364

64-
const taskId = getUniqueTaskName(
65+
const uniqueTaskName = getUniqueTaskName(
6566
graphSpec,
6667
taskSpec.componentRef.spec?.name ?? "Task",
6768
);
6869

70+
const taskId = taskNameToTaskId(uniqueTaskName);
71+
6972
const newGraphSpec: GraphSpec = {
7073
...graphSpec,
7174
tasks: {
@@ -78,9 +81,9 @@ const addTask = (
7881
}
7982

8083
if (taskType === "input") {
81-
const inputId = getUniqueInputName(componentSpec);
84+
const uniqueInputName = getUniqueInputName(componentSpec);
8285
const inputSpec: InputSpec = {
83-
name: inputId,
86+
name: uniqueInputName,
8487
annotations: positionAnnotations,
8588
};
8689
const inputs = (componentSpec.inputs ?? []).concat([inputSpec]);
@@ -89,9 +92,9 @@ const addTask = (
8992
}
9093

9194
if (taskType === "output") {
92-
const outputId = getUniqueOutputName(componentSpec);
95+
const uniqueOutputName = getUniqueOutputName(componentSpec);
9396
const outputSpec: OutputSpec = {
94-
name: outputId,
97+
name: uniqueOutputName,
9598
annotations: positionAnnotations,
9699
};
97100

0 commit comments

Comments
 (0)