Files
AutoMetabuilder/frontend/autometabuilder/hooks/useWorkflowCanvas.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

44 lines
1.1 KiB
TypeScript

import { useCallback } from "react";
import { Node, Edge } from "reactflow";
import { WorkflowGraph, WorkflowPluginMap } from "../../lib/types";
import { useCanvasNodes } from "./useCanvasNodes";
import { useCanvasEdges } from "./useCanvasEdges";
import { useCanvasDragDrop } from "./useCanvasDragDrop";
export function useWorkflowCanvas(
graph: WorkflowGraph,
plugins: WorkflowPluginMap,
t: (key: string, fallback?: string) => string,
onNodesChange?: (nodes: Node[]) => void,
onEdgesChange?: (edges: Edge[]) => void
) {
const { nodes, setNodes, onNodesChangeInternal } = useCanvasNodes(
graph,
plugins,
t,
onNodesChange
);
const { edges, onConnect, onEdgesChangeInternal } = useCanvasEdges(graph, onEdgesChange);
const handleNodeAdd = useCallback(
(node: Node) => {
setNodes((nds) => nds.concat(node));
},
[setNodes]
);
const { onDragOver, onDrop, reactFlowWrapper } = useCanvasDragDrop(plugins, t, handleNodeAdd);
return {
nodes,
edges,
onNodesChangeInternal,
onEdgesChangeInternal,
onConnect,
onDragOver,
onDrop,
reactFlowWrapper,
};
}