UNPKG

react-hooks-global-states

Version:

This is a package to easily handling global-state across your react-components using hooks.

75 lines (74 loc) 4.13 kB
import { type PropsWithChildren } from 'react'; import type { ActionCollectionConfig, StateSetter, ActionCollectionResult, StateGetter, BaseMetadata, MetadataSetter, GlobalStoreCallbacks, UseHookConfig, ObservableFragment, MetadataGetter } from './types'; export type ContextProviderAPI<State, Metadata extends BaseMetadata | unknown> = { setMetadata: MetadataSetter<Metadata>; setState: StateSetter<State>; getState: StateGetter<State>; getMetadata: () => Metadata; actions: Record<string, (...args: any[]) => void>; }; export type ContextProvider<State, Metadata extends BaseMetadata | unknown> = React.FC<PropsWithChildren<{ value?: State | ((initialValue: State) => State); ref?: React.RefObject<ContextProviderAPI<State, Metadata>>; }>>; export type StateControlsHook<State, StateMutator, Metadata extends BaseMetadata | unknown> = () => Readonly<[ retriever: StateGetter<State>, mutator: StateMutator, metadata: MetadataGetter<Metadata> ]>; export type ObservableBuilderHook<State, StateMutator, Metadata extends BaseMetadata | unknown> = <Fragment>(this: ContextHook<State, StateMutator, Metadata>, mainSelector: (state: State) => Fragment, args?: { isEqual?: (current: Fragment, next: Fragment) => boolean; isEqualRoot?: (current: State, next: State) => boolean; name?: string; }) => ObservableFragment<Fragment>; export interface ContextBaseHook<State, StateMutator, Metadata extends BaseMetadata | unknown> { (): Readonly<[state: State, stateMutator: StateMutator, metadata: Metadata]>; <Derivate>(selector: (state: State) => Derivate, dependencies?: unknown[]): Readonly<[ state: Derivate, stateMutator: StateMutator, metadata: Metadata ]>; <Derivate>(selector: (state: State) => Derivate, config?: UseHookConfig<Derivate, State>): Readonly<[ state: Derivate, stateMutator: StateMutator, metadata: Metadata ]>; } export interface ContextHook<State, StateMutator, Metadata extends BaseMetadata | unknown> extends HookExtensions<State, StateMutator, Metadata>, ContextBaseHook<State, StateMutator, Metadata> { } export type HookExtensions<State, StateMutator, Metadata extends BaseMetadata | unknown> = { stateControls: () => readonly [ useStateControls: StateControlsHook<State, StateMutator, Metadata>, useObservableBuilder: ObservableBuilderHook<State, StateMutator, Metadata> ]; createSelectorHook: <Derivate>(this: ContextHook<State, StateMutator, Metadata>, selector: (state: State) => Derivate, args?: Omit<UseHookConfig<Derivate, State>, 'dependencies'> & { name?: string; }) => ContextBaseHook<Derivate, StateMutator, Metadata>; }; export interface CreateContext { <State>(value: State | (() => State)): [ ContextHook<State, StateSetter<State>, BaseMetadata>, ContextProvider<State, BaseMetadata> ]; <State, Metadata extends BaseMetadata | unknown, ActionsConfig extends ActionCollectionConfig<State, Metadata> | null | {}, PublicStateMutator = keyof ActionsConfig extends never | undefined ? StateSetter<State> : ActionCollectionResult<State, Metadata, NonNullable<ActionsConfig>>>(value: State | (() => State), args: { name?: string; metadata?: Metadata | (() => Metadata); callbacks?: GlobalStoreCallbacks<State, Metadata> & { onUnMount?: () => void; }; actions?: ActionsConfig; }): [ContextHook<State, PublicStateMutator, Metadata>, ContextProvider<State, Metadata>]; <State, Metadata extends BaseMetadata | unknown, ActionsConfig extends ActionCollectionConfig<State, Metadata>>(value: State | (() => State), args: { name?: string; metadata?: Metadata | (() => Metadata); callbacks?: GlobalStoreCallbacks<State, Metadata> & { onUnMount?: () => void; }; actions: ActionsConfig; }): [ ContextHook<State, ActionCollectionResult<State, Metadata, ActionsConfig>, Metadata>, ContextProvider<State, Metadata> ]; } export declare const createContext: CreateContext; export default createContext;