update: remove useHooks usage

Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
Braks
2021-11-18 23:17:09 +01:00
parent 99dbd4b2cc
commit 470ab3782a
16 changed files with 97 additions and 81 deletions
+3 -4
View File
@@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useHooks, useStore, getEdgeCenter, getBezierPath, getMarkerEnd, ArrowHeadType, Edge, ElementId, Position } from '~/index' import { getEdgeCenter, getBezierPath, getMarkerEnd, ArrowHeadType, Edge, ElementId, Position, useVueFlow } from '~/index'
interface CustomEdgeProps<T = any> extends Edge<T> { interface CustomEdgeProps<T = any> extends Edge<T> {
id: ElementId id: ElementId
@@ -15,12 +15,11 @@ interface CustomEdgeProps<T = any> extends Edge<T> {
} }
const props = defineProps<CustomEdgeProps>() const props = defineProps<CustomEdgeProps>()
const store = useStore() const store = useVueFlow()
const hooks = useHooks()
const onEdgeClick = (evt: Event, id: string) => { const onEdgeClick = (evt: Event, id: string) => {
const edge = store.edges.find((edge) => edge.id === id) const edge = store.edges.find((edge) => edge.id === id)
if (edge) { if (edge) {
hooks.elementsRemove.trigger([edge]) store.hooks.elementsRemove.trigger([edge])
} }
evt.stopPropagation() evt.stopPropagation()
alert(`remove ${id}`) alert(`remove ${id}`)
+8 -9
View File
@@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useHandle, useHooks, useStore } from '../../composables' import { useHandle, useStore } from '../../composables'
import { ConnectionMode, Edge, EdgePositions, EdgeType, Position } from '../../types' import { ConnectionMode, Edge, EdgePositions, EdgeType, Position } from '../../types'
import EdgeAnchor from './EdgeAnchor.vue' import EdgeAnchor from './EdgeAnchor.vue'
import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils' import { getEdgePositions, getHandle, getSourceTargetNodes, isEdgeVisible } from '~/container/EdgeRenderer/utils'
@@ -15,7 +15,6 @@ interface EdgeProps {
const props = withDefaults(defineProps<EdgeProps>(), {}) const props = withDefaults(defineProps<EdgeProps>(), {})
const store = useStore() const store = useStore()
const hooks = useHooks()
const onEdgeClick = (event: MouseEvent) => { const onEdgeClick = (event: MouseEvent) => {
if (store.elementsSelectable) { if (store.elementsSelectable) {
@@ -23,20 +22,20 @@ const onEdgeClick = (event: MouseEvent) => {
store.addSelectedElements([props.edge]) store.addSelectedElements([props.edge])
} }
hooks.edgeClick.trigger({ event, edge: props.edge }) store.hooks.edgeClick.trigger({ event, edge: props.edge })
} }
const onEdgeContextMenu = (event: MouseEvent) => const onEdgeContextMenu = (event: MouseEvent) =>
hooks.edgeContextMenu.trigger({ store.hooks.edgeContextMenu.trigger({
event, event,
edge: props.edge, edge: props.edge,
}) })
const onEdgeMouseEnter = (event: MouseEvent) => hooks.edgeMouseEnter.trigger({ event, edge: props.edge }) const onEdgeMouseEnter = (event: MouseEvent) => store.hooks.edgeMouseEnter.trigger({ event, edge: props.edge })
const onEdgeMouseMove = (event: MouseEvent) => hooks.edgeMouseMove.trigger({ event, edge: props.edge }) const onEdgeMouseMove = (event: MouseEvent) => store.hooks.edgeMouseMove.trigger({ event, edge: props.edge })
const onEdgeMouseLeave = (event: MouseEvent) => hooks.edgeMouseLeave.trigger({ event, edge: props.edge }) const onEdgeMouseLeave = (event: MouseEvent) => store.hooks.edgeMouseLeave.trigger({ event, edge: props.edge })
const handler = useHandle() const handler = useHandle()
const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => { const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
@@ -45,9 +44,9 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
const isValidConnection = () => true const isValidConnection = () => true
const isTarget = isSourceHandle const isTarget = isSourceHandle
hooks.edgeUpdateStart.trigger({ event, edge: props.edge }) store.hooks.edgeUpdateStart.trigger({ event, edge: props.edge })
handler(event, handleId, nodeId, isTarget, isValidConnection, isSourceHandle ? 'target' : 'source', (connection) => handler(event, handleId, nodeId, isTarget, isValidConnection, isSourceHandle ? 'target' : 'source', (connection) =>
hooks.edgeUpdate.trigger({ edge: props.edge, connection }), store.hooks.edgeUpdate.trigger({ edge: props.edge, connection }),
) )
} }
+2 -3
View File
@@ -1,7 +1,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useHandle, useHooks, useStore } from '../../composables' import { useHandle, useStore } from '../../composables'
import { Position, ValidConnectionFunc } from '../../types' import { Position, ValidConnectionFunc } from '../../types'
import { NodeId } from '~/context' import { NodeId } from '../../context'
interface HandleProps { interface HandleProps {
id?: string id?: string
@@ -19,7 +19,6 @@ const props = withDefaults(defineProps<HandleProps>(), {
}) })
const store = useStore() const store = useStore()
const hooks = useHooks()
const nodeId = inject(NodeId)! const nodeId = inject(NodeId)!
const handler = useHandle() const handler = useHandle()
+11 -12
View File
@@ -1,8 +1,8 @@
<script lang="ts" setup> <script lang="ts" setup>
import { DraggableEventListener, DraggableCore } from '@braks/revue-draggable' import { DraggableEventListener, DraggableCore } from '@braks/revue-draggable'
import { useHooks, useStore } from '../../composables' import { useStore } from '../../composables'
import { Node, NodeType, SnapGrid } from '../../types' import { Node, NodeType, SnapGrid } from '../../types'
import { NodeId } from '~/context' import { NodeId } from '../../context'
interface NodeProps { interface NodeProps {
node: Node node: Node
@@ -18,7 +18,6 @@ const props = withDefaults(defineProps<NodeProps>(), {
}) })
const store = useStore() const store = useStore()
const hooks = useHooks()
provide(NodeId, props.node.id) provide(NodeId, props.node.id)
const nodeElement = templateRef<HTMLDivElement>('node-element', null) const nodeElement = templateRef<HTMLDivElement>('node-element', null)
@@ -33,15 +32,15 @@ const connectable = computed(() =>
const scale = computed(() => store.transform[2]) const scale = computed(() => store.transform[2])
const onMouseEnterHandler = () => const onMouseEnterHandler = () =>
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseEnter.trigger({ event, node: props.node })) props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseEnter.trigger({ event, node: props.node }))
const onMouseMoveHandler = () => const onMouseMoveHandler = () =>
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseMove.trigger({ event, node: props.node })) props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseMove.trigger({ event, node: props.node }))
const onMouseLeaveHandler = () => const onMouseLeaveHandler = () =>
props.node.__rf?.isDragging && ((event: MouseEvent) => hooks.nodeMouseLeave.trigger({ event, node: props.node })) props.node.__rf?.isDragging && ((event: MouseEvent) => store.hooks.nodeMouseLeave.trigger({ event, node: props.node }))
const onContextMenuHandler = () => (event: MouseEvent) => hooks.nodeContextMenu.trigger({ event, node: props.node }) const onContextMenuHandler = () => (event: MouseEvent) => store.hooks.nodeContextMenu.trigger({ event, node: props.node })
const onSelectNodeHandler = (event: MouseEvent) => { const onSelectNodeHandler = (event: MouseEvent) => {
if (!draggable.value) { if (!draggable.value) {
@@ -51,13 +50,13 @@ const onSelectNodeHandler = (event: MouseEvent) => {
if (!props.selected) store.addSelectedElements([n]) if (!props.selected) store.addSelectedElements([n])
} }
hooks.nodeClick.trigger({ event, node: n }) store.hooks.nodeClick.trigger({ event, node: n })
} }
} }
const onDragStart: DraggableEventListener = ({ event }) => { const onDragStart: DraggableEventListener = ({ event }) => {
const n = props.node const n = props.node
hooks.nodeDragStart.trigger({ event, node: n }) store.hooks.nodeDragStart.trigger({ event, node: n })
if (props.selectNodesOnDrag && selectable) { if (props.selectNodesOnDrag && selectable) {
store.unsetNodesSelection() store.unsetNodesSelection()
@@ -73,7 +72,7 @@ const onDrag: DraggableEventListener = ({ event, data }) => {
const n = props.node const n = props.node
n.position.x += data.deltaX n.position.x += data.deltaX
n.position.y += data.deltaY n.position.y += data.deltaY
hooks.nodeDrag.trigger({ event, node: n }) store.hooks.nodeDrag.trigger({ event, node: n })
store.updateNodePosDiff({ store.updateNodePosDiff({
id: props.node.id, id: props.node.id,
@@ -93,7 +92,7 @@ const onDragStop: DraggableEventListener = ({ event }) => {
if (selectable.value && !props.selectNodesOnDrag && !props.selected) { if (selectable.value && !props.selectNodesOnDrag && !props.selected) {
store.addSelectedElements([n]) store.addSelectedElements([n])
} }
hooks.nodeClick.trigger({ event, node: n }) store.hooks.nodeClick.trigger({ event, node: n })
return return
} }
@@ -103,7 +102,7 @@ const onDragStop: DraggableEventListener = ({ event }) => {
isDragging: false, isDragging: false,
}) })
hooks.nodeDragStop.trigger({ event, node: n }) store.hooks.nodeDragStop.trigger({ event, node: n })
} }
onMounted(() => { onMounted(() => {
@@ -1,11 +1,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Draggable, DraggableEventListener } from '@braks/revue-draggable' import { Draggable, DraggableEventListener } from '@braks/revue-draggable'
import { useHooks, useStore } from '../../composables' import { useStore } from '../../composables'
import { Node } from '../../types' import { Node } from '../../types'
import { getRectOfNodes, isNode } from '../../utils' import { getRectOfNodes, isNode } from '../../utils'
const store = useStore() const store = useStore()
const hooks = useHooks()
const selectedNodes = store.selectedElements const selectedNodes = store.selectedElements
? store.selectedElements.filter(isNode).map((selectedNode) => { ? store.selectedElements.filter(isNode).map((selectedNode) => {
@@ -29,12 +28,12 @@ const innerStyle = {
const onStart: DraggableEventListener = ({ event }) => { const onStart: DraggableEventListener = ({ event }) => {
const nodes = selectedNodes const nodes = selectedNodes
hooks.selectionDragStart.trigger({ event, nodes }) store.hooks.selectionDragStart.trigger({ event, nodes })
} }
const onDrag: DraggableEventListener = ({ event, data }) => { const onDrag: DraggableEventListener = ({ event, data }) => {
const nodes = selectedNodes const nodes = selectedNodes
hooks.selectionDrag.trigger({ event, nodes }) store.hooks.selectionDrag.trigger({ event, nodes })
store.updateNodePosDiff({ store.updateNodePosDiff({
diff: { diff: {
x: data.deltaX, x: data.deltaX,
@@ -46,7 +45,7 @@ const onDrag: DraggableEventListener = ({ event, data }) => {
const onStop: DraggableEventListener = ({ event }) => { const onStop: DraggableEventListener = ({ event }) => {
const nodes = selectedNodes const nodes = selectedNodes
hooks.selectionDragStop.trigger({ event, nodes }) store.hooks.selectionDragStop.trigger({ event, nodes })
store.updateNodePosDiff({ store.updateNodePosDiff({
isDragging: false, isDragging: false,
}) })
@@ -54,7 +53,7 @@ const onStop: DraggableEventListener = ({ event }) => {
const onContextMenu = (event: MouseEvent) => { const onContextMenu = (event: MouseEvent) => {
const nodes = selectedNodes const nodes = selectedNodes
hooks.selectionContextMenu.trigger({ event, nodes }) store.hooks.selectionContextMenu.trigger({ event, nodes })
} }
const transform = computed(() => store.transform) const transform = computed(() => store.transform)
+5 -7
View File
@@ -1,5 +1,4 @@
import useStore from './useStore' import useStore from './useStore'
import useHooks from './useHooks'
import { getHostForElement } from '~/utils' import { getHostForElement } from '~/utils'
import { Connection, ConnectionMode, ElementId, HandleType, ValidConnectionFunc } from '~/types' import { Connection, ConnectionMode, ElementId, HandleType, ValidConnectionFunc } from '~/types'
@@ -70,7 +69,6 @@ const resetRecentHandle = (hoveredHandle: Element): void => {
export default () => { export default () => {
const store = useStore() const store = useStore()
const hooks = useHooks()
return ( return (
event: MouseEvent, event: MouseEvent,
@@ -107,7 +105,7 @@ export default () => {
connectionHandleId: handleId, connectionHandleId: handleId,
connectionHandleType: handleType, connectionHandleType: handleType,
}) })
hooks.connectStart.trigger({ event, params: { nodeId, handleId, handleType } }) store.hooks.connectStart.trigger({ event, params: { nodeId, handleId, handleType } })
function onMouseMove(event: MouseEvent) { function onMouseMove(event: MouseEvent) {
store.connectionPosition.x = event.clientX - containerBounds.left store.connectionPosition.x = event.clientX - containerBounds.left
@@ -147,16 +145,16 @@ export default () => {
doc, doc,
) )
hooks.connectStop.trigger(event) store.hooks.connectStop.trigger(event)
if (isValid) { if (isValid) {
hooks.connect.trigger(connection) store.hooks.connect.trigger(connection)
onEdgeUpdate?.(connection) onEdgeUpdate?.(connection)
} }
hooks.connectEnd.trigger(event) store.hooks.connectEnd.trigger(event)
if (elementEdgeUpdaterType) hooks.edgeUpdateEnd.trigger(event) if (elementEdgeUpdaterType) store.hooks.edgeUpdateEnd.trigger(event)
resetRecentHandle(recentHoveredHandle) resetRecentHandle(recentHoveredHandle)
store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined }) store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined })
+2 -3
View File
@@ -1,4 +1,3 @@
import useStore from './useStore'
import { import {
Connection, Connection,
Edge, Edge,
@@ -10,6 +9,7 @@ import {
OnConnectStartParams, OnConnectStartParams,
FlowInstance, FlowInstance,
FlowEvents, FlowEvents,
FlowStore,
} from '~/types' } from '~/types'
import { Hooks } from '~/context' import { Hooks } from '~/context'
@@ -66,10 +66,9 @@ const bind = (emit: EmitFunc, hooks: FlowHooks) => {
} }
} }
export default (emit?: EmitFunc) => { export default (store: FlowStore, emit?: EmitFunc) => {
let hooks = inject(Hooks)! let hooks = inject(Hooks)!
if (!hooks) { if (!hooks) {
const store = useStore()
if (import.meta.env.DEV) console.warn('hooks context not found; creating default hooks') if (import.meta.env.DEV) console.warn('hooks context not found; creating default hooks')
hooks = store.hooks hooks = store.hooks
if (typeof emit === 'function') bind(emit, hooks) if (typeof emit === 'function') bind(emit, hooks)
+25 -4
View File
@@ -1,16 +1,37 @@
import { FlowOptions } from '~/types' import { FlowExportObject, FlowOptions } from '~/types'
import { useFlowStore, initialState } from '~/store' import { useFlowStore, initialState } from '~/store'
import { Store } from '~/context' import { Store } from '~/context'
import { onLoadToObject } from '~/utils'
let id = 0
export default (options?: Partial<FlowOptions>) => { export default (options?: Partial<FlowOptions>) => {
let store = inject(Store)! let store = inject(Store)!
const withStorage = options?.storageKey ?? false
if (!store) { if (!store) {
if (import.meta.env.DEV) console.warn('store context not found; creating default store') if (import.meta.env.DEV) console.warn('store context not found; creating default store')
store = useFlowStore({ let storedState = ref<FlowExportObject>()
...initialState(), const initial = initialState()
const storageKey = typeof options?.storageKey === 'string' ? options.storageKey : options?.id ?? `vue-flow-${id++}`
if (withStorage) {
storedState = useStorage(storageKey, {} as FlowExportObject)
if (storedState.value) {
initial.elements = storedState.value.elements ?? options?.elements ?? []
if (storedState.value.position && storedState.value.zoom)
initial.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom]
}
}
const preloadedState = {
...initial,
...options, ...options,
})() }
store = useFlowStore(storageKey, preloadedState)()
if (withStorage && storageKey === store.$id) {
const toObject = onLoadToObject(store)
store.$subscribe(() => {
storedState.value = toObject()
})
}
provide(Store, store) provide(Store, store)
} }
+5 -5
View File
@@ -1,10 +1,10 @@
import useHooks from './useHooks' import useHooks from './useHooks'
import useStore from './useStore' import useStore from './useStore'
import { EmitFunc } from '~/types' import { EmitFunc, FlowOptions } from '~/types'
export const initFlow = (emit: EmitFunc) => { export const initFlow = (emit: EmitFunc, options: Partial<FlowOptions>) => {
const store = useStore() const store = useStore(options)
const hooks = useHooks(emit) const hooks = useHooks(store, emit)
return { return {
store, store,
@@ -12,4 +12,4 @@ export const initFlow = (emit: EmitFunc) => {
} }
} }
export default () => useStore() export default (options?: Partial<FlowOptions>) => useStore(options)
@@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ElementId, FlowElement, KeyCode } from '../../types' import { ElementId, FlowElement, KeyCode } from '../../types'
import { useHooks, useStore, useKeyPress } from '../../composables' import { useStore, useKeyPress } from '../../composables'
import NodesSelection from '../../components/NodesSelection/NodesSelection.vue' import NodesSelection from '../../components/NodesSelection/NodesSelection.vue'
import UserSelection from '../../components/UserSelection/UserSelection.vue' import UserSelection from '../../components/UserSelection/UserSelection.vue'
import { getConnectedEdges, isNode } from '../../utils' import { getConnectedEdges, isNode } from '../../utils'
@@ -17,17 +17,16 @@ const props = withDefaults(defineProps<SelectionPaneProps>(), {
}) })
const store = useStore() const store = useStore()
const hooks = useHooks()
const onClick = (event: MouseEvent) => { const onClick = (event: MouseEvent) => {
hooks.paneClick.trigger(event) store.hooks.paneClick.trigger(event)
store.unsetNodesSelection() store.unsetNodesSelection()
store.resetSelectedElements() store.resetSelectedElements()
} }
const onContextMenu = (event: MouseEvent) => hooks.paneContextMenu.trigger(event) const onContextMenu = (event: MouseEvent) => store.hooks.paneContextMenu.trigger(event)
const onWheel = (event: WheelEvent) => hooks.paneScroll.trigger(event) const onWheel = (event: WheelEvent) => store.hooks.paneScroll.trigger(event)
const selectionKeyPresed = ref(false) const selectionKeyPresed = ref(false)
@@ -41,7 +40,7 @@ onMounted(() => {
new Map<ElementId, FlowElement>(), new Map<ElementId, FlowElement>(),
) )
hooks.elementsRemove.trigger(Array.from(elementsToRemove.values())) store.hooks.elementsRemove.trigger(Array.from(elementsToRemove.values()))
store.unsetNodesSelection() store.unsetNodesSelection()
store.resetSelectedElements() store.resetSelectedElements()
} }
+10 -10
View File
@@ -13,7 +13,6 @@ import {
TranslateExtent, TranslateExtent,
NodeExtent, NodeExtent,
FlowOptions, FlowOptions,
FlowEvents,
} from '../../types' } from '../../types'
import ZoomPane from '../../container/ZoomPane/ZoomPane.vue' import ZoomPane from '../../container/ZoomPane/ZoomPane.vue'
import SelectionPane from '../../container/SelectionPane/SelectionPane.vue' import SelectionPane from '../../container/SelectionPane/SelectionPane.vue'
@@ -21,7 +20,7 @@ import NodeRenderer from '../../container/NodeRenderer/NodeRenderer.vue'
import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue' import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue'
import { DefaultNode, InputNode, OutputNode } from '../../components/Nodes' import { DefaultNode, InputNode, OutputNode } from '../../components/Nodes'
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '../../components/Edges' import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '../../components/Edges'
import { initFlow } from '~/composables' import { createHooks, initFlow } from '../../composables'
export interface FlowProps extends FlowOptions { export interface FlowProps extends FlowOptions {
elements: Elements elements: Elements
@@ -59,6 +58,7 @@ export interface FlowProps extends FlowOptions {
edgeUpdaterRadius?: number edgeUpdaterRadius?: number
edgeTypesId?: string edgeTypesId?: string
nodeTypesId?: string nodeTypesId?: string
storage?: string
} }
const props = withDefaults(defineProps<FlowProps>(), { const props = withDefaults(defineProps<FlowProps>(), {
@@ -100,9 +100,8 @@ const props = withDefaults(defineProps<FlowProps>(), {
edgeTypesId: '1', edgeTypesId: '1',
nodeTypesId: '1', nodeTypesId: '1',
}) })
export type DefineFlowEvents = { (event: keyof FlowEvents, flowEvent: FlowEvents[keyof FlowEvents]): void }
const emit = defineEmits<DefineFlowEvents>() const emit = defineEmits(Object.keys(createHooks()))
const defaultNodeTypes: Record<string, NodeType> = { const defaultNodeTypes: Record<string, NodeType> = {
input: InputNode as NodeType, input: InputNode as NodeType,
@@ -117,11 +116,10 @@ const defaultEdgeTypes: Record<string, EdgeType> = {
smoothstep: SmoothStepEdge as EdgeType, smoothstep: SmoothStepEdge as EdgeType,
} }
const { store, hooks } = initFlow(emit) const { store, hooks } = initFlow(emit, props)
const init = (opts: typeof props) => { const init = (opts: typeof props) => {
store.$state = { ...store.$state, ...opts } store.$state = { ...store.$state, ...(props as any) }
store.setElements(opts.elements)
store.setMinZoom(opts.minZoom) store.setMinZoom(opts.minZoom)
store.setMaxZoom(opts.maxZoom) store.setMaxZoom(opts.maxZoom)
store.setTranslateExtent(opts.translateExtent) store.setTranslateExtent(opts.translateExtent)
@@ -147,10 +145,12 @@ invoke(async () => {
watch( watch(
elements, elements,
(val, oldVal) => { (val, oldVal) => {
const hasDiff = diff(val, oldVal) nextTick(() => {
if (hasDiff.length > 0) store.setElements(val) const hasDiff = diff(val, oldVal)
if (hasDiff.length > 0) store.setElements(val)
})
}, },
{ flush: 'pre', deep: true }, { flush: 'post', deep: true },
) )
const nodeTypes = computed(() => { const nodeTypes = computed(() => {
+5 -6
View File
@@ -3,7 +3,7 @@ import { D3ZoomEvent, zoom, zoomIdentity, ZoomTransform } from 'd3-zoom'
import { get, invoke } from '@vueuse/core' import { get, invoke } from '@vueuse/core'
import { pointer, select } from 'd3-selection' import { pointer, select } from 'd3-selection'
import { FlowInstance, FlowTransform, KeyCode, PanOnScrollMode } from '../../types' import { FlowInstance, FlowTransform, KeyCode, PanOnScrollMode } from '../../types'
import { useHooks, useKeyPress, useStore, useZoomPanHelper } from '../../composables' import { useKeyPress, useStore, useZoomPanHelper } from '../../composables'
import { clamp, onLoadGetElements, onLoadProject, onLoadToObject } from '../../utils' import { clamp, onLoadGetElements, onLoadProject, onLoadToObject } from '../../utils'
interface ZoomPaneProps { interface ZoomPaneProps {
@@ -34,7 +34,6 @@ const props = withDefaults(defineProps<ZoomPaneProps>(), {
paneMoveable: true, paneMoveable: true,
}) })
const store = useStore() const store = useStore()
const hooks = useHooks()
const zoomPaneEl = templateRef<HTMLDivElement>('zoomPane', null) const zoomPaneEl = templateRef<HTMLDivElement>('zoomPane', null)
@@ -75,7 +74,7 @@ invoke(async () => {
if (viewChanged(transform.value, event.transform)) { if (viewChanged(transform.value, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform.value = flowTransform transform.value = flowTransform
hooks.moveStart.trigger(flowTransform) store.hooks.moveStart.trigger(flowTransform)
} }
}) })
@@ -83,7 +82,7 @@ invoke(async () => {
if (viewChanged(transform.value, event.transform)) { if (viewChanged(transform.value, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform.value = flowTransform transform.value = flowTransform
hooks.moveEnd.trigger(flowTransform) store.hooks.moveEnd.trigger(flowTransform)
} }
}) })
@@ -95,7 +94,7 @@ invoke(async () => {
if (viewChanged(transform.value, event.transform)) { if (viewChanged(transform.value, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform.value = flowTransform transform.value = flowTransform
hooks.move.trigger(flowTransform) store.hooks.move.trigger(flowTransform)
} }
}) })
} }
@@ -196,7 +195,7 @@ invoke(async () => {
getElements: onLoadGetElements(store), getElements: onLoadGetElements(store),
toObject: onLoadToObject(store), toObject: onLoadToObject(store),
} }
hooks.load.trigger(instance) store.hooks.load.trigger(instance)
}) })
watch( watch(
+5 -3
View File
@@ -19,7 +19,6 @@ type NextElements = {
nextEdges: Edge[] nextEdges: Edge[]
} }
const pinia = createPinia() const pinia = createPinia()
let id = 0
const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExtent: NodeExtent) => { const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExtent: NodeExtent) => {
const nextElements: NextElements = { const nextElements: NextElements = {
@@ -68,11 +67,14 @@ const parseElements = (elements: Elements, nodes: Node[], edges: Edge[], nodeExt
return nextElements return nextElements
} }
export default function flowStore(preloadedState: FlowState): StoreDefinition<string, FlowState, any, FlowActions> { export default function flowStore(id: string, preloadedState: FlowState): StoreDefinition<string, FlowState, any, FlowActions> {
setActivePinia(pinia) setActivePinia(pinia)
const { nextEdges, nextNodes } = parseElements(preloadedState.elements, [], [], preloadedState.nodeExtent)
preloadedState.nodes = nextNodes
preloadedState.edges = nextEdges
return defineStore({ return defineStore({
id: `vue-flow-${id++}`, id: id ?? 'vue-flow',
state: () => ({ state: () => ({
...preloadedState, ...preloadedState,
}), }),
+1
View File
@@ -59,6 +59,7 @@ export const initialState = (): FlowState => ({
isReady: false, isReady: false,
hooks: createHooks(), hooks: createHooks(),
storageKey: undefined,
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-', vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-',
}) })
+4 -3
View File
@@ -1,14 +1,14 @@
import { Store } from 'pinia' import { Store } from 'pinia'
import { Dimensions, ElementId, Elements, Rect, SelectionRect, SnapGrid, Transform, XYPosition } from './types' import { Dimensions, ElementId, Elements, FlowOptions, Rect, SelectionRect, SnapGrid, Transform, XYPosition } from './types'
import { HandleType } from './handle' import { HandleType } from './handle'
import { ConnectionMode, OnConnectEndFunc, OnConnectFunc, OnConnectStartFunc, OnConnectStopFunc } from './connection' import { ConnectionMode, OnConnectEndFunc, OnConnectFunc, OnConnectStartFunc, OnConnectStopFunc } from './connection'
import { Edge, EdgeType } from './edge' import { Edge, EdgeType } from './edge'
import { Node, NodeExtent, NodeType, TranslateExtent } from './node' import { Node, NodeExtent, NodeType, TranslateExtent } from './node'
import { FlowActions } from './actions' import { FlowActions } from './actions'
import { D3Selection, D3Zoom, D3ZoomHandler } from './panel' import { D3Selection, D3Zoom, D3ZoomHandler } from './panel'
import { FlowHooks } from '~/types/hooks' import { FlowHooks } from './hooks'
export interface FlowState { export interface FlowState extends FlowOptions {
dimensions: Dimensions dimensions: Dimensions
transform: Transform transform: Transform
elements: Elements elements: Elements
@@ -56,6 +56,7 @@ export interface FlowState {
isReady: boolean isReady: boolean
hooks: FlowHooks hooks: FlowHooks
storageKey?: string
} }
export type FlowStore = Store<string, FlowState, any, FlowActions> export type FlowStore = Store<string, FlowState, any, FlowActions>
+1
View File
@@ -124,4 +124,5 @@ export interface FlowOptions extends Omit<HTMLAttributes, 'onLoad'> {
edgeUpdaterRadius?: number edgeUpdaterRadius?: number
nodeTypesId?: string nodeTypesId?: string
edgeTypesId?: string edgeTypesId?: string
storageKey?: string
} }