Skip to content

Commit 1ab4edc

Browse files
committed
feat(docs): Added a TestRouterAdapter
This adapter keeps everything in memory rather than messing with the actual URL. relates #21
1 parent 226bb25 commit 1ab4edc

3 files changed

Lines changed: 71 additions & 2 deletions

File tree

projects/ngqp-demo/src/app/app.module.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ import { BrowserModule } from '@angular/platform-browser';
33
import { FormsModule } from '@angular/forms';
44
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
55
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
6-
import { QueryParamModule } from '@ngqp/core';
6+
import { QueryParamModule, NGQP_ROUTER_ADAPTER } from '@ngqp/core';
77
import { AppRoutingModule } from './app-routing.module';
88
import { AppComponent } from './app.component';
99
import { PlaygroundComponent } from './playground/playground.component';
10+
import { TestRouterAdapter } from './test-router-adapter.service';
1011

1112
@NgModule({
1213
declarations: [
@@ -21,7 +22,10 @@ import { PlaygroundComponent } from './playground/playground.component';
2122
FontAwesomeModule,
2223
QueryParamModule
2324
],
24-
providers: [],
25+
providers: [
26+
// TODO Sandbox this
27+
// { provide: NGQP_ROUTER_ADAPTER, useClass: TestRouterAdapter },
28+
],
2529
bootstrap: [ AppComponent ]
2630
})
2731
export class AppModule {
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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+
}

projects/ngqp/core/src/lib/router-adapter/test-router-adapter.service.ts

Whitespace-only changes.

0 commit comments

Comments
 (0)