UNPKG

redext

Version:

A simple global store based on React Context and Hooks

78 lines (76 loc) 3.11 kB
interface Store<TModels extends Models<TModels>> { getState: (initialState?: Record<string, any>) => Record<string, any>; getReducer: (state?: Record<string, any>, action?: Action) => Record<string, any>; getEffect: (dispatch: any, state?: Record<string, any>) => { effects: Record<string, ModelEffects<TModels>>; models: Models<TModels>; dispatch: Dispatch<TModels>; on: (eventName: string, callback: (pluginEvent: any) => void) => void; }; } type ExtractDispatchersFromModels<TModels extends Models<TModels>> = { [modelName in keyof TModels]: TModels[modelName] extends Model<TModels> ? ModelDispatchers<TModels> : never; }; interface ContextDispatch<A extends Action> { <T extends A>(action: T): T; } type Dispatch<TModels extends Models<TModels>> = ContextDispatch<any> & ExtractDispatchersFromModels<TModels>; type ExtractStateFromModels<TModels extends Models<TModels>> = { [modelName in keyof TModels]: TModels[modelName]['state']; }; type State<TModels extends Models<TModels>> = ExtractStateFromModels<TModels>; type ModelEffectThis = { [key: string]: (payload?: any) => Action<any>; }; type ModelEffect<TModels extends Models<TModels>> = (this: ModelEffectThis, payload: Action['payload']) => any; type ModelReducer<TState = any> = (state: TState, payload?: Action['payload'], params?: Action['params']) => TState | void; interface Action<TPayload = any> { type?: string; payload?: TPayload; params?: any; } interface Config<TModels extends Models<TModels>> { models?: TModels; } interface InitConfig<TModels extends Models<TModels>> { models: TModels; plugins?: Plugin<TModels>[]; } interface Models<TModels extends Models<TModels>> { [key: string]: Model<TModels>; } interface Model<TModels extends Models<TModels>, TState = any> { name?: string; state: TState; effects?: ModelEffects<TModels> | ((dispatch?: Dispatch<TModels>) => ModelEffects<TModels>); reducers?: ModelReducers; } interface ModelEffects<TModels extends Models<TModels>> { [key: string]: ModelEffect<TModels>; } interface ModelReducers<TState = any> { [key: string]: ModelReducer<TState>; } interface ModelDispatchers<TState = any> { state?: TState; } interface Plugins<TModels extends Models<TModels>> { [key: string]: Plugin<TModels>; } interface Plugin<TModels extends Models<TModels>> { config?: Config<TModels>; } interface PluginConfig { name?: string; } interface ContextValue<TModels extends Models<TModels>> { subscribe?: any; dispatch?: Dispatch<TModels>; state?: any; effects?: ModelEffects<TModels> | ((dispatch?: Dispatch<TModels>) => ModelEffects<TModels>); getState?: any; } interface ContextSelectorParams { isWithSyncExternalStore?: boolean; } export type { Action, Config, ContextDispatch, ContextSelectorParams, ContextValue, Dispatch, ExtractDispatchersFromModels, ExtractStateFromModels, InitConfig, Model, ModelDispatchers, ModelEffect, ModelEffectThis, ModelEffects, ModelReducer, ModelReducers, Models, Plugin, PluginConfig, Plugins, State, Store };