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 { } export interface IPromiseActionData { promise: Promise; success: IReduxActionConstructor; failed: IReduxActionConstructor; } export class PromiseAction extends ReduxAction, IPromiseState> { } export function promiseMiddleware(store: MiddlewareAPI) { 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 { __redux_plugin(redux: ReduxStore): void { redux.use(promiseMiddleware); redux.register(PromiseQueue) } }