fix(error-handling): Removed appRef.tick() to avoid unnecessary errors. (TV-944)

Merge in TEA/mina-sidor-fa-web from feature/TV-944 to develop

Squashed commit of the following:

commit f51b753d96030235edb641daac8ecf6b428d1557
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Wed Dec 8 09:13:58 2021 +0100

    Removed appRef.tick()
This commit is contained in:
Erik Tiekstra
2021-12-09 07:27:59 +01:00
parent 8f0b70164b
commit 9ecd0c11d7
3 changed files with 11 additions and 31 deletions

View File

@@ -5,7 +5,6 @@ import localeSe from '@angular/common/locales/sv';
import { ErrorHandler, LOCALE_ID, NgModule, Provider } from '@angular/core'; import { ErrorHandler, LOCALE_ID, NgModule, Provider } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { ApmErrorHandler } from '@elastic/apm-rum-angular'; import { ApmErrorHandler } from '@elastic/apm-rum-angular';
import { environment } from '@msfa-environment';
import { AuthInterceptor } from '@msfa-interceptors/auth.interceptor'; import { AuthInterceptor } from '@msfa-interceptors/auth.interceptor';
import { CustomErrorHandler } from '@msfa-interceptors/custom-error-handler'; import { CustomErrorHandler } from '@msfa-interceptors/custom-error-handler';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
@@ -22,14 +21,6 @@ const providers: Provider[] = [
{ provide: ErrorHandler, useClass: CustomErrorHandler }, { provide: ErrorHandler, useClass: CustomErrorHandler },
]; ];
// Skip error handler in Dev until "Uncaught Error: ApplicationRef.tick is called recursively" is fixed
if (environment.production) {
providers.push({
provide: ErrorHandler,
useClass: CustomErrorHandler,
});
}
@NgModule({ @NgModule({
declarations: [AppComponent], declarations: [AppComponent],
imports: [ imports: [

View File

@@ -19,11 +19,11 @@ export class ToastComponent implements AfterViewInit {
ErrorSeverity = ErrorSeverity; ErrorSeverity = ErrorSeverity;
ngAfterViewInit(): void { ngAfterViewInit(): void {
// if (this.error.removeAfter) { if (this.error.removeAfter) {
// setTimeout(() => { setTimeout(() => {
// this.closeToast.emit(this.error); this.closeToast.emit(this.error);
// }, this.error.removeAfter); }, this.error.removeAfter);
// } }
} }
get className(): string { get className(): string {

View File

@@ -1,4 +1,4 @@
import { ApplicationRef, Injectable, Injector } from '@angular/core'; import { Injectable } from '@angular/core';
import { CustomError } from '@msfa-models/error/custom-error'; import { CustomError } from '@msfa-models/error/custom-error';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
@@ -7,29 +7,18 @@ import { map } from 'rxjs/operators';
providedIn: 'root', providedIn: 'root',
}) })
export class ErrorService { export class ErrorService {
private appRef: ApplicationRef; private _errorQueue$ = new BehaviorSubject<CustomError[]>([]);
private errorQueue$ = new BehaviorSubject<CustomError[]>([]);
public errors$: Observable<CustomError[]> = this.errorQueue$.pipe( public errors$: Observable<CustomError[]> = this._errorQueue$.pipe(
map(errors => errors.sort((a, b) => (a.timestamp > b.timestamp ? -1 : 1))) map(errors => errors.sort((a, b) => (a.timestamp > b.timestamp ? -1 : 1)))
); );
constructor(private injector: Injector) {
// Workaround to fix change-detection when using Error interceptor
// See https://stackoverflow.com/a/37793791
setTimeout(() => {
this.appRef = this.injector.get(ApplicationRef);
});
}
public add(error: CustomError): void { public add(error: CustomError): void {
this.errorQueue$.next([...this.errorQueue$.value, error]); this._errorQueue$.next([...this._errorQueue$.value, error]);
this.appRef.tick();
} }
public remove(error: CustomError): void { public remove(error: CustomError): void {
const newErrorQueue = this.errorQueue$.value.filter(currentError => currentError.id !== error.id); const newErrorQueue = this._errorQueue$.value.filter(currentError => currentError.id !== error.id);
this.errorQueue$.next(newErrorQueue); this._errorQueue$.next(newErrorQueue);
this.appRef.tick();
} }
} }