Files
AutoMetabuilder/frontend/autometabuilder/components/workflow/VisualWorkflowBuilder.tsx
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

41 lines
1.5 KiB
TypeScript

"use client";
import { Paper } from "@mui/material";
import { useWorkflowGraph } from "../../hooks/useWorkflowGraph";
import { useWorkflowPlugins } from "../../hooks/useWorkflowPlugins";
import { useTabNavigation } from "../../hooks/useTabNavigation";
import LoadingState from "./LoadingState";
import ErrorState from "./ErrorState";
import WorkflowBuilderHeader from "./WorkflowBuilderHeader";
import WorkflowBuilderTabs from "./WorkflowBuilderTabs";
import WorkflowBuilderContent from "./WorkflowBuilderContent";
type VisualWorkflowBuilderProps = {
t: (key: string, fallback?: string) => string;
};
export default function VisualWorkflowBuilder({ t }: VisualWorkflowBuilderProps) {
const { graph, loading: graphLoading, error: graphError } = useWorkflowGraph();
const { plugins, loading: pluginsLoading, error: pluginsError } = useWorkflowPlugins();
const { selectedTab, handleTabChange } = useTabNavigation(0);
const error = graphError || pluginsError;
const loading = graphLoading || pluginsLoading;
if (error) {
return <ErrorState message={error} />;
}
if (loading || !graph) {
return <LoadingState message={t("ui.workflow.canvas.loading", "Loading workflow canvas...")} />;
}
return (
<Paper sx={{ p: 3, backgroundColor: "var(--color-panel-bg)" }}>
<WorkflowBuilderHeader t={t} />
<WorkflowBuilderTabs value={selectedTab} onChange={handleTabChange} t={t} />
<WorkflowBuilderContent selectedTab={selectedTab} graph={graph} plugins={plugins} t={t} />
</Paper>
);
}