@hmcts/opal-frontend-common 0.0.60 → 0.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { inject } from '@angular/core';
|
|
2
2
|
import { Router } from '@angular/router';
|
|
3
|
-
import { tap, catchError, throwError } from 'rxjs';
|
|
3
|
+
import { tap, catchError, EMPTY, throwError } from 'rxjs';
|
|
4
4
|
import { AppInsightsService } from '@hmcts/opal-frontend-common/services/app-insights-service';
|
|
5
5
|
import { GlobalStore } from '@hmcts/opal-frontend-common/stores/global';
|
|
6
6
|
import { GLOBAL_ERROR_STATE } from '@hmcts/opal-frontend-common/stores/global/constants';
|
|
@@ -109,6 +109,7 @@ const httpErrorInterceptor = (req, next) => {
|
|
|
109
109
|
}
|
|
110
110
|
else if (isRetriableError(error)) {
|
|
111
111
|
handleRetriableError(error, globalStore);
|
|
112
|
+
return EMPTY;
|
|
112
113
|
}
|
|
113
114
|
else {
|
|
114
115
|
globalStore.setBannerError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmcts-opal-frontend-common-interceptors-http-error.mjs","sources":["../../../projects/opal-frontend-common/interceptors/http-error/constants/http-error-message.constant.ts","../../../projects/opal-frontend-common/interceptors/http-error/constants/http-error-message-response.constant.ts","../../../projects/opal-frontend-common/interceptors/http-error/http-error.interceptor.ts","../../../projects/opal-frontend-common/interceptors/http-error/hmcts-opal-frontend-common-interceptors-http-error.ts"],"sourcesContent":["export const GENERIC_HTTP_ERROR_MESSAGE = 'You can try again. If the problem persists, contact the service desk.';\n","import { IErrorResponse } from '@hmcts/opal-frontend-common/interceptors/http-error/interfaces';\n\nexport const ERROR_RESPONSE: IErrorResponse = {\n type: null,\n title: null,\n status: null,\n detail: null,\n instance: null,\n operation_id: null,\n retriable: null,\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { catchError, tap, throwError } from 'rxjs';\nimport { AppInsightsService } from '@hmcts/opal-frontend-common/services/app-insights-service';\nimport { GlobalStore } from '@hmcts/opal-frontend-common/stores/global';\nimport { GLOBAL_ERROR_STATE } from '@hmcts/opal-frontend-common/stores/global/constants';\nimport { GlobalStoreType } from '@hmcts/opal-frontend-common/stores/global/types';\nimport { GENERIC_HTTP_ERROR_MESSAGE } from './constants/http-error-message.constant';\nimport { IErrorResponse } from './interfaces/http-error-retrievable-error-response.interface';\nimport { ERROR_RESPONSE } from './constants/http-error-message-response.constant';\n/**\n * Checks if the error is a non-retriable error\n * @param error - The HTTP error response\n * @returns true if the error has retriable: false\n */\nfunction isNonRetriableError(error: unknown): boolean {\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: { retriable?: boolean } };\n return err.error?.retriable === false;\n }\n return false;\n}\n\n/**\n * Checks if the error is explicitly marked as retriable\n * @param error - The HTTP error response\n * @returns true if the error has retriable: true or retriable is undefined\n */\nfunction isRetriableError(error: unknown): boolean {\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: { retriable?: boolean } };\n return err.error?.retriable !== false;\n }\n return false;\n}\n\n/**\n * Handles retriable errors by setting appropriate error state\n * @param error - The HTTP error response\n * @param globalStore - Global store instance\n */\nfunction handleRetriableError(error: unknown, globalStore: GlobalStoreType): void {\n let errorResponse: IErrorResponse | undefined;\n\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: IErrorResponse };\n errorResponse = err.error;\n }\n\n const errorMessage = errorResponse?.detail || GENERIC_HTTP_ERROR_MESSAGE;\n\n globalStore.setBannerError({\n ...GLOBAL_ERROR_STATE,\n error: true,\n title: errorResponse?.title || ERROR_RESPONSE.title,\n message: errorMessage,\n operationId: errorResponse?.operation_id || ERROR_RESPONSE.operation_id,\n });\n}\n\n/**\n * Handles non-retriable errors by redirecting to appropriate error pages\n * @param error - The HTTP error response\n * @param router - Angular Router instance\n */\nfunction handleNonRetriableError(error: unknown, router: Router): void {\n let errorResponse: IErrorResponse | undefined;\n let status: number | undefined;\n\n if (typeof error === 'object' && error !== null) {\n if ('error' in error) {\n const err = error as { error?: IErrorResponse };\n errorResponse = err.error;\n }\n if ('status' in error) {\n const statusErr = error as { status?: number };\n status = statusErr.status;\n }\n }\n\n const statusCode = status || errorResponse?.status;\n\n const operationId = errorResponse?.operation_id || ERROR_RESPONSE.operation_id;\n\n switch (statusCode) {\n case 409:\n router.navigate(['/error/concurrency-failure']);\n break;\n case 403:\n router.navigate(['/error/permission-denied']);\n break;\n default:\n router.navigate(['/error/internal-server'], {\n state: { operationId },\n });\n break;\n }\n}\n\nexport const httpErrorInterceptor: HttpInterceptorFn = (req, next) => {\n const globalStore = inject(GlobalStore);\n const appInsightsService = inject(AppInsightsService);\n const router = inject(Router);\n\n return next(req).pipe(\n tap(() => {\n globalStore.resetBannerError();\n }),\n catchError((error) => {\n const isBrowser = typeof globalThis !== 'undefined';\n\n if (isBrowser) {\n if (isNonRetriableError(error)) {\n handleNonRetriableError(error, router);\n } else if (isRetriableError(error)) {\n handleRetriableError(error, globalStore);\n } else {\n globalStore.setBannerError({\n ...GLOBAL_ERROR_STATE,\n error: true,\n title: 'There was a problem',\n message: GENERIC_HTTP_ERROR_MESSAGE,\n operationId: ERROR_RESPONSE.operation_id,\n });\n }\n }\n\n // Always log exceptions for monitoring\n appInsightsService.logException(error);\n\n return throwError(() => error);\n }),\n );\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hmcts-opal-frontend-common-interceptors-http-error.mjs","sources":["../../../projects/opal-frontend-common/interceptors/http-error/constants/http-error-message.constant.ts","../../../projects/opal-frontend-common/interceptors/http-error/constants/http-error-message-response.constant.ts","../../../projects/opal-frontend-common/interceptors/http-error/http-error.interceptor.ts","../../../projects/opal-frontend-common/interceptors/http-error/hmcts-opal-frontend-common-interceptors-http-error.ts"],"sourcesContent":["export const GENERIC_HTTP_ERROR_MESSAGE = 'You can try again. If the problem persists, contact the service desk.';\n","import { IErrorResponse } from '@hmcts/opal-frontend-common/interceptors/http-error/interfaces';\n\nexport const ERROR_RESPONSE: IErrorResponse = {\n type: null,\n title: null,\n status: null,\n detail: null,\n instance: null,\n operation_id: null,\n retriable: null,\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { catchError, EMPTY, tap, throwError } from 'rxjs';\nimport { AppInsightsService } from '@hmcts/opal-frontend-common/services/app-insights-service';\nimport { GlobalStore } from '@hmcts/opal-frontend-common/stores/global';\nimport { GLOBAL_ERROR_STATE } from '@hmcts/opal-frontend-common/stores/global/constants';\nimport { GlobalStoreType } from '@hmcts/opal-frontend-common/stores/global/types';\nimport { GENERIC_HTTP_ERROR_MESSAGE } from './constants/http-error-message.constant';\nimport { IErrorResponse } from './interfaces/http-error-retrievable-error-response.interface';\nimport { ERROR_RESPONSE } from './constants/http-error-message-response.constant';\n/**\n * Checks if the error is a non-retriable error\n * @param error - The HTTP error response\n * @returns true if the error has retriable: false\n */\nfunction isNonRetriableError(error: unknown): boolean {\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: { retriable?: boolean } };\n return err.error?.retriable === false;\n }\n return false;\n}\n\n/**\n * Checks if the error is explicitly marked as retriable\n * @param error - The HTTP error response\n * @returns true if the error has retriable: true or retriable is undefined\n */\nfunction isRetriableError(error: unknown): boolean {\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: { retriable?: boolean } };\n return err.error?.retriable !== false;\n }\n return false;\n}\n\n/**\n * Handles retriable errors by setting appropriate error state\n * @param error - The HTTP error response\n * @param globalStore - Global store instance\n */\nfunction handleRetriableError(error: unknown, globalStore: GlobalStoreType): void {\n let errorResponse: IErrorResponse | undefined;\n\n if (typeof error === 'object' && error !== null && 'error' in error) {\n const err = error as { error?: IErrorResponse };\n errorResponse = err.error;\n }\n\n const errorMessage = errorResponse?.detail || GENERIC_HTTP_ERROR_MESSAGE;\n\n globalStore.setBannerError({\n ...GLOBAL_ERROR_STATE,\n error: true,\n title: errorResponse?.title || ERROR_RESPONSE.title,\n message: errorMessage,\n operationId: errorResponse?.operation_id || ERROR_RESPONSE.operation_id,\n });\n}\n\n/**\n * Handles non-retriable errors by redirecting to appropriate error pages\n * @param error - The HTTP error response\n * @param router - Angular Router instance\n */\nfunction handleNonRetriableError(error: unknown, router: Router): void {\n let errorResponse: IErrorResponse | undefined;\n let status: number | undefined;\n\n if (typeof error === 'object' && error !== null) {\n if ('error' in error) {\n const err = error as { error?: IErrorResponse };\n errorResponse = err.error;\n }\n if ('status' in error) {\n const statusErr = error as { status?: number };\n status = statusErr.status;\n }\n }\n\n const statusCode = status || errorResponse?.status;\n\n const operationId = errorResponse?.operation_id || ERROR_RESPONSE.operation_id;\n\n switch (statusCode) {\n case 409:\n router.navigate(['/error/concurrency-failure']);\n break;\n case 403:\n router.navigate(['/error/permission-denied']);\n break;\n default:\n router.navigate(['/error/internal-server'], {\n state: { operationId },\n });\n break;\n }\n}\n\nexport const httpErrorInterceptor: HttpInterceptorFn = (req, next) => {\n const globalStore = inject(GlobalStore);\n const appInsightsService = inject(AppInsightsService);\n const router = inject(Router);\n\n return next(req).pipe(\n tap(() => {\n globalStore.resetBannerError();\n }),\n catchError((error) => {\n const isBrowser = typeof globalThis !== 'undefined';\n\n if (isBrowser) {\n if (isNonRetriableError(error)) {\n handleNonRetriableError(error, router);\n } else if (isRetriableError(error)) {\n handleRetriableError(error, globalStore);\n return EMPTY;\n } else {\n globalStore.setBannerError({\n ...GLOBAL_ERROR_STATE,\n error: true,\n title: 'There was a problem',\n message: GENERIC_HTTP_ERROR_MESSAGE,\n operationId: ERROR_RESPONSE.operation_id,\n });\n }\n }\n\n // Always log exceptions for monitoring\n appInsightsService.logException(error);\n\n return throwError(() => error);\n }),\n );\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|