diff --git a/packages/core/src/composables/useViewport.ts b/packages/core/src/composables/useViewport.ts index 6d17e7ba..9206671a 100644 --- a/packages/core/src/composables/useViewport.ts +++ b/packages/core/src/composables/useViewport.ts @@ -1,11 +1,15 @@ import { zoomIdentity } from 'd3-zoom' import type { ComputedGetters, D3Selection, GraphNode, State, ViewportFunctions } from '~/types' +interface ExtendedViewport extends ViewportFunctions { + initialized: boolean +} + const DEFAULT_PADDING = 0.1 const noop = () => {} -const initialViewportHelper: ViewportFunctions = { +const initialViewportHelper: ExtendedViewport = { zoomIn: noop, zoomOut: noop, zoomTo: noop, @@ -15,6 +19,7 @@ const initialViewportHelper: ViewportFunctions = { project: (position) => position, setTransform: noop, getTransform: () => ({ x: 0, y: 0, zoom: 1 }), + initialized: false, } export default (state: State, getters: ComputedGetters) => { @@ -39,9 +44,10 @@ export default (state: State, getters: ComputedGetters) => { } } - return computed(() => { - if (d3Zoom && d3Selection) { + return computed(() => { + if (d3Zoom && d3Selection && dimensions.width && dimensions.height) { return { + initialized: true, zoomIn: (options) => { zoom(1.2, options?.duration) }, diff --git a/packages/core/src/container/Viewport/Transform.vue b/packages/core/src/container/Viewport/Transform.vue index d25069a6..7015b9c3 100644 --- a/packages/core/src/container/Viewport/Transform.vue +++ b/packages/core/src/container/Viewport/Transform.vue @@ -2,23 +2,29 @@ import NodeRenderer from '../NodeRenderer/NodeRenderer.vue' import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.vue' -const { id, viewport, emits, ...rest } = useVueFlow() +const { id, viewport, emits, d3Zoom, d3Selection, dimensions, ...rest } = useVueFlow() let isReady = $ref(false) -onMounted(async () => { - setTimeout(() => { - emits.paneReady({ - id, - viewport, - emits, - ...rest, - }) +until(() => d3Zoom.value && d3Selection.value && dimensions.value.width > 0 && dimensions.value.height > 0) + .toBeTruthy() + .then(() => { + setTimeout(() => { + // emit pane ready event + emits.paneReady({ + id, + viewport, + emits, + d3Zoom, + d3Selection, + dimensions, + ...rest, + }) - // hide graph until nodes are ready, so we don't have jumping nodes - isReady = true - }, 1) -}) + // hide graph until nodes are ready, so we don't have jumping nodes + isReady = true + }, 1) + })