UNPKG

alveron

Version:

Elm-inspired state management for React

19 lines (18 loc) 1.02 kB
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 {};