diff --git a/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts b/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts index 5e2db89899..f41dc9bf5e 100644 --- a/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/router-events.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Type } from '@angular/core'; +import { Injectable, Type, inject, signal } from '@angular/core'; import { NavigationCancel, NavigationEnd, @@ -6,8 +6,10 @@ import { NavigationStart, Router, RouterEvent, - Event + Event, + RouterState, } from '@angular/router'; +import { Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; export const NavigationEvent = { @@ -19,12 +21,34 @@ export const NavigationEvent = { @Injectable({ providedIn: 'root' }) export class RouterEvents { - constructor(private router: Router) {} + protected readonly router = inject(Router); - getEvents(...eventTypes: T) { + readonly #previousNavigation = signal(undefined); + previousNavigation = this.#previousNavigation.asReadonly(); + + readonly #currentNavigation = signal(undefined); + currentNavigation = this.#currentNavigation.asReadonly(); + + constructor() { + this.listenToNavigation(); + } - const filterRouterEvents = (event: Event) => - eventTypes.some(type => event instanceof type); + protected listenToNavigation(): void { + ( + this.router.events.pipe( + filter(e => e instanceof NavigationEvent.End && !e.url.includes('error')), + ) as Observable + ).subscribe(event => { + // It must be "NavigationTransition" but it is not exported in Angular + //https://github.com/angular/angular/blob/9c486c96827a9282cbdbff176761bc95554a260b/packages/router/src/navigation_transition.ts#L282 + + this.#previousNavigation.set(this.#currentNavigation()); + this.#currentNavigation.set(event.url); + }); + } + + getEvents(...eventTypes: T) { + const filterRouterEvents = (event: Event) => eventTypes.some(type => event instanceof type); return this.router.events.pipe(filter(filterRouterEvents)); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts index 83002a3a88..9f2c24915d 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts @@ -72,6 +72,15 @@ export class HttpErrorWrapperComponent implements OnInit, AfterViewInit, OnDestr }); customComponentRef.instance.errorStatus = this.status; + + //In our custom "HttpErrorComponent", we have a "status" property. + //We used to have "errorStatus", but it wasn't signal type. "status" variable is signal type. + //I've checked because of backward compatibility. Developers might have their own custom HttpErrorComponent. + //We need to deprecated and remove "errorStatus" in the future. + if (customComponentRef.instance.status) { + customComponentRef.instance.status.set(this.status); + } + customComponentRef.instance.destroy$ = this.destroy$; this.appRef.attachView(customComponentRef.hostView);