Skip to content

Commit f2af818

Browse files
committed
fix(core): wait until viewport helper is initialized
Signed-off-by: braks <[email protected]>
1 parent 65fd5bc commit f2af818

File tree

3 files changed

+47
-24
lines changed

3 files changed

+47
-24
lines changed

packages/core/src/composables/useViewport.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { zoomIdentity } from 'd3-zoom'
22
import type { ComputedGetters, D3Selection, GraphNode, State, ViewportFunctions } from '~/types'
33

4+
interface ExtendedViewport extends ViewportFunctions {
5+
initialized: boolean
6+
}
7+
48
const DEFAULT_PADDING = 0.1
59

610
const noop = () => {}
711

8-
const initialViewportHelper: ViewportFunctions = {
12+
const initialViewportHelper: ExtendedViewport = {
913
zoomIn: noop,
1014
zoomOut: noop,
1115
zoomTo: noop,
@@ -15,6 +19,7 @@ const initialViewportHelper: ViewportFunctions = {
1519
project: (position) => position,
1620
setTransform: noop,
1721
getTransform: () => ({ x: 0, y: 0, zoom: 1 }),
22+
initialized: false,
1823
}
1924

2025
export default (state: State, getters: ComputedGetters) => {
@@ -39,9 +44,10 @@ export default (state: State, getters: ComputedGetters) => {
3944
}
4045
}
4146

42-
return computed<ViewportFunctions>(() => {
43-
if (d3Zoom && d3Selection) {
47+
return computed<ExtendedViewport>(() => {
48+
if (d3Zoom && d3Selection && dimensions.width && dimensions.height) {
4449
return {
50+
initialized: true,
4551
zoomIn: (options) => {
4652
zoom(1.2, options?.duration)
4753
},

packages/core/src/container/Viewport/Transform.vue

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,29 @@
22
import NodeRenderer from '../NodeRenderer/NodeRenderer.vue'
33
import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.vue'
44
5-
const { id, viewport, emits, ...rest } = useVueFlow()
5+
const { id, viewport, emits, d3Zoom, d3Selection, dimensions, ...rest } = useVueFlow()
66
77
let isReady = $ref(false)
88
9-
onMounted(async () => {
10-
setTimeout(() => {
11-
emits.paneReady({
12-
id,
13-
viewport,
14-
emits,
15-
...rest,
16-
})
17-
18-
// hide graph until nodes are ready, so we don't have jumping nodes
19-
isReady = true
20-
}, 1)
21-
})
9+
until(() => d3Zoom.value && d3Selection.value && dimensions.value.width > 0 && dimensions.value.height > 0)
10+
.toBeTruthy()
11+
.then(() => {
12+
setTimeout(() => {
13+
// emit pane ready event
14+
emits.paneReady({
15+
id,
16+
viewport,
17+
emits,
18+
d3Zoom,
19+
d3Selection,
20+
dimensions,
21+
...rest,
22+
})
23+
24+
// hide graph until nodes are ready, so we don't have jumping nodes
25+
isReady = true
26+
}, 1)
27+
})
2228
</script>
2329

2430
<script lang="ts">

packages/core/src/store/actions.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export function useActions(state: State, getters: ComputedGetters): Actions {
2525

2626
const viewportHelper = $(useViewport(state, getters))
2727

28+
until(() => viewportHelper.initialized)
29+
.toBe(true)
30+
.then(() => {})
31+
2832
const nodeIds = $computed(() => state.nodes.map((n) => n.id))
2933
const edgeIds = $computed(() => state.edges.map((e) => e.id))
3034

@@ -632,26 +636,33 @@ export function useActions(state: State, getters: ComputedGetters): Actions {
632636
getIntersectingNodes,
633637
isNodeIntersecting,
634638
panBy,
635-
fitView: (params = { padding: 0.1 }) => {
639+
fitView: async (params = { padding: 0.1 }) => {
640+
await until(() => viewportHelper.initialized).toBe(true)
636641
viewportHelper.fitView(params)
637642
},
638-
zoomIn: (options) => {
643+
zoomIn: async (options) => {
644+
await until(() => viewportHelper.initialized).toBe(true)
639645
viewportHelper.zoomIn(options)
640646
},
641-
zoomOut: (options) => {
647+
zoomOut: async (options) => {
648+
await until(() => viewportHelper.initialized).toBe(true)
642649
viewportHelper.zoomOut(options)
643650
},
644-
zoomTo: (zoomLevel, options) => {
651+
zoomTo: async (zoomLevel, options) => {
652+
await until(() => viewportHelper.initialized).toBe(true)
645653
viewportHelper.zoomTo(zoomLevel, options)
646654
},
647-
setTransform: (transform, options) => {
655+
setTransform: async (transform, options) => {
656+
await until(() => viewportHelper.initialized).toBe(true)
648657
viewportHelper.setTransform(transform, options)
649658
},
650659
getTransform: () => viewportHelper.getTransform(),
651-
setCenter: (x, y, options) => {
660+
setCenter: async (x, y, options) => {
661+
await until(() => viewportHelper.initialized).toBe(true)
652662
viewportHelper.setCenter(x, y, options)
653663
},
654-
fitBounds: (bounds, options) => {
664+
fitBounds: async (bounds, options) => {
665+
await until(() => viewportHelper.initialized).toBe(true)
655666
viewportHelper.fitBounds(bounds, options)
656667
},
657668
project: (position) => viewportHelper.project(position),

0 commit comments

Comments
 (0)