redext
Version:
A simple global store based on React Context and Hooks
78 lines (76 loc) • 3.11 kB
text/typescript
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 };