From 0f855308ccb6700b64b8855091cd3a8867f2677b Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 1 Nov 2022 18:04:29 +0100 Subject: [PATCH] feat(interactive-minimap): add node click handler --- .../src/examples/InteractiveMinimap/index.tsx | 6 +++++- packages/interactive-minimap/src/MiniMap.tsx | 14 ++++++++++++++ packages/interactive-minimap/src/MiniMapNode.tsx | 7 ++++++- packages/interactive-minimap/src/types.ts | 1 + 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/vite-app/src/examples/InteractiveMinimap/index.tsx b/examples/vite-app/src/examples/InteractiveMinimap/index.tsx index fa66d209..db8d754f 100644 --- a/examples/vite-app/src/examples/InteractiveMinimap/index.tsx +++ b/examples/vite-app/src/examples/InteractiveMinimap/index.tsx @@ -118,6 +118,10 @@ const BasicFlow = () => { console.log(pos); }, []); + const onMiniMapNodeClick = useCallback((event: MouseEvent, node: Node) => { + console.log(node); + }, []); + return ( { fitView > - +
diff --git a/packages/interactive-minimap/src/MiniMap.tsx b/packages/interactive-minimap/src/MiniMap.tsx index 57444d62..46b0ec9f 100644 --- a/packages/interactive-minimap/src/MiniMap.tsx +++ b/packages/interactive-minimap/src/MiniMap.tsx @@ -47,6 +47,7 @@ function MiniMap({ maskColor = 'rgb(200, 200, 200, 0.9)', position = 'bottom-right', onClick, + onNodeClick, }: MiniMapProps) { const store = useStoreApi(); const svg = useRef(null); @@ -114,9 +115,20 @@ function MiniMap({ d3Zoom.transform(d3Selection, nextTransform); }); selection.call(zoomHandler); + + return () => { + selection.on('.zoom', null); + }; } }, []); + const onSvgNodeClick = onNodeClick + ? (event: MouseEvent, nodeId: string) => { + const node = store.getState().nodeInternals.get(nodeId)!; + onNodeClick(event, node); + } + : undefined; + return ( ); })} diff --git a/packages/interactive-minimap/src/MiniMapNode.tsx b/packages/interactive-minimap/src/MiniMapNode.tsx index 3ea3bd33..15a5ba3f 100644 --- a/packages/interactive-minimap/src/MiniMapNode.tsx +++ b/packages/interactive-minimap/src/MiniMapNode.tsx @@ -1,7 +1,8 @@ -import { memo, CSSProperties } from 'react'; +import { memo, CSSProperties, MouseEvent } from 'react'; import cc from 'classcat'; interface MiniMapNodeProps { + id: string; x: number; y: number; width: number; @@ -13,9 +14,11 @@ interface MiniMapNodeProps { strokeColor: string; strokeWidth: number; style?: CSSProperties; + onClick?: (event: MouseEvent, id: string) => void; } const MiniMapNode = ({ + id, x, y, width, @@ -27,6 +30,7 @@ const MiniMapNode = ({ className, borderRadius, shapeRendering, + onClick, }: MiniMapNodeProps) => { const { background, backgroundColor } = style || {}; const fill = (color || background || backgroundColor) as string; @@ -44,6 +48,7 @@ const MiniMapNode = ({ stroke={strokeColor} strokeWidth={strokeWidth} shapeRendering={shapeRendering} + onClick={onClick ? (event) => onClick(event, id) : undefined} /> ); }; diff --git a/packages/interactive-minimap/src/types.ts b/packages/interactive-minimap/src/types.ts index aff2aeab..80534fc3 100644 --- a/packages/interactive-minimap/src/types.ts +++ b/packages/interactive-minimap/src/types.ts @@ -13,4 +13,5 @@ export type MiniMapProps = Omit, ' maskColor?: string; position?: PanelPosition; onClick?: (event: MouseEvent, position: XYPosition) => void; + onNodeClick?: (event: MouseEvent, node: Node) => void; };