@gongt/ts-stl-client
Version:
51 lines (42 loc) • 1.28 kB
text/typescript
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)
}
}