UNPKG

1.71 kBPlain TextView Raw
1import {OpaqueToken, Optional, Inject, Injectable} from 'angular2/core';
2
3export const WEBPACK_HMR = new OpaqueToken('$$AppState');
4
5@Injectable()
6export class WebpackStore {
7 static _state = {};
8 static _states = [];
9
10 constructor(@Optional() @Inject(WEBPACK_HMR) state?: any) {
11 if (state) {
12 console.log('WebpackState initial data', state);
13 }
14 WebpackStore._state = state || WebpackStore._state;
15 }
16
17 static set(prop, value) {
18 WebpackStore._state[prop] = value;
19 return WebpackStore._state[prop];
20 }
21
22 static get(prop) {
23 return WebpackStore._state[prop];
24 }
25
26 static select(name, getState) {
27 WebpackStore._states.push({ name, getState });
28 let defaultData = getState();
29 let currentData = WebpackStore.get(name);
30
31 if (defaultData && !currentData) {
32 return WebpackStore.set(name, defaultData);
33 } else if (defaultData && currentData) {
34 return WebpackStore.set(name, (<any>Object).assign({}, defaultData, currentData));
35 } else {
36 return WebpackStore.set(name, currentData || defaultData);
37 }
38 }
39
40 static dispose() {
41 WebpackStore._states = [];
42 WebpackStore._state = {};
43 }
44
45 get(prop) {
46 return WebpackStore.get(prop);
47 }
48
49 set(prop, value) {
50 return WebpackStore.set(prop, value);
51 }
52
53 select(name, getState) {
54 return WebpackStore.select(name, getState);
55 }
56
57 dispose() {
58 return WebpackStore.dispose();
59 }
60
61 getState() {
62 let initialState = (<any>Object).assign({}, WebpackStore._state);
63 return WebpackStore._states
64 .reduce((memo, item) => {
65 memo[item.name] = item.getState();
66 return memo;
67 }, initialState);
68 }
69
70 toJSON() {
71 return this.getState();
72 }
73}