diff --git a/.gitignore b/.gitignore index 733f8f6e..0de53e00 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ cypress/videos cypress/screenshots dist .env -stats.html \ No newline at end of file +stats.html +.eslintcache \ No newline at end of file diff --git a/example/src/Provider/Sidebar.js b/example/src/Provider/Sidebar.js index 7006f086..0b2c5f24 100644 --- a/example/src/Provider/Sidebar.js +++ b/example/src/Provider/Sidebar.js @@ -1,7 +1,7 @@ import React from 'react'; import { useStoreState, useStoreActions } from 'react-flow-renderer'; -export default () => { +const Sidebar = () => { const nodes = useStoreState((store) => store.nodes); const transform = useStoreState((store) => store.transform); const setSelectedElements = useStoreActions((actions) => actions.setSelectedElements); @@ -32,3 +32,5 @@ export default () => { ); }; + +export default Sidebar; diff --git a/example/src/SaveRestore/Controls.js b/example/src/SaveRestore/Controls.js index bb0e7d96..47957adf 100644 --- a/example/src/SaveRestore/Controls.js +++ b/example/src/SaveRestore/Controls.js @@ -53,4 +53,4 @@ const Controls = memo(({ rfInstance, setElements }) => { ); }); -export default Controls; \ No newline at end of file +export default Controls; diff --git a/src/hooks/useZoomPanHelper.ts b/src/hooks/useZoomPanHelper.ts index bfe62dfb..2d0cf051 100644 --- a/src/hooks/useZoomPanHelper.ts +++ b/src/hooks/useZoomPanHelper.ts @@ -12,6 +12,7 @@ const initialZoomPanHelper: ZoomPanHelperFunctions = { zoomTo: (_: number) => {}, transform: (_: FlowTransform) => {}, fitView: (_: FitViewParams = { padding: 0.1 }) => {}, + setCenter: (_: number, __: number) => {}, initialized: false, }; @@ -51,6 +52,16 @@ const usePanZoomHelper = (): ZoomPanHelperFunctions => { d3Zoom.transform(d3Selection, transform); }, + setCenter: (x: number, y: number, zoom?: number) => { + const { width, height, maxZoom } = store.getState(); + + const nextZoom = typeof zoom !== 'undefined' ? zoom : maxZoom; + const centerX = width / 2 - x * nextZoom; + const centerY = height / 2 - y * nextZoom; + const transform = zoomIdentity.translate(centerX, centerY).scale(nextZoom); + + d3Zoom.transform(d3Selection, transform); + }, initialized: true, }; } diff --git a/src/types/index.ts b/src/types/index.ts index 79d11f61..eb9c8b04 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -354,6 +354,7 @@ export interface ZoomPanHelperFunctions { zoomTo: (zoomLevel: number) => void; transform: (transform: FlowTransform) => void; fitView: (params?: FitViewParams) => void; + setCenter: (x: number, y: number, zoom?: number) => void; initialized: boolean; }