import React, { useState, useMemo } from 'react'; import { BaseEdge, EdgeLabelRenderer, EdgeProps, getSmoothStepPath, useReactFlow } from '@xyflow/react'; import type { FlowNode } from '../types'; import { convertToDisplayName } from '@/utils/workflow/variableConversion'; /** * 自定义边组件 * 支持hover高亮和样式优化 */ const CustomEdge: React.FC = ({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, style = {}, markerEnd, label, selected, }) => { const [isHovered, setIsHovered] = useState(false); const { getNodes } = useReactFlow(); // 将 label 中的 UUID 转换为节点名 const displayLabel = useMemo(() => { if (!label || typeof label !== 'string') { return label; } const allNodes = getNodes() as FlowNode[]; return convertToDisplayName(label, allNodes); }, [label, getNodes]); const [edgePath, labelX, labelY] = getSmoothStepPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition, }); // 根据状态确定样式 const edgeStyle = { ...style, stroke: selected ? '#3b82f6' : isHovered ? '#64748b' : '#94a3b8', strokeWidth: selected ? 3 : isHovered ? 2.5 : 2, transition: 'all 0.2s ease', }; const markerEndStyle = (() => { if (!markerEnd || typeof markerEnd !== 'object') return markerEnd; if (selected) return { ...markerEnd, color: '#3b82f6' }; if (isHovered) return { ...markerEnd, color: '#64748b' }; return markerEnd; })(); return ( <> {/* 增加点击区域 */} setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} /> {/* 边标签 */} {displayLabel && (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > {displayLabel}
)} ); }; export default CustomEdge;