Browse Source

Merge pull request #19459 from abpframework/ng-http-error/router-events

Add `lastNavigation` prop to `RouterEvents` service for track last successful navigation event
pull/19465/head
Masum ULU 3 years ago
committed by GitHub
parent
commit
b4bf6f1809
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 36
      npm/ng-packs/packages/core/src/lib/services/router-events.service.ts
  2. 9
      npm/ng-packs/packages/theme-shared/src/lib/components/http-error-wrapper/http-error-wrapper.component.ts

36
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<T extends RouterEventConstructors>(...eventTypes: T) {
readonly #previousNavigation = signal<string | undefined>(undefined);
previousNavigation = this.#previousNavigation.asReadonly();
readonly #currentNavigation = signal<string | undefined>(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<NavigationEnd>
).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<T extends RouterEventConstructors>(...eventTypes: T) {
const filterRouterEvents = (event: Event) => eventTypes.some(type => event instanceof type);
return this.router.events.pipe(filter(filterRouterEvents));
}

9
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);

Loading…
Cancel
Save