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
TypeScript
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;