@@ -20,7 +20,8 @@ import { environment } from '../../../environments/environment';
2020/** Custom Services */
2121import { Logger } from '../logger/logger.service' ;
2222import { AlertService } from '../alert/alert.service' ;
23- import { TranslateService } from '@ngx-translate/core' ; // Added import for TranslateService
23+ import { TranslateService } from '@ngx-translate/core' ;
24+ import { ErrorHandlerService } from '../error-handler/error-handler.service' ;
2425
2526/** Initialize Logger */
2627const log = new Logger ( 'ErrorHandlerInterceptor' ) ;
@@ -32,6 +33,7 @@ const log = new Logger('ErrorHandlerInterceptor');
3233export class ErrorHandlerInterceptor implements HttpInterceptor {
3334 private alertService = inject ( AlertService ) ;
3435 private translate = inject ( TranslateService ) ;
36+ private errorHandlerService = inject ( ErrorHandlerService ) ;
3537
3638 /**
3739 * Intercepts a Http request and adds a default error handler.
@@ -45,33 +47,49 @@ export class ErrorHandlerInterceptor implements HttpInterceptor {
4547 */
4648 private handleError ( response : HttpErrorResponse , request : HttpRequest < any > ) : Observable < HttpEvent < any > > {
4749 const status = response . status ;
48- let errorMessage = response . error . developerMessage || response . message ;
49- if ( response . error . errors ) {
50- if ( response . error . errors [ 0 ] ) {
51- errorMessage = response . error . errors [ 0 ] . defaultUserMessage || response . error . errors [ 0 ] . developerMessage ;
52- }
53- }
50+ const errorBody : any = response . error ;
51+ const translatedErrorMessage = this . errorHandlerService . translateFineractError ( errorBody ) ;
52+ const developerMessage : string | undefined = errorBody ?. developerMessage ;
53+ const errorMessage = translatedErrorMessage || errorBody ?. defaultUserMessage || response . message ;
5454
5555 const isClientImage404 = status === 404 && request . url . includes ( '/clients/' ) && request . url . includes ( '/images' ) ;
5656
5757 if ( ! environment . production && ! isClientImage404 ) {
58+ if ( developerMessage ) {
59+ log . error ( `Request Error (developerMessage): ${ developerMessage } ` ) ;
60+ }
5861 log . error ( `Request Error: ${ errorMessage } ` ) ;
5962 }
6063
61- if ( status === 401 || ( environment . oauth . enabled && status === 400 ) ) {
62- this . alertService . alert ( { type : 'Authentication Error' , message : 'Invalid User Details. Please try again!' } ) ;
63- } else if ( status === 403 && errorMessage === 'The provided one time token is invalid' ) {
64- this . alertService . alert ( { type : 'Invalid Token' , message : 'Invalid Token. Please try again!' } ) ;
65- } else if ( status === 400 ) {
64+ // OAuth2 errors for invalid grants are returned as 400, so we need to check the URL.
65+ if ( status === 401 || ( environment . oauth . enabled && status === 400 && request . url . includes ( '/oauth/token' ) ) ) {
6666 this . alertService . alert ( {
67- type : 'Bad Request' ,
68- message : errorMessage || 'Invalid parameters were passed in the request!'
67+ type : this . translate . instant ( 'error.resource.authenticationError.type' ) ,
68+ message : this . translate . instant ( 'error.resource.authenticationError.message' )
6969 } ) ;
70- } else if ( status === 403 ) {
70+ } else if ( status === 400 ) {
7171 this . alertService . alert ( {
72- type : 'Unauthorized Request' ,
73- message : errorMessage || 'You are not authorized for this request!'
72+ type : this . translate . instant ( 'error.resource.badRequest.type' ) ,
73+ message : errorMessage || this . translate . instant ( 'error.resource.badRequest.message' )
7474 } ) ;
75+ } else if ( status === 403 ) {
76+ // The token check must use a stable identifier, not the translated message.
77+ const isInvalidToken =
78+ errorBody ?. userMessageGlobalisationCode === 'error.msg.invalid.onetime.token' ||
79+ errorBody ?. defaultUserMessage === 'The provided one time token is invalid' ||
80+ errorMessage === 'The provided one time token is invalid' ;
81+
82+ if ( isInvalidToken ) {
83+ this . alertService . alert ( {
84+ type : this . translate . instant ( 'error.resource.invalidToken.type' ) ,
85+ message : this . translate . instant ( 'error.resource.invalidToken.message' )
86+ } ) ;
87+ } else {
88+ this . alertService . alert ( {
89+ type : this . translate . instant ( 'error.resource.unauthorizedRequest.type' ) ,
90+ message : errorMessage || this . translate . instant ( 'error.resource.unauthorizedRequest.message' )
91+ } ) ;
92+ }
7593 } else if ( status === 404 ) {
7694 // Check if this is an image request that should be silently handled (client profile image)
7795 if ( isClientImage404 ) {
@@ -81,21 +99,24 @@ export class ErrorHandlerInterceptor implements HttpInterceptor {
8199 } else {
82100 this . alertService . alert ( {
83101 type : this . translate . instant ( 'error.resource.not.found' ) ,
84- message : errorMessage || 'Resource does not exist!'
102+ message : errorMessage || this . translate . instant ( 'error.resource.notFound.message' )
85103 } ) ;
86104 }
87105 } else if ( status === 500 ) {
88106 this . alertService . alert ( {
89- type : 'Internal Server Error' ,
90- message : 'Internal Server Error. Please try again later.'
107+ type : this . translate . instant ( 'error.resource.internalServerError.type' ) ,
108+ message : this . translate . instant ( 'error.resource.internalServerError.message' )
91109 } ) ;
92110 } else if ( status === 501 ) {
93111 this . alertService . alert ( {
94112 type : this . translate . instant ( 'error.resource.notImplemented.type' ) ,
95113 message : this . translate . instant ( 'error.resource.notImplemented.message' )
96114 } ) ;
97115 } else {
98- this . alertService . alert ( { type : 'Unknown Error' , message : 'Unknown Error. Please try again later.' } ) ;
116+ this . alertService . alert ( {
117+ type : this . translate . instant ( 'error.resource.unknownError.type' ) ,
118+ message : errorMessage || this . translate . instant ( 'error.resource.unknownError.message' )
119+ } ) ;
99120 }
100121
101122 throw response ;
0 commit comments