From d335944e564876741bc0b7b7b621196b619494b1 Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sat, 20 Nov 2021 15:52:28 +0100 Subject: [PATCH] feat: offload parsing elements to worker * when we're not in ssr environment we use a web worker to parse the elements as this blocks the main thread when there's a good amount of nodes/edges to parse * when in ssr we don't really care about the main thread blocking so we just parse them like usual * update vite to latest Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com> --- package.json | 2 +- src/container/SelectionPane/SelectionPane.vue | 8 +- src/container/VueFlow/VueFlow.vue | 27 +++++- src/container/ZoomPane/ZoomPane.vue | 19 ---- src/store/index.ts | 91 +------------------ src/store/stateStore.ts | 27 ++++-- src/store/utils.ts | 90 +++++++++++++++++- src/workers/parseElements.ts | 80 ++++++++++++++++ yarn.lock | 8 +- 9 files changed, 222 insertions(+), 130 deletions(-) create mode 100644 src/workers/parseElements.ts diff --git a/package.json b/package.json index 43753db4..6ee0ddf8 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "typescript": "^4.4.4", "typescript-transform-paths": "^3.3.1", "unplugin-auto-import": "^0.4.12", - "vite": "^2.6.10", + "vite": "^2.6.14", "vite-svg-loader": "^2.2.0", "vue": "^3.2.22", "vue-router": "^4.0.12", diff --git a/src/container/SelectionPane/SelectionPane.vue b/src/container/SelectionPane/SelectionPane.vue index cff5dfe8..69938c14 100644 --- a/src/container/SelectionPane/SelectionPane.vue +++ b/src/container/SelectionPane/SelectionPane.vue @@ -46,9 +46,13 @@ onMounted(() => { } }) - useKeyPress(props.multiSelectionKeyCode, (keyPressed) => (store.multiSelectionActive = keyPressed)) + useKeyPress(props.multiSelectionKeyCode, (keyPressed) => { + store.multiSelectionActive = keyPressed + }) - useKeyPress(props.selectionKeyCode, (keyPressed) => (selectionKeyPresed.value = keyPressed)) + useKeyPress(props.selectionKeyCode, (keyPressed) => { + selectionKeyPresed.value = keyPressed + }) }) const userSelection = computed(() => selectionKeyPresed.value && (store.selectionActive || store.elementsSelectable)) const nodesSelectionActive = computed(() => store.nodesSelectionActive) diff --git a/src/container/VueFlow/VueFlow.vue b/src/container/VueFlow/VueFlow.vue index 63ed9574..f0d8371f 100644 --- a/src/container/VueFlow/VueFlow.vue +++ b/src/container/VueFlow/VueFlow.vue @@ -15,12 +15,14 @@ import { EdgeTypes, FlowStore, FlowState, + FlowInstance, } from '../../types' import ZoomPane from '../../container/ZoomPane/ZoomPane.vue' import SelectionPane from '../../container/SelectionPane/SelectionPane.vue' import NodeRenderer from '../../container/NodeRenderer/NodeRenderer.vue' import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue' -import { createHooks, initFlow } from '../../composables' +import { createHooks, initFlow, useZoomPanHelper } from '../../composables' +import { onLoadGetElements, onLoadProject, onLoadToObject } from '~/utils' export interface FlowProps extends Partial { id?: string @@ -110,7 +112,7 @@ const options = Object.assign({}, props, store.$state, props) // if there are preloaded elements we overwrite the current elements with the stored ones if (store.elements.length) elements.value = store.elements -const init = (state: FlowState) => { +const init = async (state: FlowState) => { for (const opt of Object.keys(state)) { const val = state[opt as keyof FlowState] if (typeof val !== 'undefined') { @@ -119,7 +121,7 @@ const init = (state: FlowState) => { } else (store as any)[opt] = val } } - store.setElements(elements.value) + await store.setElements(elements.value) store.setMinZoom(state.minZoom) store.setMaxZoom(state.maxZoom) store.setTranslateExtent(state.translateExtent) @@ -145,7 +147,24 @@ watch( }, { flush: 'post', deep: true }, ) -init(options) +const { zoomIn, zoomOut, zoomTo, transform: setTransform, fitView } = useZoomPanHelper(store) + +invoke(async () => { + await init(options) + const instance: FlowInstance = { + fitView: (params = { padding: 0.1 }) => fitView(params), + zoomIn, + zoomOut, + zoomTo, + setTransform, + project: onLoadProject(store), + getElements: onLoadGetElements(store), + toObject: onLoadToObject(store), + } + store.hooks.load.trigger(instance) + store.isReady = true + store.instance = instance +})