diff --git a/src/components/WorkflowCanvas.tsx b/src/components/WorkflowCanvas.tsx index 27db712c..916fb70b 100644 --- a/src/components/WorkflowCanvas.tsx +++ b/src/components/WorkflowCanvas.tsx @@ -18,6 +18,7 @@ import { import "@xyflow/react/dist/style.css"; import { useWorkflowStore, WorkflowFile } from "@/store/workflowStore"; +import { useToast } from "@/components/Toast"; import { ImageInputNode, AnnotationNode, @@ -181,11 +182,13 @@ export function WorkflowCanvas() { const { nodes, edges, groups, onNodesChange, onEdgesChange, onConnect, addNode, updateNodeData, loadWorkflow, getNodeById, addToGlobalHistory, setNodeGroupId, executeWorkflow, isModalOpen, showQuickstart, setShowQuickstart, navigationTarget, setNavigationTarget } = useWorkflowStore(); const { screenToFlowPosition, getViewport, zoomIn, zoomOut, setViewport, setCenter } = useReactFlow(); + const { show: showToast } = useToast(); const [isDragOver, setIsDragOver] = useState(false); const [dropType, setDropType] = useState<"image" | "workflow" | "node" | null>(null); const [connectionDrop, setConnectionDrop] = useState(null); const [isSplitting, setIsSplitting] = useState(false); const [isChatOpen, setIsChatOpen] = useState(false); + const [isBuildingWorkflow, setIsBuildingWorkflow] = useState(false); const reactFlowWrapper = useRef(null); // Detect if canvas is empty for showing quickstart @@ -560,6 +563,36 @@ export function WorkflowCanvas() { } }, [getNodeById]); + // Handle workflow generation from chat conversation + const handleBuildWorkflow = useCallback(async (description: string) => { + setIsBuildingWorkflow(true); + try { + const response = await fetch("/api/quickstart", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + description, + contentLevel: "full", + }), + }); + + const data = await response.json(); + + if (data.success && data.workflow) { + await loadWorkflow(data.workflow); + setIsChatOpen(false); + showToast("Workflow generated successfully", "success"); + } else { + showToast(data.error || "Failed to generate workflow", "error"); + } + } catch (error) { + console.error("Error generating workflow:", error); + showToast("Failed to generate workflow. Please try again.", "error"); + } finally { + setIsBuildingWorkflow(false); + } + }, [loadWorkflow, showToast]); + // Handle node selection from drop menu const handleMenuSelect = useCallback( (selection: { type: NodeType | MenuAction; isAction: boolean }) => { @@ -1350,7 +1383,12 @@ export function WorkflowCanvas() { {/* Chat panel */} - setIsChatOpen(false)} /> + setIsChatOpen(false)} + onBuildWorkflow={handleBuildWorkflow} + isBuildingWorkflow={isBuildingWorkflow} + /> ); }