From 85993cfbf87ec6732c555da9af65f2ce58097ede Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 3 May 2023 11:41:07 +0200 Subject: [PATCH] fix(autopan): respect translate contraints --- packages/core/src/hooks/useDrag/index.ts | 5 +++-- packages/core/src/store/index.ts | 11 +++++++++-- packages/core/src/types/general.ts | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/core/src/hooks/useDrag/index.ts b/packages/core/src/hooks/useDrag/index.ts index 8821ab4a..346828fb 100644 --- a/packages/core/src/hooks/useDrag/index.ts +++ b/packages/core/src/hooks/useDrag/index.ts @@ -119,8 +119,9 @@ function useDrag({ lastPos.current.x = (lastPos.current.x ?? 0) - xMovement / transform[2]; lastPos.current.y = (lastPos.current.y ?? 0) - yMovement / transform[2]; - updateNodes(lastPos.current as XYPosition); - panBy({ x: xMovement, y: yMovement }); + if (panBy({ x: xMovement, y: yMovement })) { + updateNodes(lastPos.current as XYPosition); + } } autoPanId.current = requestAnimationFrame(autoPan); }; diff --git a/packages/core/src/store/index.ts b/packages/core/src/store/index.ts index f4365d45..5c152969 100644 --- a/packages/core/src/store/index.ts +++ b/packages/core/src/store/index.ts @@ -252,11 +252,11 @@ const createRFStore = () => nodeInternals: new Map(nodeInternals), }); }, - panBy: (delta: XYPosition) => { + panBy: (delta: XYPosition): boolean => { const { transform, width, height, d3Zoom, d3Selection, translateExtent } = get(); if (!d3Zoom || !d3Selection || (!delta.x && !delta.y)) { - return; + return false; } const nextTransform = zoomIdentity.translate(transform[0] + delta.x, transform[1] + delta.y).scale(transform[2]); @@ -268,6 +268,13 @@ const createRFStore = () => const constrainedTransform = d3Zoom?.constrain()(nextTransform, extent, translateExtent); d3Zoom.transform(d3Selection, constrainedTransform); + + const transformChanged = + transform[0] !== constrainedTransform.x || + transform[1] !== constrainedTransform.y || + transform[2] !== constrainedTransform.k; + + return transformChanged; }, cancelConnection: () => set({ diff --git a/packages/core/src/types/general.ts b/packages/core/src/types/general.ts index f57a1ea7..9803d4a0 100644 --- a/packages/core/src/types/general.ts +++ b/packages/core/src/types/general.ts @@ -252,7 +252,7 @@ export type ReactFlowActions = { cancelConnection: () => void; reset: () => void; triggerNodeChanges: (changes: NodeChange[]) => void; - panBy: (delta: XYPosition) => void; + panBy: (delta: XYPosition) => boolean; }; export type ReactFlowState = ReactFlowStore & ReactFlowActions;