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), +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] } - 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(() => { + } + const store = useNewStore(storageKey, preloadedState) + if (withStorage && storageKey === store.id?.value) { + const toObject = onLoadToObject(store.state) + watch( + store.state, + () => { storedState.value = toObject() - }) - } - provide(Store, store) + }, + { 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()) - -