diff --git a/packages/vue-flow/src/composables/useVueFlow.ts b/packages/vue-flow/src/composables/useVueFlow.ts index 85ac58f4..0e06fe3b 100644 --- a/packages/vue-flow/src/composables/useVueFlow.ts +++ b/packages/vue-flow/src/composables/useVueFlow.ts @@ -52,6 +52,7 @@ export class Storage { }) actions.setState(reactiveState) + if (preloadedState) { if (preloadedState.modelValue) actions.setElements(preloadedState.modelValue) if (preloadedState.nodes) actions.setNodes(preloadedState.nodes) diff --git a/packages/vue-flow/src/store/actions.ts b/packages/vue-flow/src/store/actions.ts index c727050f..cdd30a4e 100644 --- a/packages/vue-flow/src/store/actions.ts +++ b/packages/vue-flow/src/store/actions.ts @@ -41,6 +41,24 @@ export default (state: State, getters: ComputedGetters): Actions => { state.hooks.updateNodeInternals.trigger(ids) } + const zoomPanHelper = ref>() + + state.hooks.paneReady.on(({ id }) => { + zoomPanHelper.value = useZoomPanHelper(id) + }) + + const paneReady = async () => { + return new Promise>((resolve) => { + if (!zoomPanHelper.value) { + until(zoomPanHelper) + .not.toBeUndefined() + .then(() => resolve(zoomPanHelper.value!)) + } else { + resolve(zoomPanHelper.value) + } + }) + } + const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => { const changes: NodePositionChange[] = [] @@ -175,10 +193,13 @@ export default (state: State, getters: ComputedGetters): Actions => { state.translateExtent = translateExtent } - const setNodeExtent: Actions['setNodeExtent'] = (nodeExtent) => { + const setNodeExtent: Actions['setNodeExtent'] = async (nodeExtent) => { state.nodeExtent = nodeExtent - const nodeIds = getters.getNodes.value.map((n) => n.id) - updateNodeInternals(nodeIds) + + if (zoomPanHelper.value) { + const nodeIds = getters.getNodes.value.map((n) => n.id) + updateNodeInternals(nodeIds) + } } const setInteractive: Actions['setInteractive'] = (isInteractive) => { @@ -358,13 +379,15 @@ export default (state: State, getters: ComputedGetters): Actions => { const option = opts[o as keyof typeof opts] if (!skip.includes(o as keyof typeof opts) && isDef(option)) (state)[o] = option }) - if (!state.d3Zoom) + + if (!state.d3Zoom) { until(() => state.d3Zoom) .not.toBeUndefined() .then(setSkippedOptions) - else { + } else { setSkippedOptions() } + if (!state.initialized) state.initialized = true } @@ -380,24 +403,6 @@ export default (state: State, getters: ComputedGetters): Actions => { ) } - let zoomPanHelper: ReturnType - - state.hooks.paneReady.on(({ id }) => { - zoomPanHelper = useZoomPanHelper(id) - }) - - const paneReady = async () => { - return new Promise((resolve) => { - if (!zoomPanHelper) { - until(() => zoomPanHelper) - .toBeTruthy() - .then(() => resolve(zoomPanHelper)) - } else { - resolve(zoomPanHelper) - } - }) - } - return { updateNodePositions, updateNodeDimensions,