import {type IStoreContext} from "@leight/context"; import {type IStateCreator, type IStoreApi, type IStoreProps} from "@leight/zustand"; import {createStore} from "zustand"; import {createContext} from "./createContext"; import {withProvider} from "./withProvider"; import {withUseState, withUseState$} from "./withUseState"; import {useContext} from "./useContext"; import {useContext$} from "./useContext$"; export interface ICreateStoreContextProps { state: IStateCreator, name: string, hint?: string } /** * Creates store hook and provider of Zustand. */ export const createStoreContext = ( { state, name, hint, }: ICreateStoreContextProps): IStoreContext => { const Context = createContext>(); return { name, Provider: withProvider({ name, Context, createStore: ({ defaults: $defaults, state: $state }) => createStore(($set, $get, $store) => ({ ...state({defaults: $defaults, state: $state})($set, $get, $store), ...$defaults, })), }), use: withUseState(Context, name, hint), use$: withUseState$(Context), useStore: () => useContext(Context, name, hint).store, useStore$: () => useContext$(Context)?.store || null, }; };