diff --git a/projects/common/src/navigation/navigation.service.ts b/projects/common/src/navigation/navigation.service.ts
index 734576231..6da08b310 100644
--- a/projects/common/src/navigation/navigation.service.ts
+++ b/projects/common/src/navigation/navigation.service.ts
@@ -14,8 +14,8 @@ import {
UrlTree
} from '@angular/router';
import { from, Observable, of } from 'rxjs';
-import { distinctUntilChanged, filter, map, share, skip, startWith, take } from 'rxjs/operators';
-import { throwIfNil } from '../utilities/lang/lang-utils';
+import { distinctUntilChanged, filter, map, share, skip, startWith, switchMap, take } from 'rxjs/operators';
+import { isEqualIgnoreFunctions, throwIfNil } from '../utilities/lang/lang-utils';
import { Dictionary } from '../utilities/types/types';
import { TraceRoute } from './trace-route';
@@ -124,6 +124,16 @@ export class NavigationService {
};
}
+ public buildNavigationParams$(
+ paramsOrUrl: NavigationParams | string
+ ): Observable<{ path: NavigationPath; extras?: NavigationExtras }> {
+ return this.navigation$.pipe(
+ switchMap(route => route.queryParams),
+ map(() => this.buildNavigationParams(paramsOrUrl)),
+ distinctUntilChanged(isEqualIgnoreFunctions)
+ );
+ }
+
/**
* Navigate within the app.
* To be used for URLs with pattern '/partial_path' or 'partial_path'
diff --git a/projects/components/src/link/link.component.test.ts b/projects/components/src/link/link.component.test.ts
index 6e2161d37..4be21e8ac 100644
--- a/projects/components/src/link/link.component.test.ts
+++ b/projects/components/src/link/link.component.test.ts
@@ -2,6 +2,8 @@ import { RouterLinkWithHref } from '@angular/router';
import { NavigationService } from '@hypertrace/common';
import { createHostFactory, mockProvider, SpectatorHost } from '@ngneat/spectator/jest';
import { MockDirective } from 'ng-mocks';
+import { of } from 'rxjs';
+import { LetAsyncModule } from '../let-async/let-async.module';
import { LinkComponent } from './link.component';
describe('Link component', () => {
@@ -9,6 +11,7 @@ describe('Link component', () => {
const createHost = createHostFactory({
component: LinkComponent,
+ imports: [LetAsyncModule],
providers: [mockProvider(NavigationService)],
declarations: [MockDirective(RouterLinkWithHref)]
});
@@ -32,16 +35,18 @@ describe('Link component', () => {
},
providers: [
mockProvider(NavigationService, {
- buildNavigationParams: jest.fn().mockReturnValue({
- path: [
- '/external',
- {
- url: 'http://test.hypertrace.ai',
- navType: 'same_window'
- }
- ],
- extras: { skipLocationChange: true }
- })
+ buildNavigationParams$: jest.fn().mockReturnValue(
+ of({
+ path: [
+ '/external',
+ {
+ url: 'http://test.hypertrace.ai',
+ navType: 'same_window'
+ }
+ ],
+ extras: { skipLocationChange: true }
+ })
+ )
})
]
});
@@ -72,7 +77,7 @@ describe('Link component', () => {
},
providers: [
mockProvider(NavigationService, {
- buildNavigationParams: jest.fn().mockReturnValue({ path: ['test'], extras: {} })
+ buildNavigationParams$: jest.fn().mockReturnValue(of({ path: ['test'], extras: {} }))
})
]
});
@@ -97,7 +102,7 @@ describe('Link component', () => {
},
providers: [
mockProvider(NavigationService, {
- buildNavigationParams: jest.fn().mockReturnValue({ path: ['/test'], extras: {} })
+ buildNavigationParams$: jest.fn().mockReturnValue(of({ path: ['/test'], extras: {} }))
})
]
});
@@ -122,7 +127,7 @@ describe('Link component', () => {
},
providers: [
mockProvider(NavigationService, {
- buildNavigationParams: jest.fn().mockReturnValue({ path: ['/test'], extras: {} })
+ buildNavigationParams$: jest.fn().mockReturnValue(of({ path: ['/test'], extras: {} }))
})
]
});
diff --git a/projects/components/src/link/link.component.ts b/projects/components/src/link/link.component.ts
index 33d4c9164..ab20a7c3d 100644
--- a/projects/components/src/link/link.component.ts
+++ b/projects/components/src/link/link.component.ts
@@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/c
import { NavigationExtras } from '@angular/router';
import { NavigationParams, NavigationPath, NavigationService } from '@hypertrace/common';
import { isNil } from 'lodash-es';
+import { EMPTY, Observable } from 'rxjs';
@Component({
selector: 'ht-link',
@@ -9,13 +10,14 @@ import { isNil } from 'lodash-es';
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
@@ -28,23 +30,16 @@ export class LinkComponent implements OnChanges {
@Input()
public disabled?: boolean;
- public navigationPath?: NavigationPath;
- public navigationOptions?: NavigationExtras;
+ public navData$: Observable = EMPTY;
public constructor(private readonly navigationService: NavigationService) {}
public ngOnChanges(): void {
- this.setNavigationParams();
+ this.navData$ = isNil(this.paramsOrUrl) ? EMPTY : this.navigationService.buildNavigationParams$(this.paramsOrUrl);
}
+}
- private setNavigationParams(): void {
- if (isNil(this.paramsOrUrl)) {
- this.navigationPath = undefined;
- this.navigationOptions = undefined;
- } else {
- const { path, extras } = this.navigationService.buildNavigationParams(this.paramsOrUrl);
- this.navigationPath = path;
- this.navigationOptions = extras;
- }
- }
+interface NavData {
+ path: NavigationPath;
+ extras?: NavigationExtras;
}
diff --git a/projects/components/src/link/link.module.ts b/projects/components/src/link/link.module.ts
index 6061c6792..f090d1c0b 100644
--- a/projects/components/src/link/link.module.ts
+++ b/projects/components/src/link/link.module.ts
@@ -1,11 +1,12 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
+import { LetAsyncModule } from '../let-async/let-async.module';
import { LinkComponent } from './link.component';
@NgModule({
declarations: [LinkComponent],
exports: [LinkComponent],
- imports: [CommonModule, RouterModule]
+ imports: [CommonModule, RouterModule, LetAsyncModule]
})
export class LinkModule {}