import {Action} from "redux"; import {IVirtualStoreConstructor} from "./virtual-store"; export type IAData = any; export interface IActionData { payload?: IData; virtualStorage?: string; } export interface IAction extends IActionData, Action { } export interface IReducer { (state: ValueInterface, action: ReduxAction): ValueInterface|void; } export interface ISingleReducer { (state: ValueInterface, action: IData, rawAction: IAction): ValueInterface|void; displayName?: string; } export interface IReduxActionConstructor { new(payload: IData, virtualStore?: IVirtualStoreConstructor): ReduxAction; // (data: IData): IAction; } export abstract class ReduxAction implements IAction { readonly type: string; readonly payload: IData; readonly virtualStorage?: string; constructor(payload: IData, VirtualStore?: IVirtualStoreConstructor|'*') { this.type = this.constructor.name; this.payload = payload || null; if (VirtualStore) { if (typeof VirtualStore === 'string') { this.virtualStorage = VirtualStore; } else { this.virtualStorage = VirtualStore.name; } if (!this.virtualStorage) { throw new TypeError('Action `' + this.type + '`: invalid virtualStorage'); } } else { this.virtualStorage = null; } } static is(act: IAction) { return act.type === this.name; } static compare(act: IAction, Action: IReduxActionConstructor, VirtualStore?: IVirtualStoreConstructor) { if (VirtualStore) { return act && act.virtualStorage && act.type === Action.name && act.virtualStorage === VirtualStore.name; } else { return act && act.type === Action.name; } } toJSON(): IAction { return { type: this.type, virtualStorage: this.virtualStorage, payload: this.payload, } } }