UNPKG

@gongt/ts-stl-client

Version:
51 lines (42 loc) 1.28 kB
import {Action, MiddlewareAPI} from "redux"; import {IReduxActionConstructor, ReduxAction} from "../action"; import {IPlugin, ReduxStore} from "../store"; import {VirtualStore} from "../virtual-store"; export interface IPromiseState { result: any; success: boolean; resolved: boolean; } export interface IPromiseState { PromiseQueue: IPromiseState[]; } export class PromiseQueue extends VirtualStore<IPromiseState> { } export interface IPromiseActionData<IData> { promise: Promise<IData>; success: IReduxActionConstructor<IData, any>; failed: IReduxActionConstructor<any, any>; } export class PromiseAction extends ReduxAction<IPromiseActionData<any>, IPromiseState> { } export function promiseMiddleware(store: MiddlewareAPI<any>) { return (next) => { return (action: Action) => { if (!PromiseAction.is(action)) { return next(action); } const {promise, success, failed} = (action as PromiseAction).payload; promise.then((data) => { store.dispatch(new success(data).toJSON()); }, (e) => { store.dispatch(new failed(e).toJSON()); }); }; }; } export class PromisePlugin implements IPlugin<IPromiseState> { __redux_plugin(redux: ReduxStore<IPromiseState>): void { redux.use(promiseMiddleware); redux.register(PromiseQueue) } }