UNPKG

redux-dispatcher

Version:

All-in-one simple solution to manage actions with less code

80 lines (57 loc) 2.14 kB
import {Reducer, Action, Middleware} from 'redux'; interface Syn<K extends string> { <S>(initialState: S, reducer: { [T: string]: Partial<S> | ((state: S, payload: any) => S) }): { [key in K]: Reducer<S>; }; } /** * TakeableChannel is copied from redux-saga * it helps dispatcher compatible with redux-saga effects like takeLatest, put, ... */ interface TakeableChannel<T> { take(cb: (message: T) => void): void; } type ResultCallback<T = any> = (result?: T) => void; declare class PromiseResult { /** * @deprecated: please use dispatchResult and waitResult instead */ $result: any; waitResult: typeof waitResult; dispatchResult: ResultCallback; } interface UnsubscribeFunction { (): void; remove: () => void; } declare function waitResult<T = any>(): Promise<T>; declare function waitResult(listener: ResultCallback): UnsubscribeFunction; type DispatchFunction = (...args: any[]) => any; type ActionWithPromise<D extends DispatchFunction> = (...args: Parameters<D>) => ReturnType<D> & PromiseResult; type DispatchToAC = Record<string, DispatchFunction & any>; export function createDispatcher<M extends DispatchToAC, K extends string>( key: K, mapDispatchToAC: M, ): { [D in keyof M]: ActionWithPromise<M[D]> & string & TakeableChannel<any> & Action<string>; } & Syn<K>; type MapActionToReducer<S> = { [T: string]: Partial<S> | ((state: S, payload: any) => S) }; export function createReducer<S>( initialState: S, reducer: MapActionToReducer<S> | ((context: any) => MapActionToReducer<S>), ): Reducer<S>; type ContextualMiddleware = { withContext: (context: any) => Middleware; }; export const dispatcherMiddleware: ContextualMiddleware & Middleware; type PartialReducer<S, P> = (state: S, payload: P) => Partial<S> type CaseFunc<S> = <D extends DispatchFunction>( dispatcher: D, reducer: PartialReducer<S, ReturnType<D>>, ) => CaseBuilder<S>; type CaseArrayFunc<S> = <D extends DispatchFunction[]>( dispatchers: D, reducer: PartialReducer<S, ReturnType<D[number]>> ) => CaseBuilder<S>; type CaseBuilder<S> = { case: CaseFunc<S> } & { case: CaseArrayFunc<S> }