import React, { useState, useEffect, useRef } from 'react'; import { Node } from '@xyflow/react'; import { Drawer, ResizeBox } from '@arco-design/web-react'; import { getNodeEditorByType } from '@/components/FlowEditor/nodeEditors'; interface NodeData { type?: string; title?: string; parameters?: any; component?: any; [key: string]: any; } interface NodeEditModalProps { popupContainer: any; node: Node; isOpen: boolean; isDelete: boolean; onSave: (data: any) => void; onClose: () => void; } const NodeEditModal: React.FC = ({ popupContainer, node, isOpen, isDelete, onSave, onClose }) => { const [nodeData, setNodeData] = useState({}); const [visible, setVisible] = useState(false); useEffect(() => { if (node) { setNodeData(node.data || {}); } }, [node]); useEffect(() => { setVisible(isOpen); }, [isOpen]); if (!isOpen || !node) return null; const handleSave = () => { setVisible(false); onSave(nodeData); }; const handleClose = () => { setVisible(false); onClose(); }; // 更新节点数据的通用函数 const updateNodeData = (key: string, value: any) => { setNodeData(prev => ({ ...prev, [key]: value })); }; // 获取节点编辑器组件 const getNodeEditor = () => { const nodeType = node?.type || 'basic'; // 检查是否为本地节点(通过nodeTypeMap中不存在的类型来判断) const isLocalNode = nodeType && !['start', 'end', 'basic', 'basic_loop'].includes(nodeType.toLowerCase()); const EditorComponent = getNodeEditorByType( nodeType.toLowerCase(), isLocalNode ? nodeType : undefined ); return ( ); }; return ( popupContainer?.current || document.body} onOk={handleSave} onCancel={isDelete ? handleClose : handleSave} > {getNodeEditor()} ); }; export default NodeEditModal;