import { useState, useCallback, type Dispatch, type SetStateAction } from 'react'; import { applyNodeChanges, applyEdgeChanges } from '../utils/changes'; import type { Node, Edge, OnNodesChange, OnEdgesChange } from '../types'; /** * Hook for managing the state of nodes - should only be used for prototyping / simple use cases. * * @public * @param initialNodes * @returns an array [nodes, setNodes, onNodesChange] */ export function useNodesState( initialNodes: NodeType[] ): [NodeType[], Dispatch>, OnNodesChange] { const [nodes, setNodes] = useState(initialNodes); const onNodesChange: OnNodesChange = useCallback( (changes) => setNodes((nds) => applyNodeChanges(changes, nds)), [] ); return [nodes, setNodes, onNodesChange]; } /** * Hook for managing the state of edges - should only be used for prototyping / simple use cases. * * @public * @param initialEdges * @returns an array [edges, setEdges, onEdgesChange] */ export function useEdgesState( initialEdges: EdgeType[] ): [EdgeType[], Dispatch>, OnEdgesChange] { const [edges, setEdges] = useState(initialEdges); const onEdgesChange: OnEdgesChange = useCallback( (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), [] ); return [edges, setEdges, onEdgesChange]; }