alveron
Version:
Elm-inspired state management for React
19 lines (18 loc) • 1.02 kB
TypeScript
type StoreContext = Record<string, any>;
export type MiddlewareContext = {
action: string;
payload: any;
prevState: any;
};
export type Middleware<T = any> = {
middleware: (state: T, context: MiddlewareContext) => any;
effect?: (setState: any) => void;
};
export type ResolvedActions<Actions, Model> = {
[Property in keyof Actions]: Actions[Property] extends (state: Model, ...payload: infer Payload) => any ? (...payload: Payload) => void : never;
};
export type Effect<Actions, Model> = (actions: ResolvedActions<Actions, Model>) => void;
export type ActionReturn<Actions, Model> = [Model, Effect<Actions, Model>?];
type UseState<T> = (initialState: T) => [T, any];
export default function useStoreFactory<T>(useState: UseState<T>): (middleware?: Array<Middleware<T>>) => <Model extends T, Actions, Context = StoreContext>(actions: Actions & Record<string, (state: Model, ...payload: any) => any>, initialState: Model, context?: Context) => [Model, ResolvedActions<Actions, Model>];
export {};