"use client"; import { useMemo, useState, type MouseEvent } from "react"; import { BaseEdge, EdgeLabelRenderer, getBezierPath, type EdgeProps, } from "@xyflow/react"; import { Plus } from "lucide-react"; export type DefaultEdgeInsertAnchor = { edgeId: string; screenX: number; screenY: number; }; export type DefaultEdgeProps = EdgeProps & { edgeId?: string; isMenuOpen?: boolean; disabled?: boolean; onInsertClick?: (anchor: DefaultEdgeInsertAnchor) => void; }; export default function DefaultEdge({ id, edgeId, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, markerStart, markerEnd, style, interactionWidth, isMenuOpen = false, disabled = false, onInsertClick, }: DefaultEdgeProps) { const [isEdgeHovered, setIsEdgeHovered] = useState(false); const [isButtonHovered, setIsButtonHovered] = useState(false); const [edgePath, labelX, labelY] = useMemo( () => getBezierPath({ sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, }), [sourcePosition, sourceX, sourceY, targetPosition, targetX, targetY], ); const resolvedEdgeId = edgeId ?? id; const canInsert = Boolean(onInsertClick) && !disabled; const isInsertVisible = canInsert && (isMenuOpen || isEdgeHovered || isButtonHovered); const handleInsertClick = (event: MouseEvent) => { if (!onInsertClick || disabled) { return; } const rect = event.currentTarget.getBoundingClientRect(); onInsertClick({ edgeId: resolvedEdgeId, screenX: rect.left + rect.width / 2, screenY: rect.top + rect.height / 2, }); }; return ( <> setIsEdgeHovered(true)} onMouseLeave={() => setIsEdgeHovered(false)} > ); }