'use client'; import { useState, useRef } from 'react'; interface WorkflowCanvasProps { nodes: any[]; connections: any[]; onNodeSelect: (node: any) => void; onUpdateWorkflow: (data: any) => void; } export default function WorkflowCanvas({ nodes, connections, onNodeSelect, onUpdateWorkflow }: WorkflowCanvasProps) { const canvasRef = useRef(null); const [draggedNode, setDraggedNode] = useState(null); const [selectedNode, setSelectedNode] = useState(null); const [canvasNodes, setCanvasNodes] = useState([ { id: 'start', type: 'trigger', name: '开始', icon: '🚀', x: 100, y: 100, isFixed: true } ]); const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); const nodeData = JSON.parse(e.dataTransfer.getData('application/json')); const rect = canvasRef.current?.getBoundingClientRect(); if (rect) { const newNode = { id: `node_${Date.now()}`, type: nodeData.type, name: nodeData.name, icon: nodeData.icon, nodeType: nodeData.nodeType, x: e.clientX - rect.left - 50, y: e.clientY - rect.top - 25, config: {} }; setCanvasNodes(prev => [...prev, newNode]); } }; const handleNodeClick = (node: any) => { setSelectedNode(node); onNodeSelect(node); }; const handleNodeDrag = (nodeId: string, newX: number, newY: number) => { setCanvasNodes(prev => prev.map(node => node.id === nodeId ? { ...node, x: newX, y: newY } : node ) ); }; const deleteNode = (nodeId: string) => { setCanvasNodes(prev => prev.filter(node => node.id !== nodeId && !node.isFixed)); if (selectedNode && selectedNode.id === nodeId) { setSelectedNode(null); onNodeSelect(null); } }; return (
{/* 画布提示 */} {canvasNodes.length <= 1 && (

开始构建您的工作流

从左侧拖拽节点到画布上

)} {/* 渲染节点 */} {canvasNodes.map((node) => ( handleNodeClick(node)} onDrag={handleNodeDrag} onDelete={deleteNode} /> ))} {/* 连接线 */} {connections.map((connection, index) => { const startNode = canvasNodes.find(n => n.id === connection.from); const endNode = canvasNodes.find(n => n.id === connection.to); if (startNode && endNode) { return ( ); } return null; })} {/* 箭头定义 */}
); } // 工作流节点组件 function WorkflowNode({ node, isSelected, onClick, onDrag, onDelete }: any) { const [isDragging, setIsDragging] = useState(false); const [dragStart, setDragStart] = useState({ x: 0, y: 0 }); const handleMouseDown = (e: React.MouseEvent) => { if (node.isFixed) return; setIsDragging(true); setDragStart({ x: e.clientX - node.x, y: e.clientY - node.y }); }; const handleMouseMove = (e: React.MouseEvent) => { if (!isDragging || node.isFixed) return; onDrag(node.id, e.clientX - dragStart.x, e.clientY - dragStart.y); }; const handleMouseUp = () => { setIsDragging(false); }; return (
{node.icon}
{node.name}
{/* 连接点 */} {!node.isFixed && ( <>
)} {node.isFixed && (
)} {/* 删除按钮 */} {!node.isFixed && isSelected && ( )}
); }