import { BaseEdge, EdgeLabelRenderer, EdgeProps, getBezierPath, } from 'reactflow'; import useGraphStore from '../../store'; import { IFlow } from '@/interfaces/database/flow'; import { useQueryClient } from '@tanstack/react-query'; import { useMemo } from 'react'; import styles from './index.less'; export function ButtonEdge({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, source, target, style = {}, markerEnd, selected, }: EdgeProps) { const deleteEdgeById = useGraphStore((state) => state.deleteEdgeById); const [edgePath, labelX, labelY] = getBezierPath({ sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition, }); const selectedStyle = useMemo(() => { return selected ? { strokeWidth: 2, stroke: '#1677ff' } : {}; }, [selected]); const onEdgeClick = () => { deleteEdgeById(id); }; // highlight the nodes that the workflow passes through const queryClient = useQueryClient(); const flowDetail = queryClient.getQueryData(['flowDetail']); const graphPath = useMemo(() => { // TODO: this will be called multiple times const path = flowDetail?.dsl.path ?? []; // The second to last const previousGraphPath: string[] = path.at(-2) ?? []; let graphPath: string[] = path.at(-1) ?? []; // The last of the second to last article const previousLatestElement = previousGraphPath.at(-1); if (previousGraphPath.length > 0 && previousLatestElement) { graphPath = [previousLatestElement, ...graphPath]; } return graphPath; }, [flowDetail?.dsl.path]); const highlightStyle = useMemo(() => { const idx = graphPath.findIndex((x) => x === source); if (idx !== -1 && graphPath[idx + 1] === target) { return { strokeWidth: 2, stroke: 'red' }; } return {}; }, [source, target, graphPath]); return ( <>
); }