{"version":3,"file":"sdcorejs-angular-handlers.mjs","sources":["../../../projects/sdcorejs-angular/handlers/global-error.handler.ts","../../../projects/sdcorejs-angular/handlers/sdcorejs-angular-handlers.ts"],"sourcesContent":["import { ErrorHandler, inject, Injectable } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n// Sử dụng Global Handler để đảm bảo khi có bản build mới sẽ báo cho người dùng biết để tải lại\n// Cách sử dụng: providers: [{ provide: ErrorHandler, useClass: GlobalErrorHandler }],\n@Injectable()\nexport class SdGlobalErrorHandler implements ErrorHandler {\n  readonly #i18n = inject(I18nService);\n\n  constructor() {}\n\n  handleError(error: any): void {\n    // Lấy message lỗi an toàn\n    const errorMessage = this.#extractErrorMessage(error);\n\n    // Danh sách các từ khóa nhận diện lỗi mất file JS/Chunk\n    // Cần bao gồm nhiều biến thể do trình duyệt/bundler khác nhau\n    const chunkErrorSignatures = [\n      'Loading chunk', // Webpack cũ\n      'Importing a module script failed', // Một số trình duyệt\n      'Failed to fetch dynamically imported module', // <-- Lỗi bạn đang gặp (Angular mới/Vite/Esbuild)\n      'error loading dynamically imported module', // Firefox/Safari biến thể\n      'missing source map', // Đôi khi đi kèm\n    ];\n\n    // Kiểm tra xem lỗi có chứa từ khóa nào không\n    const isChunkError = chunkErrorSignatures.some(signature => errorMessage.includes(signature.toLowerCase()));\n\n    if (isChunkError) {\n      console.warn('=> Chunk Load error detected:', errorMessage);\n\n      const wantReload = window.confirm(\n        this.#i18n.t('core.handler.global-error.update-title') + '\\n\\n' + this.#i18n.t('core.handler.global-error.update-body')\n      );\n\n      if (wantReload) {\n        window.location.reload();\n      }\n    } else {\n      // Log lỗi thường\n      console.error('Application error:', error);\n    }\n  }\n\n  // Hàm phụ trợ để lấy text lỗi từ object error bất kỳ\n  #extractErrorMessage = (error: any): string => {\n    if (!error) return '';\n\n    // Nếu là chuỗi\n    if (typeof error === 'string') return error.toLowerCase();\n\n    // Nếu là Error Object chuẩn\n    if (error.message) return error.message.toLowerCase();\n\n    // Nếu lỗi nằm trong rejection (Promise)\n    if (error.rejection) {\n      return typeof error.rejection === 'string' ? error.rejection.toLowerCase() : (error.rejection.message || '').toLowerCase();\n    }\n    return '';\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAGA;AACA;MAEa,oBAAoB,CAAA;AACtB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;AAEpC,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,WAAW,CAAC,KAAU,EAAA;;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;;AAIrD,QAAA,MAAM,oBAAoB,GAAG;AAC3B,YAAA,eAAe;AACf,YAAA,kCAAkC;AAClC,YAAA,6CAA6C;AAC7C,YAAA,2CAA2C;AAC3C,YAAA,oBAAoB;SACrB;;QAGD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAE3G,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,YAAY,CAAC;YAE3D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAC/B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CACxH;YAED,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC1B;QACF;aAAO;;AAEL,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC;QAC5C;IACF;;AAGA,IAAA,oBAAoB,GAAG,CAAC,KAAU,KAAY;AAC5C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;;QAGrB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK,CAAC,WAAW,EAAE;;QAGzD,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE;;AAGrD,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;AACnB,YAAA,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE;QAC5H;AACA,QAAA,OAAO,EAAE;AACX,IAAA,CAAC;wGArDU,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAApB,oBAAoB,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;;ACLD;;AAEG;;;;"}