Files
AutoMetabuilder/frontend/autometabuilder/hooks/useCanvasEdges.ts
copilot-swe-agent[bot] 6e9ff896e7 Phase 9: Implement atomic hooks-based workflow canvas components
- Created custom hooks: useWorkflowGraph, useWorkflowPlugins, usePluginSearch, useTabNavigation
- Decomposed canvas logic into: useCanvasNodes, useCanvasEdges, useCanvasDragDrop
- Built atomic node components: NodeHeader, NodeBody, NodePorts
- Created canvas UI components: CanvasInfoPanel, CanvasHintPanel
- Split builder into: LoadingState, ErrorState, WorkflowBuilderHeader, WorkflowBuilderTabs, WorkflowBuilderContent
- Added React Flow for n8n-style visual canvas with drag-and-drop
- All components now under 100 LOC following PROMPT.md guidelines

Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
2026-01-10 12:25:36 +00:00

37 lines
990 B
TypeScript

import { useCallback, useEffect } from "react";
import { Edge, Connection, addEdge, useEdgesState } from "reactflow";
import { WorkflowGraph } from "../lib/types";
export function useCanvasEdges(
graph: WorkflowGraph,
onEdgesChange?: (edges: Edge[]) => void
) {
const [edges, setEdges, onEdgesChangeInternal] = useEdgesState([]);
useEffect(() => {
const flowEdges: Edge[] = graph.edges.map((edge, index) => ({
id: `e-${edge.from}-${edge.to}-${edge.var}-${index}`,
source: edge.from,
target: edge.to,
label: edge.var,
type: "smoothstep",
animated: false,
}));
setEdges(flowEdges);
}, [graph, setEdges]);
const onConnect = useCallback(
(connection: Connection) => {
setEdges((eds) => addEdge({ ...connection, type: "smoothstep" }, eds));
},
[setEdges]
);
useEffect(() => {
if (onEdgesChange) onEdgesChange(edges);
}, [edges, onEdgesChange]);
return { edges, onConnect, onEdgesChangeInternal };
}