import React, { useEffect } from 'react'; import { Menu, Message } from '@arco-design/web-react'; import { Node } from '@xyflow/react'; import { isJSON } from '@/utils/common'; interface NodeContextMenuProps { node: Node; onRename?: (node: Node) => void; onDelete?: (node: Node) => void; onCopy?: (node: Node) => void; onEdit?: (node: Node) => void; onCloseMenu?: (data: React.Dispatch>) => void; onCloseOpenModal?: (boolean: boolean) => void; } const NodeContextMenu: React.FC = ({ node, onDelete, onCopy, onEdit, onCloseMenu, onCloseOpenModal }) => { const handleDelete = () => { onDelete && onDelete(node); onCloseOpenModal(false); onCloseMenu(null); }; const handleCopy = () => { onCopy && onCopy(node); onCloseOpenModal(false); onCloseMenu(null); }; const handleEdit = () => { // 判断节点类型,如果是SUB类型则打开新标签页 if (node.type === 'SUB') { // 创建自定义事件来通知打开新标签页 const customDef = isJSON((node as any).data.component.customDef) ? JSON.parse((node as any).data.component.customDef) : {}; if (Object.keys(customDef).length === 0) { Message.warning('新导入的复合组件请保存后再进行编辑!'); } const openTabEvent = new CustomEvent('openSubNodeTab', { detail: { node } }); document.dispatchEvent(openTabEvent); } else { onEdit && onEdit(node); onCloseOpenModal(true); } onCloseMenu(null); }; // 根据节点类型和其他条件动态生成菜单项 const renderMenuItems = () => { const menuItems = []; // if (!useDefault) return; // 对于非开始和结束节点,添加基本操作 if (!['start', 'end'].includes(node?.type)) { if (!['AND', 'OR', 'JSON2STR', 'STR2JSON', 'IMAGE', 'RESULT', 'LOOP_START'].includes(node.data.type as string)) { menuItems.push( 编辑节点 ); } menuItems.push( 复制节点 ); menuItems.push( 删除节点 ); } // 可以根据节点类型添加特定的操作 if (node?.type === 'special') { menuItems.push( 特殊操作 ); } return menuItems; }; return ( {renderMenuItems()} ); }; export default NodeContextMenu;