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 {}