From 58a8f9d4df7acdd26e069f4f1448ec11c0be0ef7 Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Sun, 28 Nov 2021 22:57:38 +0100 Subject: [PATCH] refactor(store)!: remove pinia * replace pinia with a reactive state object and inject/provide Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com> update(store)!: inject store if possible, otherwise create a new one by id Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com> --- package.json | 3 +- .../NodesSelection/NodesSelection.vue | 2 +- src/composables/index.ts | 2 +- src/composables/useHandle.ts | 4 +- src/composables/useHooks.ts | 4 +- src/composables/useStore.ts | 70 ++--- src/composables/useVueFlow.ts | 8 +- src/composables/useZoomPanHelper.ts | 12 +- src/container/SelectionPane/SelectionPane.vue | 6 +- src/container/VueFlow/VueFlow.vue | 39 ++- src/store/actions.ts | 169 ++++++++++++ src/store/getters.ts | 73 ++++++ src/store/index.ts | 2 +- src/store/state.ts | 5 + src/store/stateStore.ts | 241 ------------------ src/store/store.ts | 16 ++ src/types/connection.ts | 3 - src/types/store.ts | 51 ++-- src/utils/edge.ts | 6 +- src/utils/graph.ts | 8 +- src/utils/store.ts | 17 +- 21 files changed, 387 insertions(+), 354 deletions(-) create mode 100644 src/store/actions.ts create mode 100644 src/store/getters.ts create mode 100644 src/store/state.ts delete mode 100644 src/store/stateStore.ts create mode 100644 src/store/store.ts diff --git a/package.json b/package.json index 11f46c01..d48e04e3 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,7 @@ "d3": "^7.1.1", "d3-selection": "^3.0.0", "d3-zoom": "^3.0.0", - "microdiff": "^1.2.0", - "pinia": "^2.0.0-rc.10" + "microdiff": "^1.2.0" }, "devDependencies": { "@antfu/eslint-config": "^0.9.0", diff --git a/src/components/NodesSelection/NodesSelection.vue b/src/components/NodesSelection/NodesSelection.vue index fd0f7ec5..872519ff 100644 --- a/src/components/NodesSelection/NodesSelection.vue +++ b/src/components/NodesSelection/NodesSelection.vue @@ -54,7 +54,7 @@ export default { @stop="onStop" >
{ hoveredHandle?.classList.remove('vue-flow__handle-connecting') } -export default (store = useStore()) => +export default (store: ReactiveFlowStore = useStore()) => ( event: MouseEvent, handleId: ElementId, diff --git a/src/composables/useHooks.ts b/src/composables/useHooks.ts index ace4b256..3616b18d 100644 --- a/src/composables/useHooks.ts +++ b/src/composables/useHooks.ts @@ -1,4 +1,4 @@ -import { EmitFunc, FlowHooks, FlowEvents, FlowStore } from '~/types' +import { EmitFunc, FlowHooks, FlowEvents, FlowStore, ReactiveFlowStore } from '~/types' // flow event hooks export const createHooks = (): FlowHooks => ({ @@ -49,4 +49,4 @@ const bind = (emit: EmitFunc, hooks: FlowHooks) => { } } -export default (store: FlowStore, emit: EmitFunc) => bind(emit, store.hooks) +export default (store: ReactiveFlowStore, emit: EmitFunc) => bind(emit, store.hooks) diff --git a/src/composables/useStore.ts b/src/composables/useStore.ts index b43c0f58..9687705a 100644 --- a/src/composables/useStore.ts +++ b/src/composables/useStore.ts @@ -1,38 +1,46 @@ -import { FlowExportObject, FlowOptions, FlowState } from '~/types' -import { useStateStore } from '~/store' +import { FlowExportObject, FlowOptions, FlowState, ReactiveFlowStore } from '~/types' +import { useNewStore } from '~/store' import { Store } from '~/context' import { onLoadToObject, initialState } from '~/utils' let id = 0 -export default (options?: Partial, key?: string) => { - let store = inject(Store, undefined) - if (!store) { - const withStorage = options?.storageKey ?? key ?? false - if (import.meta.env.DEV) console.warn('store context not found; creating default store') - let storedState = ref() - const initial = initialState() - const storageKey = key ?? `vue-flow-${id++}` - const preloadedState = { - ...initial, - ...(options as FlowState), - } - if (withStorage) { - storedState = useStorage(storageKey, { elements: [], position: [0, 0], zoom: 0 }) - if (storedState.value) { - preloadedState.elements = storedState.value.elements ?? options?.elements ?? [] - if (storedState.value.position && storedState.value.zoom) - preloadedState.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom] - } - } - store = useStateStore(storageKey, preloadedState)() - if (withStorage && storageKey === store.$id) { - const toObject = onLoadToObject(store) - store.$subscribe(() => { - storedState.value = toObject() - }) - } - provide(Store, store) +export const createStore = (options?: FlowOptions) => { + const withStorage = options?.storageKey ?? false + let storedState = ref() + const initial = initialState() + const storageKey = options?.id ?? `vue-flow-${id++}` + const preloadedState = { + ...initial, + ...(options as FlowState), + } + if (withStorage) { + storedState = useStorage(storageKey, { elements: [], position: [0, 0], zoom: 0 }) + if (storedState.value) { + preloadedState.elements = storedState.value.elements ?? options?.elements ?? [] + if (storedState.value.position && storedState.value.zoom) + preloadedState.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom] + } + } + const store = useNewStore(storageKey, preloadedState) + if (withStorage && storageKey === store.id?.value) { + const toObject = onLoadToObject(store.state) + watch( + store.state, + () => { + storedState.value = toObject() + }, + { deep: true }, + ) } - return store } + +export default (options?: FlowOptions): ReactiveFlowStore => { + let store = options?.id ? createStore(options) : inject(Store, undefined) + if (!store) { + store = createStore(options) + } + provide(Store, store) + + return reactive(store) +} diff --git a/src/composables/useVueFlow.ts b/src/composables/useVueFlow.ts index a89c5915..f3182923 100644 --- a/src/composables/useVueFlow.ts +++ b/src/composables/useVueFlow.ts @@ -1,10 +1,12 @@ import useStore from './useStore' import useHooks from './useHooks' -import { EmitFunc, FlowOptions, FlowStore } from '~/types' +import { EmitFunc, ReactiveFlowStore } from '~/types' -export const initFlow = (emit: EmitFunc, key?: string, store = useStore(undefined, key)) => { +let key = 0 +export const initFlow = (emit: EmitFunc, id = `vue-flow-${key++}`): ReactiveFlowStore => { + const store = useStore({ id }) useHooks(store, emit) return store } -export default (options?: Partial): FlowStore => useStore(options) +export default useStore diff --git a/src/composables/useZoomPanHelper.ts b/src/composables/useZoomPanHelper.ts index 3eb5178c..a0e8ffae 100644 --- a/src/composables/useZoomPanHelper.ts +++ b/src/composables/useZoomPanHelper.ts @@ -1,11 +1,11 @@ import { zoomIdentity } from 'd3-zoom' import useStore from './useStore' import { getRectOfNodes, pointToRendererPoint, getTransformForBounds, isGraphNode } from '~/utils' -import { FitViewParams, FlowTransform, GraphNode, Rect, UseZoomPanHelper, XYPosition } from '~/types' +import { FitViewParams, FlowTransform, GraphNode, ReactiveFlowStore, Rect, UseZoomPanHelper, XYPosition } from '~/types' const DEFAULT_PADDING = 0.1 -export default (store = useStore()): UseZoomPanHelper => { +export default (store: ReactiveFlowStore = useStore()): UseZoomPanHelper => { return { zoomIn: () => store.d3Selection && store.d3Zoom?.scaleBy(store.d3Selection, 1.2), zoomOut: () => store.d3Selection && store.d3Zoom?.scaleBy(store.d3Selection, 1 / 1.2), @@ -14,7 +14,13 @@ export default (store = useStore()): UseZoomPanHelper => { const nextTransform = zoomIdentity.translate(transform.x, transform.y).scale(transform.zoom) store.d3Selection && store.d3Zoom?.transform(store.d3Selection, nextTransform) }, - fitView: (options: FitViewParams = { padding: DEFAULT_PADDING, includeHiddenNodes: false, transitionDuration: 0 }) => { + fitView: ( + options: FitViewParams = { + padding: DEFAULT_PADDING, + includeHiddenNodes: false, + transitionDuration: 0, + }, + ) => { if (!store.getNodes.length) return let nodes: GraphNode[] = [] diff --git a/src/container/SelectionPane/SelectionPane.vue b/src/container/SelectionPane/SelectionPane.vue index 367732be..2197292f 100644 --- a/src/container/SelectionPane/SelectionPane.vue +++ b/src/container/SelectionPane/SelectionPane.vue @@ -70,12 +70,12 @@ export default { diff --git a/src/container/VueFlow/VueFlow.vue b/src/container/VueFlow/VueFlow.vue index e4368670..28808cb6 100644 --- a/src/container/VueFlow/VueFlow.vue +++ b/src/container/VueFlow/VueFlow.vue @@ -1,5 +1,5 @@ -onBeforeUnmount(() => store?.$dispose()) - -