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