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,16 +2,22 @@
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)
.toBeTruthy()
.then(() => {
setTimeout(() => { setTimeout(() => {
// emit pane ready event
emits.paneReady({ emits.paneReady({
id, id,
viewport, viewport,
emits, emits,
d3Zoom,
d3Selection,
dimensions,
...rest, ...rest,
}) })
+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),