import React, { useMemo } from 'react'; import { useStore } from '../../store'; import { EdgeMarker, ArrowHeadType, ReactFlowState } from '../../types'; import { getMarkerId } from '../../utils/graph'; interface MarkerProps extends EdgeMarker { id: string; } interface MarkerDefinitionsProps { defaultColor: string; } type SymbolProps = Omit; const ArrowSymbol = ({ color = 'none', strokeWidth = 1 }: SymbolProps) => { return ( ); }; const ArrowClosedSymbol = ({ color = 'none', strokeWidth = 1 }: SymbolProps) => { return ( ); }; const markerSymbols = { [ArrowHeadType.Arrow]: ArrowSymbol, [ArrowHeadType.ArrowClosed]: ArrowClosedSymbol, }; const Marker = ({ id, type, color, width = 12.5, height = 12.5, units = 'strokeWidth', strokeWidth, orient = 'auto', }: MarkerProps) => { const Symbol = markerSymbols[type]; return ( ); }; const edgesSelector = (s: ReactFlowState) => s.edges; const MarkerDefinitions = ({ defaultColor }: MarkerDefinitionsProps) => { const edges = useStore(edgesSelector); const markers = useMemo(() => { const ids: string[] = []; return edges.reduce((markers, edge) => { [edge.markerStart, edge.markerEnd].forEach((marker) => { if (marker && typeof marker === 'object') { const markerId = getMarkerId(marker); if (!ids.includes(markerId)) { markers.push({ id: markerId, color: marker.color || defaultColor, ...marker }); ids.push(markerId); } } }); return markers.sort((a, b) => a.id.localeCompare(b.id)); }, []); }, [edges, defaultColor]); return ( {markers.map((marker: MarkerProps) => ( ))} ); }; MarkerDefinitions.displayName = 'MarkerDefinitions'; export default MarkerDefinitions;