import { createContext, useContext, useRef } from 'react' import type { StoreApi } from 'zustand' import { useShallow } from 'zustand/shallow' import type { UseBoundStoreWithEqualityFn } from 'zustand/traditional' import type { PersistStoreProviderProps } from '../types.js' import { createRouteExecutionStore } from './createRouteExecutionStore.js' import type { RouteExecutionState } from './types.js' type RouteExecutionStore = UseBoundStoreWithEqualityFn< StoreApi > const RouteExecutionStoreContext = createContext( null ) export function RouteExecutionStoreProvider({ children, ...props }: PersistStoreProviderProps) { const storeRef = useRef(null) if (!storeRef.current) { storeRef.current = createRouteExecutionStore(props) } return ( {children} ) } export function useRouteExecutionStoreContext() { const useStore = useContext(RouteExecutionStoreContext) if (!useStore) { throw new Error( `You forgot to wrap your component in <${RouteExecutionStoreProvider.name}>.` ) } return useStore } export function useRouteExecutionStore( selector: (state: RouteExecutionState) => T ): T { const useStore = useRouteExecutionStoreContext() return useStore(useShallow(selector)) }