@@ -29,6 +29,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
2929import { HttpErrorResponse } from '@angular/common/http' ;
3030import { Observable , throwError } from 'rxjs' ;
3131import { Router } from '@angular/router' ;
32+ import { TranslateService } from '@ngx-translate/core' ;
3233
3334export interface ErrorMessage {
3435 title : string ;
@@ -49,7 +50,9 @@ export class ErrorHandlerService {
4950 // eslint-disable-next-line @angular-eslint/prefer-inject
5051 private snackBar : MatSnackBar ,
5152 // eslint-disable-next-line @angular-eslint/prefer-inject
52- private router : Router
53+ private router : Router ,
54+ // eslint-disable-next-line @angular-eslint/prefer-inject
55+ private translate : TranslateService
5356 ) { }
5457
5558 /**
@@ -189,4 +192,58 @@ export class ErrorHandlerService {
189192 panelClass : [ 'info-snackbar' ]
190193 } ) ;
191194 }
195+
196+ /**
197+ * Translates a Fineract error response into a single, translated message.
198+ * Falls back to defaultUserMessage when translation keys are missing.
199+ */
200+ translateFineractError ( errorResponse : any ) : string {
201+ if ( ! errorResponse || typeof errorResponse !== 'object' ) {
202+ return '' ;
203+ }
204+
205+ const messages : string [ ] = [ ] ;
206+
207+ if ( errorResponse . userMessageGlobalisationCode ) {
208+ const mainMsg = this . getMessageForCode (
209+ errorResponse . userMessageGlobalisationCode ,
210+ errorResponse . defaultUserMessage
211+ ) ;
212+ if ( mainMsg ) {
213+ messages . push ( mainMsg ) ;
214+ }
215+ } else if ( errorResponse . defaultUserMessage ) {
216+ messages . push ( errorResponse . defaultUserMessage ) ;
217+ }
218+ if ( Array . isArray ( errorResponse . errors ) ) {
219+ errorResponse . errors . forEach ( ( error : any ) => {
220+ if ( ! error || typeof error !== 'object' ) {
221+ return ;
222+ }
223+ if ( error . userMessageGlobalisationCode ) {
224+ const nestedMsg = this . getMessageForCode ( error . userMessageGlobalisationCode , error . defaultUserMessage ) ;
225+ if ( nestedMsg ) {
226+ messages . push ( nestedMsg ) ;
227+ }
228+ } else if ( error . defaultUserMessage ) {
229+ messages . push ( error . defaultUserMessage ) ;
230+ }
231+ } ) ;
232+ }
233+ const uniqueMessages = Array . from ( new Set ( messages . filter ( ( m ) => ! ! m && typeof m === 'string' ) ) ) ;
234+ return uniqueMessages . join ( ' ' ) ;
235+ }
236+
237+ private getMessageForCode ( code : string , defaultMessage ?: string ) : string {
238+ if ( ! code ) {
239+ return defaultMessage || '' ;
240+ }
241+
242+ const translated = this . translate . instant ( code ) ;
243+ if ( translated && translated !== code ) {
244+ return translated ;
245+ }
246+
247+ return defaultMessage || '' ;
248+ }
192249}
0 commit comments