fix(core): wait until viewport helper is initialized
Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -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">
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user