From 67654d2d0c3425fa10c9935e564e734e30170865 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 17 Apr 2020 15:06:30 +0300 Subject: [PATCH] feat(theme-shared): add an property named skipHandledErrorCodes #3636 --- .../src/lib/handlers/error.handler.ts | 29 ++++++++++++++++++- .../theme-shared/src/lib/models/common.ts | 7 ++--- .../src/lib/tokens/http-error.token.ts | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts index 93d3080cc0..82d5c44cf4 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts @@ -19,6 +19,7 @@ import { HttpErrorWrapperComponent } from '../components/http-error-wrapper/http import { HttpErrorConfig, ErrorScreenErrorCodes } from '../models/common'; import { Confirmation } from '../models/confirmation'; import { ConfirmationService } from '../services/confirmation.service'; +import { filter } from 'rxjs/operators'; export const DEFAULT_ERROR_MESSAGES = { defaultError: { @@ -58,7 +59,10 @@ export class ErrorHandler { @Inject('HTTP_ERROR_CONFIG') private httpErrorConfig: HttpErrorConfig, ) { this.actions - .pipe(ofActionSuccessful(RestOccurError, RouterError, RouterDataResolved)) + .pipe( + ofActionSuccessful(RestOccurError, RouterError, RouterDataResolved), + filter(this.filterErrors), + ) .subscribe(res => { if (res instanceof RestOccurError) { const { payload: err = {} as HttpErrorResponse | any } = res; @@ -254,4 +258,27 @@ export class ErrorHandler { this.httpErrorConfig.errorScreen.forWhichErrors.indexOf(status) > -1, ); } + + private filterErrors = ( + instance: RestOccurError | RouterError | RouterDataResolved, + ): boolean => { + if (instance instanceof RouterDataResolved) return true; + + if (instance instanceof RestOccurError) { + const { payload: err = {} as HttpErrorResponse | any } = instance; + + if (!err.status) return true; + + this.httpErrorConfig.skipHandledErrorCodes = this.httpErrorConfig.skipHandledErrorCodes || []; + + return this.httpErrorConfig.skipHandledErrorCodes.findIndex(code => code === err.status) < 0; + } + + if (instance instanceof RouterError) { + return ( + !snq(() => instance.event.error.indexOf('Cannot match') > -1) || + this.httpErrorConfig.skipHandledErrorCodes.findIndex(code => code === 404) < 0 + ); + } + }; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/common.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/common.ts index 2bca410f5e..3774d97011 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/common.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/common.ts @@ -7,13 +7,10 @@ export interface RootParams { export type ErrorScreenErrorCodes = 401 | 403 | 404 | 500; export interface HttpErrorConfig { + skipHandledErrorCodes?: ErrorScreenErrorCodes[]; errorScreen?: { component: Type; - forWhichErrors?: - | [ErrorScreenErrorCodes] - | [ErrorScreenErrorCodes, ErrorScreenErrorCodes] - | [ErrorScreenErrorCodes, ErrorScreenErrorCodes, ErrorScreenErrorCodes] - | [ErrorScreenErrorCodes, ErrorScreenErrorCodes, ErrorScreenErrorCodes, ErrorScreenErrorCodes]; + forWhichErrors?: ErrorScreenErrorCodes[]; hideCloseIcon?: boolean; }; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts b/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts index 3df2b3fe2d..62f2d2d593 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tokens/http-error.token.ts @@ -7,6 +7,7 @@ export function httpErrorConfigFactory(config = {} as HttpErrorConfig) { } return { + skipHandledErrorCodes: [], errorScreen: {}, ...config, } as HttpErrorConfig;