From 186b96f87d44ddd4fbf63f650988e25d4399948b Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 31 Mar 2022 15:56:32 +0200 Subject: [PATCH] update(flow): generic types --- package/src/composables/useVueFlow.ts | 12 ++-- package/src/store/store.ts | 1 + package/src/types/store.ts | 85 ++++++++++++++++----------- 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/package/src/composables/useVueFlow.ts b/package/src/composables/useVueFlow.ts index 8f924b04..140ac549 100644 --- a/package/src/composables/useVueFlow.ts +++ b/package/src/composables/useVueFlow.ts @@ -1,5 +1,5 @@ import { EffectScope } from 'vue' -import { FlowOptions, UseVueFlow } from '~/types' +import { ElementData, FlowOptions, UseVueFlow } from '~/types' import { VueFlow } from '~/context' import { useStore } from '~/store' @@ -28,7 +28,7 @@ export class Storage { this.flows.delete(id) } - public create(id: string, options?: Partial) { + public create(id: string, options?: Partial): UseVueFlow { const store = useStore(options) const flow: UseVueFlow = { ...(store as any), @@ -45,15 +45,17 @@ export class Storage { } } -type Injection = UseVueFlow | null | undefined +type Injection = UseVueFlow | null | undefined type Scope = (EffectScope & { vueFlowId: string }) | undefined -export default (options?: Partial>): UseVueFlow => { +export default ( + options?: Partial>, +): UseVueFlow => { const storage = Storage.getInstance() const scope = getCurrentScope() as Scope const vueFlowId = scope?.vueFlowId || options?.id - let vueFlow: Injection + let vueFlow: Injection if (scope) { const injection = inject(VueFlow, null) diff --git a/package/src/store/store.ts b/package/src/store/store.ts index 040466a3..aa4a3039 100644 --- a/package/src/store/store.ts +++ b/package/src/store/store.ts @@ -21,6 +21,7 @@ export default (preloadedState?: FlowOptions): Store => { } return reactive({ + state: reactiveState, ...hooksOn, ...toRefs(reactiveState), ...getters, diff --git a/package/src/types/store.ts b/package/src/types/store.ts index f5c6321d..1f147337 100644 --- a/package/src/types/store.ts +++ b/package/src/types/store.ts @@ -1,5 +1,16 @@ import { CSSProperties, ToRefs } from 'vue' -import { Dimensions, Elements, FlowElements, FlowInstance, FlowOptions, Rect, SnapGrid, Transform, XYPosition } from './flow' +import { + Dimensions, + ElementData, + Elements, + FlowElements, + FlowInstance, + FlowOptions, + Rect, + SnapGrid, + Transform, + XYPosition, +} from './flow' import { EdgeComponent, NodeComponent, DefaultNodeTypes, DefaultEdgeTypes } from './components' import { Connection, ConnectionLineType, ConnectionMode } from './connection' import { DefaultEdgeOptions, Edge, GraphEdge } from './edge' @@ -9,15 +20,16 @@ import { FlowHooks, FlowHooksOn } from './hooks' import { NodeChange, EdgeChange } from './changes' import { StartHandle, HandleType } from './handle' -export interface State extends Omit, 'id' | 'modelValue'> { +export interface State + extends Omit, 'id' | 'modelValue'> { /** Event hooks, you can manipulate the triggers on your own peril */ - hooks: FlowHooks - instance: FlowInstance | null + hooks: FlowHooks + instance: FlowInstance | null /** all stored nodes */ - nodes: GraphNode[] + nodes: GraphNode[] /** all stored edges */ - edges: GraphEdge[] + edges: GraphEdge[] d3Zoom: D3Zoom | null d3Selection: D3Selection | null @@ -85,30 +97,30 @@ export interface State extends Omit, 'id' | 'm vueFlowVersion: string } -export interface Actions { +export interface Actions { /** @deprecated use setNodes / setEdges instead */ - setElements: (elements: Elements, extent?: CoordinateExtent) => void + setElements: (elements: Elements, extent?: CoordinateExtent) => void /** parses nodes and re-sets the state */ - setNodes: (nodes: Node[], extent?: CoordinateExtent) => void + setNodes: (nodes: Node[], extent?: CoordinateExtent) => void /** parses edges and re-sets the state */ - setEdges: (edges: Edge[]) => void + setEdges: (edges: Edge[]) => void /** parses nodes and adds to state */ - addNodes: (nodes: Node[], extent?: CoordinateExtent) => void + addNodes: (nodes: Node[], extent?: CoordinateExtent) => void /** parses edges and adds to state */ - addEdges: (edgesOrConnections: (Edge | Connection)[]) => void + addEdges: (edgesOrConnections: (Edge | Connection)[]) => void /** updates an edge */ - updateEdge: (oldEdge: GraphEdge, newConnection: Connection) => boolean - applyEdgeChanges: (changes: EdgeChange[]) => GraphEdge[] - applyNodeChanges: (changes: NodeChange[]) => GraphNode[] - addSelectedElements: (elements: FlowElements) => void - addSelectedEdges: (edges: GraphEdge[]) => void - addSelectedNodes: (nodes: GraphNode[]) => void + updateEdge: (oldEdge: GraphEdge, newConnection: Connection) => boolean + applyEdgeChanges: (changes: EdgeChange[]) => GraphEdge[] + applyNodeChanges: (changes: NodeChange[]) => GraphNode[] + addSelectedElements: (elements: FlowElements) => void + addSelectedEdges: (edges: GraphEdge[]) => void + addSelectedNodes: (nodes: GraphNode[]) => void setMinZoom: (zoom: number) => void setMaxZoom: (zoom: number) => void setTranslateExtent: (translateExtent: CoordinateExtent) => void resetSelectedElements: () => void setInteractive: (isInteractive: boolean) => void - setState: (state: Partial & Omit>) => void + setState: (state: Partial & Omit>) => void updateNodePosition: ({ id, diff, dragging }: { id?: string; diff?: XYPosition; dragging?: boolean }) => void updateNodeDimensions: ( updates: { @@ -120,26 +132,31 @@ export interface Actions { $reset: () => void } -export interface Getters { +export interface Getters { getEdgeTypes: Record getNodeTypes: Record /** filters hidden nodes */ - getNodes: GraphNode[] + getNodes: GraphNode[] /** filters hidden edges */ - getEdges: GraphEdge[] - getNode: (id: string) => GraphNode | undefined - getEdge: (id: string) => GraphEdge | undefined - getSelectedElements: FlowElements - getSelectedNodes: GraphNode[] - getSelectedEdges: GraphEdge[] + getEdges: GraphEdge[] + getNode: (id: string) => GraphNode | undefined + getEdge: (id: string) => GraphEdge | undefined + getSelectedElements: FlowElements + getSelectedNodes: GraphNode[] + getSelectedEdges: GraphEdge[] } -export type Store = State & Actions & Getters +export type Store = { state: State } & State< + NodeData, + EdgeData +> & + Actions & + Getters -export type UseVueFlow = { +export type UseVueFlow = { id: string - store: Store -} & FlowHooksOn & - ToRefs> & - Getters & - Actions + store: Store +} & FlowHooksOn & + ToRefs> & + Getters & + Actions