diff --git a/src/frontend/src/stores/flowManagerStore.ts b/src/frontend/src/stores/flowManagerStore.ts new file mode 100644 index 000000000..e6fd566fc --- /dev/null +++ b/src/frontend/src/stores/flowManagerStore.ts @@ -0,0 +1,62 @@ +import { + Connection, + Edge, + EdgeChange, + Node, + NodeChange, + OnConnect, + OnEdgesChange, + OnNodesChange, + addEdge, + applyEdgeChanges, + applyNodeChanges, +} from "reactflow"; +import { create } from "zustand"; + +type RFState = { + nodes: Node[]; + edges: Edge[]; + onNodesChange: OnNodesChange; + onEdgesChange: OnEdgesChange; + onConnect: OnConnect; + setEdges: (edges: Edge[]) => void; + setNodes: (nodes: Node[]) => void; + deleteNode: (nodeId: string) => void; + deleteEdge: (edgeId: string) => void; +}; + +// this is our useStore hook that we can use in our components to get parts of the store and call actions +const useStore = create((set, get) => ({ + nodes: [], + edges: [], + onNodesChange: (changes: NodeChange[]) => { + set({ + nodes: applyNodeChanges(changes, get().nodes), + }); + }, + onEdgesChange: (changes: EdgeChange[]) => { + set({ + edges: applyEdgeChanges(changes, get().edges), + }); + }, + onConnect: (connection: Connection) => { + set({ + edges: addEdge(connection, get().edges), + }); + }, + setEdges: (edges) => set({ edges }), + setNodes: (nodes) => set({ nodes }), + deleteNode: (nodeId) => { + set({ + nodes: get().nodes.filter((node) => node.id !== nodeId), + edges: get().edges.filter((edge) => edge.source !== nodeId), + }); + }, + deleteEdge: (edgeId) => { + set({ + edges: get().edges.filter((edge) => edge.id !== edgeId), + }); + }, +})); + +export default useStore;