fix(core): use noop viewport operations instead of waiting for promise

This commit is contained in:
braks
2023-07-19 19:12:29 +02:00
committed by Braks
parent 715206404b
commit 4d5bbab506
4 changed files with 46 additions and 92 deletions
+1 -8
View File
@@ -36,14 +36,7 @@ export function useViewport(state: State, getters: ComputedGetters) {
nodesInitialized.value = true
})
const isReady = computed(
() =>
!!d3Zoom &&
!!d3Selection &&
!!dimensions.width &&
!!dimensions.height &&
(getNodes.value.length ? nodesInitialized.value : true),
)
const isReady = computed(() => !!d3Zoom && !!d3Selection && !!dimensions.width && !!dimensions.height && nodesInitialized.value)
function zoom(scale: number, duration?: number) {
if (d3Selection && d3Zoom) {
+7 -7
View File
@@ -39,13 +39,6 @@ export class Storage {
const reactiveState = reactive(state)
const nodeIds = computed(() => reactiveState.nodes.map((n) => n.id))
const edgeIds = computed(() => reactiveState.edges.map((e) => e.id))
const getters = useGetters(reactiveState, nodeIds, edgeIds)
const actions = useActions(reactiveState, getters, nodeIds, edgeIds)
const hooksOn = <any>{}
Object.entries(reactiveState.hooks).forEach(([n, h]) => {
const name = `on${n.charAt(0).toUpperCase() + n.slice(1)}`
@@ -57,6 +50,13 @@ export class Storage {
emits[n] = h.trigger
})
const nodeIds = computed(() => reactiveState.nodes.map((n) => n.id))
const edgeIds = computed(() => reactiveState.edges.map((e) => e.id))
const getters = useGetters(reactiveState, nodeIds, edgeIds)
const actions = useActions(id, emits, hooksOn, reactiveState, getters, nodeIds, edgeIds)
actions.setState(reactiveState)
const flow: VueFlowStore = {
@@ -5,27 +5,16 @@ import { useVueFlow } from '../../composables'
import NodeRenderer from '../NodeRenderer/NodeRenderer.vue'
import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.vue'
const { id, viewport, emits, d3Zoom, d3Selection, dimensions, ...rest } = useVueFlow()
const { id, viewport, d3Zoom, d3Selection, dimensions } = useVueFlow()
const viewportReady = ref(!isClient)
until(() => d3Zoom.value && d3Selection.value && dimensions.value.width > 0 && dimensions.value.height > 0)
.toBeTruthy()
.toBe(true)
.then(() => {
// emit pane ready event
emits.paneReady({
id,
viewport,
emits,
d3Zoom,
d3Selection,
dimensions,
...rest,
})
setTimeout(() => {
viewportReady.value = true
}, 0)
}, 1)
})
</script>
+35 -63
View File
@@ -48,14 +48,15 @@ import {
} from '~/utils'
export function useActions(
id: string,
emits: any,
hooksOn: any,
state: State,
getters: ComputedGetters,
nodeIds: ComputedRef<string[]>,
edgeIds: ComputedRef<string[]>,
): Actions {
let fitViewOnInitDone = false
const viewportHelper = $(useViewport(state, getters))
const viewportHelper = useViewport(state, getters)
const updateNodeInternals: Actions['updateNodeInternals'] = (ids) => {
const updateIds = ids ?? nodeIds.value ?? []
@@ -190,16 +191,6 @@ export function useActions(
return res
}, [])
if (state.fitViewOnInit && !fitViewOnInitDone) {
until(() => viewportHelper.initialized)
.toBe(true)
.then(() => {
viewportHelper.fitView()
})
fitViewOnInitDone = true
}
if (changes.length) {
state.hooks.nodesChange.trigger(changes)
}
@@ -783,45 +774,6 @@ export function useActions(
}
}
const fitView: Actions['fitView'] = async (params = { padding: 0.1 }) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.fitView(params)
}
const zoomIn: Actions['zoomIn'] = async (options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomIn(options)
}
const zoomOut: Actions['zoomOut'] = async (options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomOut(options)
}
const zoomTo: Actions['zoomTo'] = async (zoomLevel, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.zoomTo(zoomLevel, options)
}
const setTransform: Actions['setTransform'] = async (transform, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.setTransform(transform, options)
}
const getTransform: Actions['getTransform'] = () => viewportHelper.getTransform()
const setCenter: Actions['setCenter'] = async (x, y, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.setCenter(x, y, options)
}
const fitBounds: Actions['fitBounds'] = async (bounds, options) => {
await until(() => viewportHelper.initialized).toBe(true)
viewportHelper.fitBounds(bounds, options)
}
const project: Actions['project'] = (position) => viewportHelper.project(position)
const toObject: Actions['toObject'] = () => {
// we have to stringify/parse so objects containing refs (like nodes and edges) can potentially be saved in a storage
return JSON.parse(
@@ -866,7 +818,7 @@ export function useActions(
}
if (position) {
setTransform({ x: position[0], y: position[1], zoom: zoom || 1 })
viewportHelper.value.setTransform({ x: position[0], y: position[1], zoom: zoom || 1 })
}
}
@@ -896,7 +848,7 @@ export function useActions(
setState(resetState)
}
return {
const actions: Actions = {
updateNodePositions,
updateNodeDimensions,
setElements,
@@ -929,19 +881,39 @@ export function useActions(
getIntersectingNodes,
isNodeIntersecting,
panBy,
fitView,
zoomIn,
zoomOut,
zoomTo,
setTransform,
getTransform,
setCenter,
fitBounds,
project,
fitView: (params) => viewportHelper.value.fitView(params),
zoomIn: (transitionOpts) => viewportHelper.value.zoomIn(transitionOpts),
zoomOut: (transitionOpts) => viewportHelper.value.zoomOut(transitionOpts),
zoomTo: (zoomLevel, transitionOpts) => viewportHelper.value.zoomTo(zoomLevel, transitionOpts),
setTransform: (params, transitionOpts) => viewportHelper.value.setTransform(params, transitionOpts),
getTransform: () => viewportHelper.value.getTransform(),
setCenter: (x, y, opts) => viewportHelper.value.setCenter(x, y, opts),
fitBounds: (params, opts) => viewportHelper.value.fitBounds(params, opts),
project: (params) => viewportHelper.value.project(params),
toObject,
fromObject,
updateNodeInternals,
$reset,
$destroy: () => {},
}
until(() => viewportHelper.value.initialized)
.toBe(true, { flush: 'pre' })
.then(() => {
if (state.fitViewOnInit) {
viewportHelper.value.fitView()
}
state.hooks.paneReady.trigger({
id,
emits,
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : 'UNKNOWN',
...hooksOn,
...state,
...getters,
...actions,
})
})
return actions
}