refactor: resize handler and zoom pan helper to watch until refs are resolved

This commit is contained in:
Braks
2021-08-08 19:28:45 +02:00
parent 25c92ecd84
commit a6f7678c0f
2 changed files with 14 additions and 14 deletions
+10 -11
View File
@@ -1,15 +1,14 @@
import { getDimensions } from '../utils'; import { getDimensions } from '../utils';
import { Dimensions } from '../types'; import { Dimensions } from '../types';
import { MaybeRef, unrefElement, until, useEventListener, useResizeObserver } from '@vueuse/core';
export default (rendererNode: HTMLDivElement, updateSize: (size: Dimensions) => any) => { export default (rendererNode: MaybeRef<HTMLDivElement>, updateSize: (size: Dimensions) => any) => {
let resizeObserver: ResizeObserver;
const updateDimensions = () => { const updateDimensions = () => {
if (!rendererNode) { if (!rendererNode) {
return; return;
} }
const size = getDimensions(rendererNode); const size = getDimensions(unrefElement(rendererNode));
if (size.height === 0 || size.width === 0) { if (size.height === 0 || size.width === 0) {
console.log('The revue Flow parent container needs a width and a height to render the graph.'); console.log('The revue Flow parent container needs a width and a height to render the graph.');
@@ -18,11 +17,11 @@ export default (rendererNode: HTMLDivElement, updateSize: (size: Dimensions) =>
updateSize(size); updateSize(size);
}; };
updateDimensions(); until(rendererNode)
window.onresize = updateDimensions; .toBeTruthy()
.then(() => {
if (rendererNode) { updateDimensions();
resizeObserver = new ResizeObserver(() => updateDimensions()); useEventListener(window, 'resize', updateDimensions);
resizeObserver.observe(rendererNode); useResizeObserver(unrefElement(rendererNode), () => updateDimensions());
} });
}; };
+4 -3
View File
@@ -1,14 +1,15 @@
import { zoomIdentity } from 'd3-zoom'; import { zoomIdentity } from 'd3-zoom';
import { computed } from 'vue'; import { computed, inject } from 'vue';
import { createEventHook, until } from '@vueuse/core'; import { createEventHook, EventHookOn, until } from '@vueuse/core';
import { Selection, ZoomBehavior } from 'd3'; import { Selection, ZoomBehavior } from 'd3';
import { getRectOfNodes, pointToRendererPoint, getTransformForBounds } from '../utils/graph'; import { getRectOfNodes, pointToRendererPoint, getTransformForBounds } from '../utils/graph';
import { FitViewParams, FlowTransform, ZoomPanHelperFunctions, Rect, XYPosition, RevueFlowStore } from '../types'; import { FitViewParams, FlowTransform, ZoomPanHelperFunctions, Rect, XYPosition, RevueFlowStore } from '../types';
const DEFAULT_PADDING = 0.1; const DEFAULT_PADDING = 0.1;
const useZoomPanHelper = (store: RevueFlowStore) => { const useZoomPanHelper = (): { onReady: EventHookOn<ZoomPanHelperFunctions> } => {
const zoomPanHelperEvent = createEventHook<ZoomPanHelperFunctions>(); const zoomPanHelperEvent = createEventHook<ZoomPanHelperFunctions>();
const store = inject<RevueFlowStore>('store')!;
const d3Zoom = computed(() => store.d3Zoom); const d3Zoom = computed(() => store.d3Zoom);
const d3Selection = computed(() => store.d3Selection); const d3Selection = computed(() => store.d3Selection);