@@ -5,7 +5,13 @@ import {
5
5
Injectable ,
6
6
Provider ,
7
7
} from '@angular/core' ;
8
- import { NavigationEnd , NavigationStart , Router } from '@angular/router' ;
8
+ import {
9
+ NavigationCancel ,
10
+ NavigationEnd ,
11
+ NavigationError ,
12
+ NavigationStart ,
13
+ Router ,
14
+ } from '@angular/router' ;
9
15
import { ComponentStore , provideComponentStore } from '@ngrx/component-store' ;
10
16
import { filter , map , Observable , switchMap , take } from 'rxjs' ;
11
17
import { filterRouterEvents } from '../filter-router-event.operator' ;
@@ -26,6 +32,16 @@ interface RouterHistoryState {
26
32
27
33
type RouterNavigatedSequence = readonly [ NavigationStart , NavigationEnd ] ;
28
34
type RouterNavigatedHistory = Readonly < Record < number , RouterNavigatedSequence > > ;
35
+ type RouterSequence = readonly [
36
+ NavigationStart ,
37
+ NavigationEnd | NavigationCancel | NavigationError
38
+ ] ;
39
+
40
+ function isRouterNavigatedSequence (
41
+ sequence : RouterSequence
42
+ ) : sequence is RouterNavigatedSequence {
43
+ return sequence [ 1 ] instanceof NavigationEnd ;
44
+ }
29
45
30
46
/**
31
47
* Provide and initialize the `RouterHistoryStore`.
@@ -55,34 +71,39 @@ export class RouterHistoryStore extends ComponentStore<RouterHistoryState> {
55
71
( maxNavigatedId ) : maxNavigatedId is number => maxNavigatedId !== undefined
56
72
)
57
73
) ;
74
+
75
+ /**
76
+ * All router events.
77
+ */
78
+ #routerEvents = this . select ( this . #router. events , ( events ) => events ) ;
58
79
/**
59
- * All `NavigationEnd` events.
80
+ * All router events concluding a navigation .
60
81
*/
61
- #navigationEnd$: Observable < NavigationEnd > = this . #router. events . pipe (
62
- filterRouterEvents ( NavigationEnd )
82
+ #navigationResult$: Observable <
83
+ NavigationEnd | NavigationCancel | NavigationError
84
+ > = this . #routerEvents. pipe (
85
+ filterRouterEvents ( NavigationEnd , NavigationCancel , NavigationError )
63
86
) ;
64
87
/**
65
- * All `NavigationStart` events .
88
+ * All router sequences .
66
89
*/
67
- #navigationStart$: Observable < NavigationStart > = this . #router. events . pipe (
68
- filterRouterEvents ( NavigationStart )
90
+ #routerSequence$: Observable < RouterSequence > = this . #routerEvents. pipe (
91
+ filterRouterEvents ( NavigationStart ) ,
92
+ switchMap ( ( navigationStart ) =>
93
+ this . #navigationResult$. pipe (
94
+ filter (
95
+ ( navigationResult ) => navigationResult . id === navigationStart . id
96
+ ) ,
97
+ take ( 1 ) ,
98
+ map ( ( navigationResult ) => [ navigationStart , navigationResult ] as const )
99
+ )
100
+ )
69
101
) ;
70
102
/**
71
103
* All router navigated sequences, that is `NavigationStart` followed by `NavigationEnd`.
72
104
*/
73
105
#routerNavigated$: Observable < RouterNavigatedSequence > =
74
- this . #navigationStart$. pipe (
75
- switchMap ( ( navigationStart ) =>
76
- this . #navigationEnd$. pipe (
77
- filter ( ( navigationEnd ) => navigationEnd . id === navigationStart . id ) ,
78
- take ( 1 ) ,
79
- map (
80
- ( navigationEnd ) =>
81
- [ navigationStart , navigationEnd ] as RouterNavigatedSequence
82
- )
83
- )
84
- )
85
- ) ;
106
+ this . #routerSequence$. pipe ( filter ( isRouterNavigatedSequence ) ) ;
86
107
87
108
/**
88
109
* The most recent completed navigation.
0 commit comments