feat(flow): Narrow options type for useNodesState/useEdgesState/useElementsState

* remove storageKey
* make modelValue optional

Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
Braks
2021-12-20 19:29:52 +01:00
parent ee6bf3252e
commit a9e7eb31ea
8 changed files with 42 additions and 27 deletions
+3 -5
View File
@@ -61,7 +61,7 @@ const updateEdge = (edge: GraphEdge, newConnection: Connection, edges: GraphEdge
export const applyEdgeChanges = (changes: EdgeChange[], edges: GraphEdge[]) => applyChanges(changes, edges)
export const applyNodeChanges = (changes: NodeChange[], nodes: GraphNode[]) => applyChanges(changes, nodes)
export const useEdgesState = ({ edges, options }: UseEdgesStateOptions = { options: { applyDefault: true } }): UseEdgesState => {
export const useEdgesState = ({ edges, options }: UseEdgesStateOptions): UseEdgesState => {
const { store } = useVueFlow(options)
if (edges && edges.length) store.setEdges(edges)
return {
@@ -93,7 +93,7 @@ export const useEdgesState = ({ edges, options }: UseEdgesStateOptions = { optio
}
}
export const useNodesState = ({ nodes, options }: UseNodesStateOptions = { options: { applyDefault: true } }): UseNodesState => {
export const useNodesState = ({ nodes, options }: UseNodesStateOptions): UseNodesState => {
const { store } = useVueFlow(options)
if (nodes && nodes.length) store.setNodes(nodes)
return {
@@ -113,9 +113,7 @@ export const useNodesState = ({ nodes, options }: UseNodesStateOptions = { optio
}
}
export const useElementsState = (
{ edges, nodes, options }: UseElementsStateOptions = { options: { applyDefault: true } },
): UseElementsState => {
export const useElementsState = ({ edges, nodes, options }: UseElementsStateOptions): UseElementsState => {
const nodesState = useNodesState({ nodes, options })
const edgesState = useEdgesState({ edges, options })
+1 -1
View File
@@ -4,7 +4,7 @@ import { VueFlow } from '~/context'
import { useStore } from '~/store'
let id = 0
export default (options?: FlowOptions): UseVueFlow => {
export default (options?: Partial<FlowOptions>): UseVueFlow => {
const currentInstance: any = getCurrentInstance()
let vueFlow: UseVueFlow | false | undefined = currentInstance
? inject(VueFlow, undefined) ?? (currentInstance.vueFlow as UseVueFlow)
+1 -1
View File
@@ -49,7 +49,7 @@ if (props.modelValue && !storedNodes.value.length) setElements(props.modelValue)
if (props.nodes && !storedNodes.value.length) setNodes(props.nodes)
if (props.edges && !storedEdges.value.length) setEdges(props.edges)
if (modelValue.value) modelValue.value = [...store.nodes, ...store.edges]
if (modelValue && modelValue.value) modelValue.value = [...store.nodes, ...store.edges]
if (nodes && nodes.value) nodes.value = store.nodes
if (edges && edges.value) edges.value = store.edges
+2 -2
View File
@@ -8,7 +8,7 @@ export default (
nodes,
edges,
}: {
modelValue?: Ref<Elements>
modelValue?: Ref<Elements | undefined>
nodes?: Ref<Node[] | undefined>
edges?: Ref<Edge[] | undefined>
},
@@ -16,7 +16,7 @@ export default (
store: FlowStore,
) => {
if (isDefined(props.modelValue)) {
const { pause, resume } = pausableWatch([() => props.modelValue, () => props.modelValue.length], async ([v]) => {
const { pause, resume } = pausableWatch([() => props.modelValue, () => props.modelValue?.length], async ([v]) => {
if (v && Array.isArray(v)) {
pause()
store.setElements(v)
-1
View File
@@ -160,7 +160,6 @@ export default (state: State, getters: Getters): Actions => {
if (typeof opts.zoomOnPinch !== 'undefined') state.zoomOnPinch = opts.zoomOnPinch
if (typeof opts.defaultZoom !== 'undefined') state.defaultZoom = opts.defaultZoom
if (typeof opts.defaultPosition !== 'undefined') state.defaultPosition = opts.defaultPosition
if (typeof opts.storageKey !== 'undefined') state.storageKey = opts.storageKey
if (typeof opts.edgeUpdaterRadius !== 'undefined') state.edgeUpdaterRadius = opts.edgeUpdaterRadius
if (typeof opts.elementsSelectable !== 'undefined') state.elementsSelectable = opts.elementsSelectable
if (typeof opts.onlyRenderVisibleElements !== 'undefined') state.onlyRenderVisibleElements = opts.onlyRenderVisibleElements
-2
View File
@@ -94,7 +94,6 @@ export default (opts?: FlowOptions): State => {
hooks: createHooks(),
storageKey: undefined,
applyDefault: true,
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-',
@@ -111,7 +110,6 @@ export default (opts?: FlowOptions): State => {
if (typeof opts.zoomOnPinch !== 'undefined') state.zoomOnPinch = opts.zoomOnPinch
if (typeof opts.defaultZoom !== 'undefined') state.defaultZoom = opts.defaultZoom
if (typeof opts.defaultPosition !== 'undefined') state.defaultPosition = opts.defaultPosition
if (typeof opts.storageKey !== 'undefined') state.storageKey = opts.storageKey
if (typeof opts.edgeUpdaterRadius !== 'undefined') state.edgeUpdaterRadius = opts.edgeUpdaterRadius
if (typeof opts.elementsSelectable !== 'undefined') state.elementsSelectable = opts.elementsSelectable
if (typeof opts.onlyRenderVisibleElements !== 'undefined') state.onlyRenderVisibleElements = opts.onlyRenderVisibleElements
+34 -14
View File
@@ -82,7 +82,7 @@ export type FlowInstance<N = any, E = N> = {
} & UseZoomPanHelper
export interface FlowProps<N = any, E = N> {
modelValue: Elements
modelValue?: Elements<N, E>
nodes?: Node<N>[]
edges?: Edge<E>[]
id?: string
@@ -94,7 +94,7 @@ export interface FlowProps<N = any, E = N> {
multiSelectionKeyCode?: KeyCode
zoomActivationKeyCode?: KeyCode
snapToGrid?: boolean
snapGrid?: [number, number]
snapGrid?: SnapGrid
onlyRenderVisibleElements?: boolean
edgesUpdatable?: boolean
nodesDraggable?: boolean
@@ -117,26 +117,46 @@ export interface FlowProps<N = any, E = N> {
zoomOnDoubleClick?: boolean
preventScrolling?: boolean
edgeUpdaterRadius?: number
storageKey?: string
fitViewOnInit?: boolean
applyDefault?: boolean
}
export type FlowOptions<N = any, E = N> = FlowProps<N, E>
type UseStateOptions = {
options?: FlowOptions
export interface UseNodesStateOptions<Data = any> {
nodes: Node<Data>[]
options?: Pick<
FlowOptions<Data, any>,
| 'applyDefault'
| 'snapToGrid'
| 'snapGrid'
| 'nodesConnectable'
| 'nodesDraggable'
| 'elementsSelectable'
| 'selectNodesOnDrag'
| 'defaultPosition'
| 'onlyRenderVisibleElements'
| 'nodeExtent'
| 'edgeUpdaterRadius'
>
}
export interface UseNodesStateOptions extends UseStateOptions {
nodes?: Node[]
}
export interface UseEdgesStateOptions extends UseStateOptions {
edges?: Edge[]
}
export interface UseElementsStateOptions extends UseStateOptions {
edges?: Edge[]
nodes?: Node[]
export interface UseEdgesStateOptions<Data = any> {
edges: Edge<Data>[]
options?: Pick<
FlowOptions<any, Data>,
| 'applyDefault'
| 'connectionMode'
| 'connectionLineType'
| 'connectionLineStyle'
| 'elementsSelectable'
| 'selectNodesOnDrag'
| 'defaultPosition'
| 'onlyRenderVisibleElements'
| 'edgesUpdatable'
>
}
export type UseElementsStateOptions = UseNodesStateOptions & UseEdgesStateOptions
export type UseNodesState<N = any> = {
nodes: GraphNode<N>[]
applyNodeChanges: <ND = N>(changes: NodeChange[]) => GraphNode<ND>[]
+1 -1
View File
@@ -8,7 +8,7 @@ import { GraphNode, CoordinateExtent, Node } from './node'
import { D3Selection, D3Zoom, D3ZoomHandler, KeyCode, PanOnScrollMode } from './zoom'
import { FlowHooks, FlowHooksOn } from './hooks'
export interface State<N = any, E = N> extends Omit<FlowOptions<N, E>, 'id' | 'elements'> {
export interface State<N = any, E = N> extends Omit<FlowOptions<N, E>, 'id' | 'modelValue'> {
hooks: FlowHooks
instance?: FlowInstance