/
ui-router-rx.ts
57 lines (48 loc) · 1.94 KB
/
ui-router-rx.ts
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
/** @module rx */
/** */
import "rxjs/add/operator/mergeMap";
import "rxjs/add/operator/map";
import { Observable } from "rxjs/Observable";
import { ReplaySubject } from "rxjs/ReplaySubject";
import { Transition, UIRouter, StateDeclaration, UIRouterPlugin } from "@uirouter/core";
export interface StatesChangedEvent {
currentStates: StateDeclaration[];
registered: StateDeclaration[];
deregistered: StateDeclaration[];
}
declare module '@uirouter/core/lib/globals' {
interface UIRouterGlobals {
states$?: Observable<StatesChangedEvent>;
start$?: Observable<Transition>;
success$?: Observable<Transition>;
params$?: Observable<{ [paramName: string]: any }>;
}
}
/** Augments UIRouterGlobals with observables for transition starts, successful transitions, and state parameters */
export class UIRouterRx implements UIRouterPlugin {
name = 'ui-router-rx';
private deregisterFns: Function[] = [];
constructor(router: UIRouter) {
let start$ = new ReplaySubject<Transition>(1);
let success$ = <Observable<Transition>> start$.mergeMap((t: Transition) => t.promise.then(() => t));
let params$ = success$.map((transition: Transition) => transition.params());
let states$ = new ReplaySubject<StatesChangedEvent>(1);
function onStatesChangedEvent(event: string, states: StateDeclaration[]) {
let changeEvent = {
currentStates: router.stateRegistry.get(),
registered: [],
deregistered: []
};
if (event) changeEvent[event] = states;
states$.next(changeEvent);
}
this.deregisterFns.push(router.transitionService.onStart({}, transition => start$.next(transition)));
this.deregisterFns.push(router.stateRegistry.onStatesChanged(onStatesChangedEvent));
onStatesChangedEvent(null, null);
Object.assign(router.globals, { start$, success$, params$, states$ });
}
dispose() {
this.deregisterFns.forEach(deregisterFn => deregisterFn());
this.deregisterFns = [];
}
}