import { memo, useMemo } from 'react'; import { type MarkerProps, createMarkerIds } from '@xyflow/system'; import { useStore } from '../../hooks/useStore'; import { useMarkerSymbol } from './MarkerSymbols'; type MarkerDefinitionsProps = { defaultColor: string; rfId?: string; }; const Marker = ({ id, type, color, width = 12.5, height = 12.5, markerUnits = 'strokeWidth', strokeWidth, orient = 'auto-start-reverse', }: MarkerProps) => { const Symbol = useMarkerSymbol(type); if (!Symbol) { return null; } return ( ); }; /* * when you have multiple flows on a page and you hide the first one, the other ones have no markers anymore * when they do have markers with the same ids. To prevent this the user can pass a unique id to the react flow wrapper * that we can then use for creating our unique marker ids */ const MarkerDefinitions = ({ defaultColor, rfId }: MarkerDefinitionsProps) => { const edges = useStore((s) => s.edges); const defaultEdgeOptions = useStore((s) => s.defaultEdgeOptions); const markers = useMemo(() => { const markers = createMarkerIds(edges, { id: rfId, defaultColor, defaultMarkerStart: defaultEdgeOptions?.markerStart, defaultMarkerEnd: defaultEdgeOptions?.markerEnd, }); return markers; }, [edges, defaultEdgeOptions, rfId, defaultColor]); if (!markers.length) { return null; } return ( {markers.map((marker: MarkerProps) => ( ))} ); }; MarkerDefinitions.displayName = 'MarkerDefinitions'; export default memo(MarkerDefinitions);