diff --git a/packages/vue-flow/src/composables/useVueFlow.ts b/packages/vue-flow/src/composables/useVueFlow.ts index 659edd25..e9830ebe 100644 --- a/packages/vue-flow/src/composables/useVueFlow.ts +++ b/packages/vue-flow/src/composables/useVueFlow.ts @@ -38,7 +38,7 @@ export class Storage { const getters = useGetters(reactiveState) - const actions = useActions(reactiveState, getters) + const actions = useActions(reactiveState, getters, id) const hooksOn = {} Object.entries(reactiveState.hooks).forEach(([n, h]) => { diff --git a/packages/vue-flow/src/composables/useZoomPanHelper.ts b/packages/vue-flow/src/composables/useZoomPanHelper.ts index 9fd79b8a..9a516aa3 100644 --- a/packages/vue-flow/src/composables/useZoomPanHelper.ts +++ b/packages/vue-flow/src/composables/useZoomPanHelper.ts @@ -28,7 +28,7 @@ const untilDimensions = async (dimensions: Dimensions, getNodes: Getters['getNod return true } -export default (): ViewportFunctions => { +export default (vueFlowId?: string): ViewportFunctions => { const { onPaneReady, nodes, @@ -42,7 +42,7 @@ export default (): ViewportFunctions => { snapToGrid, snapGrid, getNodes, - } = $(useVueFlow()) + } = $(useVueFlow({ id: vueFlowId })) let hasDimensions = $ref(false) diff --git a/packages/vue-flow/src/container/Viewport/Transform.vue b/packages/vue-flow/src/container/Viewport/Transform.vue index 596b7ca1..2963a447 100644 --- a/packages/vue-flow/src/container/Viewport/Transform.vue +++ b/packages/vue-flow/src/container/Viewport/Transform.vue @@ -1,12 +1,11 @@ diff --git a/packages/vue-flow/src/store/actions.ts b/packages/vue-flow/src/store/actions.ts index f061be9b..cb747245 100644 --- a/packages/vue-flow/src/store/actions.ts +++ b/packages/vue-flow/src/store/actions.ts @@ -34,8 +34,9 @@ import { pointToRendererPoint, updateEdgeAction, } from '~/utils' +import { useZoomPanHelper } from '~/composables' -export default (state: State, getters: ComputedGetters): Actions => { +export default (state: State, getters: ComputedGetters, id: string): Actions => { const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => { const changes: NodePositionChange[] = [] @@ -338,10 +339,20 @@ export default (state: State, getters: ComputedGetters): Actions => { ) } - const paneNotReady = () => { - console.warn( - `[Vue Flow]: Used viewpane function before pane was ready. Use viewpane functions *after* onPaneReady is emitted.`, - ) + let zoomPanHelper: ReturnType + const paneReady = async () => { + const zoompan = useZoomPanHelper(id) + + return new Promise>((resolve) => { + if (!zoomPanHelper) { + state.hooks.paneReady.on(() => { + resolve(zoompan) + zoomPanHelper = zoompan + }) + } else { + resolve(zoomPanHelper) + } + }) } return { @@ -368,21 +379,40 @@ export default (state: State, getters: ComputedGetters): Actions => { removeSelectedEdges, setInteractive, setState, - fitView: paneNotReady, - zoomIn: paneNotReady, - zoomOut: paneNotReady, - zoomTo: paneNotReady, - setTransform: paneNotReady, + fitView: async (params = { padding: 0.1 }) => { + const { fitView } = await paneReady() + fitView(params) + }, + zoomIn: async (options) => { + const { zoomIn } = await paneReady() + zoomIn(options) + }, + zoomOut: async (options) => { + const { zoomOut } = await paneReady() + zoomOut(options) + }, + zoomTo: async (zoomLevel, options) => { + const { zoomTo } = await paneReady() + zoomTo(zoomLevel, options) + }, + setTransform: async (transform, options) => { + const { setTransform } = await paneReady() + setTransform(transform, options) + }, getTransform: () => ({ x: state.viewport.x, y: state.viewport.y, zoom: state.viewport.zoom, }), - setCenter: paneNotReady, - fitBounds: paneNotReady, - project(position) { - return pointToRendererPoint(position, state.viewport, state.snapToGrid, state.snapGrid) + setCenter: async (x, y, options) => { + const { setCenter } = await paneReady() + setCenter(x, y, options) }, + fitBounds: async (bounds, options) => { + const { fitBounds } = await paneReady() + fitBounds(bounds, options) + }, + project: (position) => pointToRendererPoint(position, state.viewport, state.snapToGrid, state.snapGrid), toObject, $reset: () => { setState(useState())