-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Expand file tree
/
Copy pathreducer_manager.ts
More file actions
82 lines (70 loc) · 2.3 KB
/
reducer_manager.ts
File metadata and controls
82 lines (70 loc) · 2.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { Injectable, Inject, OnDestroy, Provider } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
import {
Action,
ActionReducer,
ActionReducerMap,
ActionReducerFactory,
StoreFeature,
} from './models';
import { INITIAL_STATE, INITIAL_REDUCERS, REDUCER_FACTORY } from './tokens';
import { omit, createReducerFactory } from './utils';
import { ActionsSubject } from './actions_subject';
export abstract class ReducerObservable extends Observable<
ActionReducer<any, any>
> {}
export abstract class ReducerManagerDispatcher extends ActionsSubject {}
export const UPDATE = '@ngrx/store/update-reducers' as '@ngrx/store/update-reducers';
@Injectable()
export class ReducerManager extends BehaviorSubject<ActionReducer<any, any>>
implements OnDestroy {
constructor(
private dispatcher: ReducerManagerDispatcher,
@Inject(INITIAL_STATE) private initialState: any,
@Inject(INITIAL_REDUCERS) private reducers: ActionReducerMap<any, any>,
@Inject(REDUCER_FACTORY)
private reducerFactory: ActionReducerFactory<any, any>
) {
super(reducerFactory(reducers, initialState));
}
addFeature({
reducers,
reducerFactory,
metaReducers,
initialState,
key,
}: StoreFeature<any, any>) {
const reducer =
typeof reducers === 'function'
? (state = initialState, action: any) => reducers(state, action)
: createReducerFactory(reducerFactory, metaReducers)(
reducers,
initialState
);
this.addReducer(key, reducer);
}
removeFeature({ key }: StoreFeature<any, any>) {
this.removeReducer(key);
}
addReducer(key: string, reducer: ActionReducer<any, any>) {
this.reducers = { ...this.reducers, [key]: reducer };
this.updateReducers();
}
removeReducer(key: string) {
this.reducers = omit(this.reducers, key);
this.updateReducers();
}
private updateReducers() {
this.next(this.reducerFactory(this.reducers, this.initialState));
this.dispatcher.next({ type: UPDATE });
}
ngOnDestroy() {
this.complete();
}
}
export const REDUCER_MANAGER_PROVIDERS: Provider[] = [
ReducerManager,
{ provide: ReducerObservable, useExisting: ReducerManager },
{ provide: ReducerManagerDispatcher, useExisting: ActionsSubject },
];