1+ import { Injectable } from '@angular/core' ;
2+ import { convertToParamMap , ParamMap , Params } from '@angular/router' ;
3+ import { ReplaySubject } from 'rxjs' ;
4+ import { RouterAdapter } from '@ngqp/core' ;
5+
6+ @Injectable ( )
7+ export class TestRouterAdapter implements RouterAdapter {
8+
9+ private _queryParamMap = new ReplaySubject < ParamMap > ( 1 ) ;
10+ public readonly queryParamMap = this . _queryParamMap . asObservable ( ) ;
11+
12+ public url : string ;
13+
14+ private _params : Params = { } ;
15+
16+ constructor ( ) {
17+ this . emitQueryParamMap ( ) ;
18+ }
19+
20+ public navigate ( queryParams : Params ) : Promise < boolean > {
21+ return new Promise ( resolve => {
22+ setTimeout ( ( ) => {
23+ const newParams = {
24+ ...this . params ,
25+ ...queryParams ,
26+ } ;
27+
28+ if ( JSON . stringify ( newParams ) === JSON . stringify ( this . params ) ) {
29+ resolve ( false ) ;
30+ return ;
31+ }
32+
33+ this . params = newParams ;
34+ this . emitQueryParamMap ( ) ;
35+ resolve ( true ) ;
36+ } , 1 ) ;
37+ } ) ;
38+ }
39+
40+ private set params ( params : Params ) {
41+ this . _params = params ;
42+
43+ const urlSearchParams = new URLSearchParams ( ) ;
44+ Object . entries ( this . params ) . forEach ( ( [ paramName , value ] ) => {
45+ if ( Array . isArray ( value ) ) {
46+ // TODO Support non-string values using JSON.stringify
47+ value . forEach ( item => urlSearchParams . append ( paramName , '' + item ) ) ;
48+ } else {
49+ // TODO Support non-string values using JSON.stringify
50+ urlSearchParams . append ( paramName , '' + value ) ;
51+ }
52+ } ) ;
53+
54+ this . url = '?' + urlSearchParams . toString ( ) ;
55+ }
56+
57+ private get params ( ) : Params {
58+ return { ...this . _params } ;
59+ }
60+
61+ private emitQueryParamMap ( ) : void {
62+ this . _queryParamMap . next ( convertToParamMap ( this . params ) ) ;
63+ }
64+
65+ }
0 commit comments