import { useContext, useMemo } from 'react'; import { UseBoundStoreWithEqualityFn, useStoreWithEqualityFn as useZustandStore } from 'zustand/traditional'; import { StoreApi } from 'zustand'; import { errorMessages } from '@xyflow/system'; import StoreContext from '../contexts/StoreContext'; import type { Edge, Node, ReactFlowState } from '../types'; const zustandErrorMessage = errorMessages['error001'](); /** * Hook for accessing the internal store. Should only be used in rare cases. * * @public * @param selector * @param equalityFn * @returns The selected state slice * * @example * const nodes = useStore((state: ReactFlowState) => state.nodes); * */ function useStore( selector: (state: ReactFlowState) => StateSlice, equalityFn?: (a: StateSlice, b: StateSlice) => boolean ) { const store = useContext(StoreContext); if (store === null) { throw new Error(zustandErrorMessage); } return useZustandStore(store, selector, equalityFn); } function useStoreApi() { const store = useContext(StoreContext) as UseBoundStoreWithEqualityFn< StoreApi> > | null; if (store === null) { throw new Error(zustandErrorMessage); } return useMemo( () => ({ getState: store.getState, setState: store.setState, subscribe: store.subscribe, }), [store] ); } export { useStore, useStoreApi };