import { createContext, useContext, useRef } from 'react'; import { createWithEqualityFn } from 'zustand/traditional'; import type { PersistStoreProps, PersistStoreProviderProps } from '../types'; import type { HeaderState, HeaderStore } from './types'; export const HeaderStoreContext = createContext(null); export function HeaderStoreProvider({ children, ...props }: PersistStoreProviderProps) { const storeRef = useRef(); if (!storeRef.current) { storeRef.current = createHeaderStore(props); } return ( {children} ); } export function useHeaderStore(selector: (state: HeaderState) => T): T { const useStore = useContext(HeaderStoreContext); if (!useStore) { throw new Error( `You forgot to wrap your component in <${HeaderStoreProvider.name}>.`, ); } return useStore(selector); } export function useHeaderStoreContext() { const useStore = useContext(HeaderStoreContext); if (!useStore) { throw new Error( `You forgot to wrap your component in <${HeaderStoreProvider.name}>.`, ); } return useStore; } export const createHeaderStore = ({ namePrefix }: PersistStoreProps) => createWithEqualityFn( (set, get) => ({ setAction: (element) => { set(() => ({ element, })); return get().removeAction; }, setTitle: (title) => { set(() => ({ title, })); return get().removeTitle; }, removeAction: () => { set(() => ({ element: null, })); }, removeTitle: () => { set(() => ({ title: undefined, })); }, }), Object.is, );