84 lines
1.9 KiB
TypeScript
84 lines
1.9 KiB
TypeScript
import {
|
|
addEdge,
|
|
applyEdgeChanges,
|
|
applyNodeChanges,
|
|
type Edge,
|
|
type Node,
|
|
type OnConnect,
|
|
type OnEdgesChange,
|
|
type OnNodesChange,
|
|
} from '@xyflow/react'
|
|
import {contain, filter, find, isEqual} from 'licia'
|
|
import {create} from 'zustand/react'
|
|
|
|
export const useFlowStore = create<{
|
|
nodes: Node[],
|
|
getNodes: () => Node[],
|
|
onNodesChange: OnNodesChange,
|
|
getNodeById: (id: string) => Node | undefined,
|
|
addNode: (node: Node) => void,
|
|
removeNode: (id: string) => void,
|
|
setNodes: (nodes: Node[]) => void,
|
|
setNode: (node: Node) => void,
|
|
|
|
edges: Edge[],
|
|
getEdges: () => Edge[],
|
|
onEdgesChange: OnEdgesChange,
|
|
removeEdge: (id: string) => void,
|
|
removeEdges: (ids: string[]) => void,
|
|
setEdges: (edges: Edge[]) => void,
|
|
|
|
onConnect: OnConnect,
|
|
}>((set, get) => ({
|
|
nodes: [],
|
|
getNodes: () => get().nodes,
|
|
onNodesChange: changes => {
|
|
set({
|
|
nodes: applyNodeChanges(changes, get().nodes),
|
|
})
|
|
},
|
|
getNodeById: (id: string) => find(get().nodes, node => isEqual(node.id, id)),
|
|
addNode: node => set({nodes: get().nodes.concat(node)}),
|
|
removeNode: id => {
|
|
set({
|
|
nodes: filter(get().nodes, node => !isEqual(node.id, id)),
|
|
})
|
|
},
|
|
setNodes: nodes => set({nodes}),
|
|
setNode: node => {
|
|
set({
|
|
nodes: get().nodes.map(n => {
|
|
if (isEqual(node.id, n.id)) {
|
|
return node
|
|
}
|
|
return n
|
|
}),
|
|
})
|
|
},
|
|
|
|
edges: [],
|
|
getEdges: () => get().edges,
|
|
onEdgesChange: changes => {
|
|
set({
|
|
edges: applyEdgeChanges(changes, get().edges),
|
|
})
|
|
},
|
|
removeEdge: id => {
|
|
set({
|
|
edges: filter(get().edges, edge => !isEqual(edge.id, id)),
|
|
})
|
|
},
|
|
removeEdges: ids => {
|
|
set({
|
|
edges: filter(get().edges, edge => !contain(ids, edge.id)),
|
|
})
|
|
},
|
|
setEdges: edges => set({edges}),
|
|
|
|
onConnect: connection => {
|
|
set({
|
|
edges: addEdge(connection, get().edges),
|
|
})
|
|
},
|
|
}))
|