fix(core): wait until viewport helper is initialized

Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
braks
2023-02-24 20:07:13 +01:00
committed by Braks
parent 65fd5bc654
commit f2af8188e5
3 changed files with 46 additions and 23 deletions
+9 -3
View File
@@ -1,11 +1,15 @@
import { zoomIdentity } from 'd3-zoom' import { zoomIdentity } from 'd3-zoom'
import type { ComputedGetters, D3Selection, GraphNode, State, ViewportFunctions } from '~/types' import type { ComputedGetters, D3Selection, GraphNode, State, ViewportFunctions } from '~/types'
interface ExtendedViewport extends ViewportFunctions {
initialized: boolean
}
const DEFAULT_PADDING = 0.1 const DEFAULT_PADDING = 0.1
const noop = () => {} const noop = () => {}
const initialViewportHelper: ViewportFunctions = { const initialViewportHelper: ExtendedViewport = {
zoomIn: noop, zoomIn: noop,
zoomOut: noop, zoomOut: noop,
zoomTo: noop, zoomTo: noop,
@@ -15,6 +19,7 @@ const initialViewportHelper: ViewportFunctions = {
project: (position) => position, project: (position) => position,
setTransform: noop, setTransform: noop,
getTransform: () => ({ x: 0, y: 0, zoom: 1 }), getTransform: () => ({ x: 0, y: 0, zoom: 1 }),
initialized: false,
} }
export default (state: State, getters: ComputedGetters) => { export default (state: State, getters: ComputedGetters) => {
@@ -39,9 +44,10 @@ export default (state: State, getters: ComputedGetters) => {
} }
} }
return computed<ViewportFunctions>(() => { return computed<ExtendedViewport>(() => {
if (d3Zoom && d3Selection) { if (d3Zoom && d3Selection && dimensions.width && dimensions.height) {
return { return {
initialized: true,
zoomIn: (options) => { zoomIn: (options) => {
zoom(1.2, options?.duration) zoom(1.2, options?.duration)
}, },
@@ -2,23 +2,29 @@
import NodeRenderer from '../NodeRenderer/NodeRenderer.vue' import NodeRenderer from '../NodeRenderer/NodeRenderer.vue'
import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.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) let isReady = $ref(false)
onMounted(async () => { until(() => d3Zoom.value && d3Selection.value && dimensions.value.width > 0 && dimensions.value.height > 0)
setTimeout(() => { .toBeTruthy()
emits.paneReady({ .then(() => {
id, setTimeout(() => {
viewport, // emit pane ready event
emits, emits.paneReady({
...rest, id,
}) viewport,
emits,
d3Zoom,
d3Selection,
dimensions,
...rest,
})
// hide graph until nodes are ready, so we don't have jumping nodes // hide graph until nodes are ready, so we don't have jumping nodes
isReady = true isReady = true
}, 1) }, 1)
}) })
</script> </script>
<script lang="ts"> <script lang="ts">
+18 -7
View File
@@ -25,6 +25,10 @@ export function useActions(state: State, getters: ComputedGetters): Actions {
const viewportHelper = $(useViewport(state, getters)) const viewportHelper = $(useViewport(state, getters))
until(() => viewportHelper.initialized)
.toBe(true)
.then(() => {})
const nodeIds = $computed(() => state.nodes.map((n) => n.id)) const nodeIds = $computed(() => state.nodes.map((n) => n.id))
const edgeIds = $computed(() => state.edges.map((e) => e.id)) const edgeIds = $computed(() => state.edges.map((e) => e.id))
@@ -632,26 +636,33 @@ export function useActions(state: State, getters: ComputedGetters): Actions {
getIntersectingNodes, getIntersectingNodes,
isNodeIntersecting, isNodeIntersecting,
panBy, panBy,
fitView: (params = { padding: 0.1 }) => { fitView: async (params = { padding: 0.1 }) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.fitView(params) viewportHelper.fitView(params)
}, },
zoomIn: (options) => { zoomIn: async (options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomIn(options) viewportHelper.zoomIn(options)
}, },
zoomOut: (options) => { zoomOut: async (options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomOut(options) viewportHelper.zoomOut(options)
}, },
zoomTo: (zoomLevel, options) => { zoomTo: async (zoomLevel, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomTo(zoomLevel, options) viewportHelper.zoomTo(zoomLevel, options)
}, },
setTransform: (transform, options) => { setTransform: async (transform, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.setTransform(transform, options) viewportHelper.setTransform(transform, options)
}, },
getTransform: () => viewportHelper.getTransform(), getTransform: () => viewportHelper.getTransform(),
setCenter: (x, y, options) => { setCenter: async (x, y, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.setCenter(x, y, options) viewportHelper.setCenter(x, y, options)
}, },
fitBounds: (bounds, options) => { fitBounds: async (bounds, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.fitBounds(bounds, options) viewportHelper.fitBounds(bounds, options)
}, },
project: (position) => viewportHelper.project(position), project: (position) => viewportHelper.project(position),