import React, { useState, useEffect, useRef } from 'react'; import { BaseEdge, EdgeLabelRenderer, EdgeProps, getSmoothStepPath, useReactFlow } from '@xyflow/react'; import EdgeAddNodeButton from '@/pages/flowEditor/components/edgeAddNodeButton'; import { getTopicList } from '@/api/event'; import { useSelector } from 'react-redux'; import { Message } from '@arco-design/web-react'; type DataDisplayEdgeData = { label?: string; value?: any; name?: string; topic?: string; eventId?: string; }; const DataDisplayEdge: React.FC = ({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, style = {}, markerEnd, selected, data }) => { const [isOpen, setIsOpen] = useState(false); const [selectedValue, setSelectedValue] = useState(''); const dropdownRef = useRef(null); const [edgePath, labelX, labelY] = getSmoothStepPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition, borderRadius: 8 // 设置圆角半径 }); const { info, eventTopicList } = useSelector((state: any) => state.ideContainer); // 从数据中获取悬停状态 const hovered = data?.hovered || false; // 从数据中获取要显示的信息 const displayData: DataDisplayEdgeData = data?.displayData || {}; // 使用useReactFlow钩子获取setEdges方法 const { setEdges } = useReactFlow(); // 边点击处理函数 const handleEdgeAddNode = (e) => { // 更新边的数据,触发边上添加节点的流程 setEdges(eds => eds.map(edge => { if (edge.id === id) { return { ...edge, data: { ...edge.data, addNodeTrigger: true, clientX: e.clientX, clientY: e.clientY } }; } return edge; })); }; useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const handleSelect = (option) => { setSelectedValue(option.label); setIsOpen(false); }; return ( <>
{/* 数据展示框 */} {displayData && Object.keys(displayData).length > 0 && (
setIsOpen(!isOpen)} style={{ padding: '4px 11px', cursor: 'pointer', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }} > {selectedValue || displayData.name} {isOpen ? '▲' : '▼'}
{isOpen && (
{eventTopicList.map((option: { value: string; label: string }) => (
handleSelect(option)} style={{ padding: '5px 12px', cursor: 'pointer', borderBottom: '1px solid #f0f0f0' }} onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f5f5f5'} onMouseLeave={(e) => e.currentTarget.style.backgroundColor = '#fff'} > {option.label}
))}
)}
)} {hovered && Object.keys(displayData).length === 0 && ( handleEdgeAddNode(e)} /> )}
); }; export default DataDisplayEdge;