refactor(zoomPanHelper): always return functions, add initialized flag #678
This commit is contained in:
@@ -94,10 +94,10 @@ const GraphView = ({
|
|||||||
const setMaxZoom = useStoreActions((actions) => actions.setMaxZoom);
|
const setMaxZoom = useStoreActions((actions) => actions.setMaxZoom);
|
||||||
const setTranslateExtent = useStoreActions((actions) => actions.setTranslateExtent);
|
const setTranslateExtent = useStoreActions((actions) => actions.setTranslateExtent);
|
||||||
const currentStore = useStore();
|
const currentStore = useStore();
|
||||||
const { zoomIn, zoomOut, zoomTo, transform, fitView } = useZoomPanHelper();
|
const { zoomIn, zoomOut, zoomTo, transform, fitView, initialized } = useZoomPanHelper();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!isInitialised.current && zoomIn && zoomOut && zoomTo && transform && fitView) {
|
if (!isInitialised.current && initialized) {
|
||||||
if (onLoad) {
|
if (onLoad) {
|
||||||
onLoad({
|
onLoad({
|
||||||
fitView: (params = { padding: 0.1 }) => fitView(params),
|
fitView: (params = { padding: 0.1 }) => fitView(params),
|
||||||
@@ -113,7 +113,7 @@ const GraphView = ({
|
|||||||
|
|
||||||
isInitialised.current = true;
|
isInitialised.current = true;
|
||||||
}
|
}
|
||||||
}, [onLoad, zoomIn, zoomOut, zoomTo, transform, fitView]);
|
}, [onLoad, zoomIn, zoomOut, zoomTo, transform, fitView, initialized]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (onConnect) {
|
if (onConnect) {
|
||||||
|
|||||||
@@ -4,22 +4,23 @@ import { zoomIdentity } from 'd3-zoom';
|
|||||||
import { useStoreState, useStore } from '../store/hooks';
|
import { useStoreState, useStore } from '../store/hooks';
|
||||||
import { clamp } from '../utils';
|
import { clamp } from '../utils';
|
||||||
import { getRectOfNodes } from '../utils/graph';
|
import { getRectOfNodes } from '../utils/graph';
|
||||||
import { FitViewParams, FlowTransform } from '../types';
|
import { FitViewParams, FlowTransform, ZoomPanHelperFunctions } from '../types';
|
||||||
|
|
||||||
const initialZoomPanHelper = {
|
const initialZoomPanHelper: ZoomPanHelperFunctions = {
|
||||||
zoomIn: null,
|
zoomIn: () => {},
|
||||||
zoomOut: null,
|
zoomOut: () => {},
|
||||||
zoomTo: null,
|
zoomTo: (_: number) => {},
|
||||||
transform: null,
|
transform: (_: FlowTransform) => {},
|
||||||
fitView: null,
|
fitView: (_: FitViewParams = { padding: 0.1 }) => {},
|
||||||
|
initialized: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default () => {
|
const usePanZoomHelper = (): ZoomPanHelperFunctions => {
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
const d3Zoom = useStoreState((s) => s.d3Zoom);
|
const d3Zoom = useStoreState((s) => s.d3Zoom);
|
||||||
const d3Selection = useStoreState((s) => s.d3Selection);
|
const d3Selection = useStoreState((s) => s.d3Selection);
|
||||||
|
|
||||||
const zoomPanHelperFunctions = useMemo(() => {
|
const zoomPanHelperFunctions = useMemo<ZoomPanHelperFunctions>(() => {
|
||||||
if (d3Selection && d3Zoom) {
|
if (d3Selection && d3Zoom) {
|
||||||
return {
|
return {
|
||||||
zoomIn: () => d3Zoom.scaleBy(d3Selection, 1.2),
|
zoomIn: () => d3Zoom.scaleBy(d3Selection, 1.2),
|
||||||
@@ -50,6 +51,7 @@ export default () => {
|
|||||||
|
|
||||||
d3Zoom.transform(d3Selection, transform);
|
d3Zoom.transform(d3Selection, transform);
|
||||||
},
|
},
|
||||||
|
initialized: true,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,3 +60,5 @@ export default () => {
|
|||||||
|
|
||||||
return zoomPanHelperFunctions;
|
return zoomPanHelperFunctions;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default usePanZoomHelper;
|
||||||
|
|||||||
@@ -337,3 +337,12 @@ export enum PanOnScrollMode {
|
|||||||
Vertical = 'vertical',
|
Vertical = 'vertical',
|
||||||
Horizontal = 'horizontal',
|
Horizontal = 'horizontal',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ZoomPanHelperFunctions {
|
||||||
|
zoomIn: () => void;
|
||||||
|
zoomOut: () => void;
|
||||||
|
zoomTo: (zoomLevel: number) => void;
|
||||||
|
transform: (transform: FlowTransform) => void;
|
||||||
|
fitView: (params?: FitViewParams) => void;
|
||||||
|
initialized: boolean;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user