|
| 1 | +import {Observable, ReplaySubject} from "rxjs/Rx"; |
| 2 | +import {Transition} from "../transition/transition"; |
| 3 | +import {UIRouter} from "../router"; |
| 4 | +import {StateDeclaration} from "../state/interface"; |
| 5 | + |
| 6 | +export interface StatesChangedEvent { |
| 7 | + currentStates: StateDeclaration[]; |
| 8 | + registered: StateDeclaration[]; |
| 9 | + deregistered: StateDeclaration[]; |
| 10 | +} |
| 11 | + |
| 12 | +declare module '../globals' { |
| 13 | + interface UIRouterGlobals { |
| 14 | + states$?: Observable<StatesChangedEvent>; |
| 15 | + start$?: Observable<Transition>; |
| 16 | + success$?: Observable<Transition>; |
| 17 | + params$?: Observable<{ [paramName: string]: any }>; |
| 18 | + } |
| 19 | +} |
| 20 | + |
| 21 | +/** Augments UIRouterGlobals with observables for transition starts, successful transitions, and state parameters */ |
| 22 | +export class UIRouterRx { |
| 23 | + private deregisterFns: Function[] = []; |
| 24 | + |
| 25 | + constructor(router: UIRouter) { |
| 26 | + let start$ = new ReplaySubject<Transition>(1); |
| 27 | + let success$ = <Observable<Transition>> start$.mergeMap((t: Transition) => t.promise.then(() => t)); |
| 28 | + let params$ = success$.map((transition: Transition) => transition.params()); |
| 29 | + |
| 30 | + let states$ = new ReplaySubject<StatesChangedEvent>(1); |
| 31 | + function onStatesChangedEvent(event: string, states: StateDeclaration[]) { |
| 32 | + let changeEvent = { |
| 33 | + currentStates: router.stateRegistry.get(), |
| 34 | + registered: [], |
| 35 | + deregistered: [] |
| 36 | + }; |
| 37 | + |
| 38 | + if (event) changeEvent[event] = states; |
| 39 | + states$.next(changeEvent); |
| 40 | + } |
| 41 | + |
| 42 | + this.deregisterFns.push(router.transitionService.onStart({}, transition => start$.next(transition))); |
| 43 | + this.deregisterFns.push(router.stateRegistry.onStatesChanged(onStatesChangedEvent)); |
| 44 | + onStatesChangedEvent(null, null); |
| 45 | + Object.assign(router.globals, {start$, success$, params$, states$}); |
| 46 | + } |
| 47 | + |
| 48 | + dispose() { |
| 49 | + this.deregisterFns.forEach(deregisterFn => deregisterFn()); |
| 50 | + this.deregisterFns = []; |
| 51 | + } |
| 52 | +} |
0 commit comments