Skip to content

Commit 240932c

Browse files
committed
Migrate Legacy NodeId Utilities to NodeManager
1 parent 5aa250a commit 240932c

23 files changed

+519
-420
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 & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -144,34 +144,6 @@ const FlowCanvas = ({
144144

145145
const latestFlowPosRef = useRef<{ x: number; y: number } | null>(null);
146146

147-
/* Migrate Node Ids */
148-
const [migrationCompleted, setMigrationCompleted] = useState(false);
149-
150-
useEffect(() => {
151-
if (!initialCanvasLoaded.current || migrationCompleted) return;
152-
153-
const needsMigration = nodes.some(
154-
(node) =>
155-
!nodeManager.isManaged(node.id) &&
156-
(node.id.startsWith("task_") ||
157-
node.id.startsWith("input_") ||
158-
node.id.startsWith("output_")),
159-
);
160-
161-
if (needsMigration) {
162-
console.log("Migrating legacy node IDs to stable IDs...");
163-
const { updatedNodes, migrationMap } =
164-
nodeManager.migrateExistingNodes(nodes);
165-
166-
setNodes(updatedNodes);
167-
setMigrationCompleted(true);
168-
169-
console.log("Migration completed:", migrationMap);
170-
} else {
171-
setMigrationCompleted(true);
172-
}
173-
}, [nodes, nodeManager, migrationCompleted]);
174-
175147
const [showToolbar, setShowToolbar] = useState(false);
176148
const [replaceTarget, setReplaceTarget] = useState<Node | null>(null);
177149
const [shiftKeyPressed, setShiftKeyPressed] = useState(false);
@@ -303,15 +275,23 @@ const FlowCanvas = ({
303275
let updatedComponentSpec = { ...componentSpec };
304276

305277
for (const edge of params.edges) {
306-
updatedComponentSpec = removeEdge(edge, updatedComponentSpec);
278+
updatedComponentSpec = removeEdge(
279+
edge,
280+
updatedComponentSpec,
281+
nodeManager,
282+
);
307283
}
308284
for (const node of params.nodes) {
309-
updatedComponentSpec = removeNode(node, updatedComponentSpec);
285+
updatedComponentSpec = removeNode(
286+
node,
287+
updatedComponentSpec,
288+
nodeManager,
289+
);
310290
}
311291

312292
setComponentSpec(updatedComponentSpec);
313293
},
314-
[componentSpec, setComponentSpec],
294+
[componentSpec, nodeManager, setComponentSpec],
315295
);
316296

317297
const nodeCallbacks = useNodeCallbacks({
@@ -334,7 +314,11 @@ const FlowCanvas = ({
334314
(connection: Connection) => {
335315
if (connection.source === connection.target) return;
336316

337-
const updatedGraphSpec = handleConnection(graphSpec, connection);
317+
const updatedGraphSpec = handleConnection(
318+
graphSpec,
319+
connection,
320+
nodeManager,
321+
);
338322
updateGraphSpec(updatedGraphSpec);
339323
},
340324
[graphSpec, handleConnection, updateGraphSpec],
@@ -374,19 +358,30 @@ const FlowCanvas = ({
374358
);
375359

376360
if (existingInputEdge) {
377-
newComponentSpec = removeEdge(existingInputEdge, newComponentSpec);
361+
newComponentSpec = removeEdge(
362+
existingInputEdge,
363+
newComponentSpec,
364+
nodeManager,
365+
);
378366
}
379367

380368
const updatedComponentSpec = addAndConnectNode({
381369
componentRef,
382370
fromHandle,
383371
position,
384372
componentSpec: newComponentSpec,
373+
nodeManager,
385374
});
386375

387376
setComponentSpec(updatedComponentSpec);
388377
},
389-
[reactFlowInstance, componentSpec, setComponentSpec, updateOrAddNodes],
378+
[
379+
reactFlowInstance,
380+
componentSpec,
381+
nodeManager,
382+
setComponentSpec,
383+
updateOrAddNodes,
384+
],
390385
);
391386

392387
useEffect(() => {
@@ -633,14 +628,15 @@ const FlowCanvas = ({
633628
const updatedComponentSpec = updateNodePositions(
634629
updatedNodes,
635630
componentSpec,
631+
nodeManager,
636632
);
637633
setComponentSpec(updatedComponentSpec);
638634
}
639635
}
640636

641637
onNodesChange(changes);
642638
},
643-
[nodes, componentSpec, setComponentSpec, onNodesChange],
639+
[nodes, componentSpec, nodeManager, setComponentSpec, onNodesChange],
644640
);
645641

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

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@ import { getOutputConnectedDetails } from "@/components/Editor/utils/getOutputCo
77
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
88
import { BlockStack, InlineStack } from "@/components/ui/layout";
99
import { Paragraph } from "@/components/ui/typography";
10+
import { useNodeManager } from "@/hooks/useNodeManager";
1011
import { cn } from "@/lib/utils";
1112
import { useComponentSpec } from "@/providers/ComponentSpecProvider";
1213
import { useContextPanel } from "@/providers/ContextPanelProvider";
1314
import type { IONodeData } from "@/types/nodes";
1415
import type { InputSpec, TypeSpecType } from "@/utils/componentSpec";
1516
import { ENABLE_DEBUG_MODE } from "@/utils/constants";
1617
import {
17-
inputNameToNodeId,
18-
outputNameToNodeId,
19-
} from "@/utils/nodes/nodeIdUtils";
18+
inputNameToInputId,
19+
outputNameToOutputId,
20+
} from "@/utils/nodes/conversions";
2021

2122
interface IONodeProps {
2223
type: "input" | "output";
@@ -26,6 +27,7 @@ interface IONodeProps {
2627
}
2728

2829
const IONode = ({ type, data, selected = false }: IONodeProps) => {
30+
const { getInputNodeId, getOutputNodeId } = useNodeManager();
2931
const { graphSpec, componentSpec } = useComponentSpec();
3032
const { setContent, clearContent } = useContextPanel();
3133

@@ -57,10 +59,11 @@ const IONode = ({ type, data, selected = false }: IONodeProps) => {
5759
);
5860

5961
const nodeId = isInput
60-
? inputNameToNodeId(spec.name)
61-
: outputNameToNodeId(spec.name);
62-
63-
const nodeHandleId = nodeId + "_handle";
62+
? getInputNodeId(inputNameToInputId(spec.name))
63+
: getOutputNodeId(outputNameToOutputId(spec.name));
64+
const nodeHandleId = isInput
65+
? getInputNodeId(inputNameToInputId(spec.name + "_handle"))
66+
: getOutputNodeId(outputNameToOutputId(spec.name + "_handle"));
6467

6568
const handleHandleClick = useCallback(() => {
6669
if (ENABLE_DEBUG_MODE) {

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;

0 commit comments

Comments
 (0)