import { BaseEdge, EdgeLabelRenderer, EdgeProps, getBezierPath, } from 'reactflow'; import useGraphStore from '../../store'; import { useFetchFlow } from '@/hooks/flow-hooks'; 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 { data: flowDetail } = useFetchFlow(); 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) { // The set of elements following source const slicedGraphPath = graphPath.slice(idx + 1); if (slicedGraphPath.some((x) => x === target)) { return { strokeWidth: 2, stroke: 'red' }; } } return {}; }, [source, target, graphPath]); return ( <>
); }