UNPKG

2.14 kBPlain TextView Raw
1import {Action} from "redux";
2import {IVirtualStoreConstructor} from "./virtual-store";
3
4export type IAData = any;
5
6export interface IActionData<IData extends IAData> {
7 payload?: IData;
8 virtualStorage?: string;
9}
10
11export interface IAction<IData extends IAData> extends IActionData<IData>, Action {
12}
13
14export interface IReducer<IData extends IAData, ValueInterface> {
15 (state: ValueInterface, action: ReduxAction<IData, ValueInterface>): ValueInterface|void;
16}
17
18export interface ISingleReducer<ValueInterface, IData extends IAData> {
19 (state: ValueInterface, action: IData, rawAction: IAction<IData>): ValueInterface|void;
20
21 displayName?: string;
22}
23
24export interface IReduxActionConstructor<IData extends IAData, ValueInterface = void> {
25 new(payload: IData, virtualStore?: IVirtualStoreConstructor<any>): ReduxAction<IData, ValueInterface>;
26
27 // (data: IData): IAction<IData>;
28}
29
30export abstract class ReduxAction<IData extends IAData, VI = void> implements IAction<IData> {
31 readonly type: string;
32 readonly payload: IData;
33 readonly virtualStorage?: string;
34
35 constructor(payload: IData, VirtualStore?: IVirtualStoreConstructor<VI>|'*') {
36 this.type = this.constructor.name;
37 this.payload = payload || null;
38 if (VirtualStore) {
39 if (typeof VirtualStore === 'string') {
40 this.virtualStorage = VirtualStore;
41 } else {
42 this.virtualStorage = VirtualStore.name;
43 }
44 if (!this.virtualStorage) {
45 throw new TypeError('Action `' + this.type + '`: invalid virtualStorage');
46 }
47 } else {
48 this.virtualStorage = null;
49 }
50 }
51
52 static is(act: IAction<any>) {
53 return act.type === this.name;
54 }
55
56 static compare<VI>(act: IAction<any>,
57 Action: IReduxActionConstructor<any, VI>,
58 VirtualStore?: IVirtualStoreConstructor<VI>) {
59 if (VirtualStore) {
60 return act && act.virtualStorage
61 && act.type === Action.name
62 && act.virtualStorage === VirtualStore.name;
63 } else {
64 return act && act.type === Action.name;
65 }
66 }
67
68 toJSON(): IAction<IData> {
69 return {
70 type: this.type,
71 virtualStorage: this.virtualStorage,
72 payload: this.payload,
73 }
74 }
75}