@africanies/angular-web-sdk 0.1.4 → 0.1.6

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.
Files changed (101) hide show
  1. package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +456 -169
  2. package/.nx/cache/14876618240301288353/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +1 -0
  3. package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/package.json +5 -5
  4. package/.nx/cache/{5741611231803799383 → 14876618240301288353}/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +100 -20
  5. package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +6 -0
  6. package/.nx/cache/17626862048742598274/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +1 -0
  7. package/.nx/cache/{14153928176747262656 → 17626862048742598274}/dist/libs/africanies-theme/package.json +3 -3
  8. package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/tailwind-preset.cjs +15 -7
  9. package/.nx/cache/{14153928176747262656 → 17626862048742598274}/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +10 -1
  10. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +9 -44
  11. package/.nx/cache/9040451482998546630/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -0
  12. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/package.json +3 -3
  13. package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +6 -5
  14. package/.nx/cache/run.json +19 -19
  15. package/.nx/cache/terminalOutputs/13555699813138069787 +6 -0
  16. package/.nx/cache/terminalOutputs/{12148417737220755248 → 14061940909886036014} +172 -174
  17. package/.nx/cache/terminalOutputs/{3064561615116090625 → 14876618240301288353} +7 -7
  18. package/.nx/cache/terminalOutputs/{1275815545780424169 → 17626862048742598274} +2 -2
  19. package/.nx/cache/terminalOutputs/7978448102466861029 +32 -0
  20. package/.nx/cache/terminalOutputs/{4011892767661954819 → 9040451482998546630} +1 -1
  21. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db +0 -0
  22. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-shm +0 -0
  23. package/.nx/workspace-data/0091ABA9-5C90-580D-953C-8C94E763ADB5-v3.db-wal +0 -0
  24. package/.nx/workspace-data/d/daemon.log +2370 -0
  25. package/.nx/workspace-data/d/server-process.json +2 -2
  26. package/.nx/workspace-data/file-map.json +3177 -3177
  27. package/.nx/workspace-data/nx_files.nxt +0 -0
  28. package/.nx/workspace-data/project-graph.json +2 -2
  29. package/apps/playground/src/app/app.routes.ts +15 -4
  30. package/apps/playground/src/app/app.ts +2 -2
  31. package/apps/playground/src/app/pages/home-page.ts +14 -14
  32. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +8 -43
  33. package/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +1 -1
  34. package/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +6 -5
  35. package/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +11 -11
  36. package/libs/africanies-core/src/lib/http/api-client.ts +4 -18
  37. package/libs/africanies-core/src/lib/http/is-retryable-get-error.ts +8 -4
  38. package/libs/africanies-core/src/lib/query/provide-africanies-query-defaults.ts +5 -6
  39. package/package.json +1 -1
  40. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  41. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/package.json +0 -36
  42. package/.nx/cache/1275815545780424169/dist/libs/africanies-theme/types/africanies-africanies-theme.d.ts +0 -157
  43. package/.nx/cache/13524438527920092277/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
  44. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/README.md +0 -46
  45. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs +0 -215
  46. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/fesm2022/africanies-africanies-theme.mjs.map +0 -1
  47. package/.nx/cache/14153928176747262656/dist/libs/africanies-theme/tailwind-preset.cjs +0 -245
  48. package/.nx/cache/18132311043100376919/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  49. package/.nx/cache/18132311043100376919/dist/libs/africanies-ui/types/africanies-africanies-ui.d.ts +0 -5410
  50. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/README.md +0 -69
  51. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/assets/icons.sprite.svg +0 -1844
  52. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs +0 -832
  53. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/fesm2022/africanies-africanies-icons.mjs.map +0 -1
  54. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/package.json +0 -31
  55. package/.nx/cache/2782605790118376385/dist/libs/africanies-icons/types/africanies-africanies-icons.d.ts +0 -108
  56. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/README.md +0 -31
  57. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/fesm2022/africanies-africanies-storage.mjs +0 -243
  58. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/fesm2022/africanies-africanies-storage.mjs.map +0 -1
  59. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/package.json +0 -27
  60. package/.nx/cache/3064561615116090625/dist/libs/africanies-storage/types/africanies-africanies-storage.d.ts +0 -210
  61. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/README.md +0 -85
  62. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs +0 -4546
  63. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/fesm2022/africanies-africanies-core.mjs.map +0 -1
  64. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/package.json +0 -32
  65. package/.nx/cache/4011892767661954819/dist/libs/africanies-core/types/africanies-africanies-core.d.ts +0 -2740
  66. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/README.md +0 -68
  67. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  68. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  69. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -5
  70. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -7
  71. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs +0 -19088
  72. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/fesm2022/africanies-africanies-ui.mjs.map +0 -1
  73. package/.nx/cache/5741611231803799383/dist/libs/africanies-ui/package.json +0 -36
  74. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/README.md +0 -60
  75. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs +0 -599
  76. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/fesm2022/africanies-africanies-models.mjs.map +0 -1
  77. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/package.json +0 -24
  78. package/.nx/cache/6372470950255467653/dist/libs/africanies-models/types/africanies-africanies-models.d.ts +0 -1452
  79. package/.nx/cache/terminalOutputs/11768036696192889608 +0 -8
  80. package/.nx/cache/terminalOutputs/1227201614544602906 +0 -23
  81. package/.nx/cache/terminalOutputs/12538607787148205787 +0 -19
  82. package/.nx/cache/terminalOutputs/13524438527920092277 +0 -196
  83. package/.nx/cache/terminalOutputs/14153928176747262656 +0 -45
  84. package/.nx/cache/terminalOutputs/17404566492103808557 +0 -8
  85. package/.nx/cache/terminalOutputs/18132311043100376919 +0 -315
  86. package/.nx/cache/terminalOutputs/2436781291243085315 +0 -8
  87. package/.nx/cache/terminalOutputs/2782605790118376385 +0 -21
  88. package/.nx/cache/terminalOutputs/3681975492957101833 +0 -8
  89. package/.nx/cache/terminalOutputs/5741611231803799383 +0 -21
  90. package/.nx/cache/terminalOutputs/6037166070823946880 +0 -8
  91. package/.nx/cache/terminalOutputs/6372470950255467653 +0 -21
  92. package/.nx/cache/terminalOutputs/665190206482526466 +0 -175
  93. package/.nx/cache/terminalOutputs/7756595539965457927 +0 -23
  94. package/.nx/cache/terminalOutputs/9200013119269230075 +0 -8
  95. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/README.md +0 -0
  96. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo-mini.png +0 -0
  97. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo.png +0 -0
  98. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/brand/africanies-logo.svg +0 -0
  99. /package/.nx/cache/{18132311043100376919 → 14876618240301288353}/dist/libs/africanies-ui/assets/carriers/dhl.svg +0 -0
  100. /package/.nx/cache/{1275815545780424169 → 17626862048742598274}/dist/libs/africanies-theme/README.md +0 -0
  101. /package/.nx/cache/{13524438527920092277 → 9040451482998546630}/dist/libs/africanies-core/README.md +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"africanies-africanies-core.mjs","sources":["../../../../libs/africanies-core/src/lib/config/africanies-sdk.config.ts","../../../../libs/africanies-core/src/lib/shipping/shipping-mode.service.ts","../../../../libs/africanies-core/src/lib/http/wire.ts","../../../../libs/africanies-core/src/lib/http/validation-bag.ts","../../../../libs/africanies-core/src/lib/http/normalize.ts","../../../../libs/africanies-core/src/lib/http/api-error-message.ts","../../../../libs/africanies-core/src/lib/http/http-cache.ts","../../../../libs/africanies-core/src/lib/shipping/shipping-mode.context.ts","../../../../libs/africanies-core/src/lib/http/toast-http.context.ts","../../../../libs/africanies-core/src/lib/http/resolve-http-toast-context.ts","../../../../libs/africanies-core/src/lib/http/resolve-api-request-context.ts","../../../../libs/africanies-core/src/lib/http/resource-path.ts","../../../../libs/africanies-core/src/lib/http/api-client.ts","../../../../libs/africanies-core/src/lib/mode/mode-config.mapper.ts","../../../../libs/africanies-core/src/lib/mode/mode-config.service.ts","../../../../libs/africanies-core/src/lib/mode/provide-mode-config.ts","../../../../libs/africanies-core/src/lib/config/provide-africanies-sdk.ts","../../../../libs/africanies-core/src/lib/auth/auth.paths.ts","../../../../libs/africanies-core/src/lib/auth/auth.service.ts","../../../../libs/africanies-core/src/lib/auth/auth-token.service.ts","../../../../libs/africanies-core/src/lib/auth/is-valid-email.ts","../../../../libs/africanies-core/src/lib/shipping/shipment-mode.interceptor.ts","../../../../libs/africanies-core/src/lib/http/auth.interceptor.ts","../../../../libs/africanies-core/src/lib/http/http-toast.interceptor.ts","../../../../libs/africanies-core/src/lib/http/map-api-json.ts","../../../../libs/africanies-core/src/lib/http/provide-africanies-http-client.ts","../../../../libs/africanies-core/src/lib/query/list-fetch-kind.ts","../../../../libs/africanies-core/src/lib/query/provide-africanies-query-defaults.ts","../../../../libs/africanies-core/src/lib/country/country.mapper.ts","../../../../libs/africanies-core/src/lib/country/country.service.ts","../../../../libs/africanies-core/src/lib/country/country-flag.ts","../../../../libs/africanies-core/src/lib/country/index.ts","../../../../libs/africanies-core/src/lib/file/file.mapper.ts","../../../../libs/africanies-core/src/lib/document/document.mapper.ts","../../../../libs/africanies-core/src/lib/document/document.service.ts","../../../../libs/africanies-core/src/lib/document/index.ts","../../../../libs/africanies-core/src/lib/plan/plan.mapper.ts","../../../../libs/africanies-core/src/lib/plan/plan.service.ts","../../../../libs/africanies-core/src/lib/plan/index.ts","../../../../libs/africanies-core/src/lib/service/service.mapper.ts","../../../../libs/africanies-core/src/lib/service/service.service.ts","../../../../libs/africanies-core/src/lib/service/index.ts","../../../../libs/africanies-core/src/lib/currency/currency.mapper.ts","../../../../libs/africanies-core/src/lib/currency/currency.service.ts","../../../../libs/africanies-core/src/lib/currency/index.ts","../../../../libs/africanies-core/src/lib/payment-method/payment-method.mapper.ts","../../../../libs/africanies-core/src/lib/payment-method/payment-method.service.ts","../../../../libs/africanies-core/src/lib/payment-method/index.ts","../../../../libs/africanies-core/src/lib/shipment-method/shipment-method.mapper.ts","../../../../libs/africanies-core/src/lib/shipment-method/shipment-method.service.ts","../../../../libs/africanies-core/src/lib/shipment-method/index.ts","../../../../libs/africanies-core/src/lib/warehouse/warehouse.mapper.ts","../../../../libs/africanies-core/src/lib/warehouse/warehouse.service.ts","../../../../libs/africanies-core/src/lib/warehouse/index.ts","../../../../libs/africanies-core/src/lib/zone/zone.mapper.ts","../../../../libs/africanies-core/src/lib/zone/zone.service.ts","../../../../libs/africanies-core/src/lib/zone/index.ts","../../../../libs/africanies-core/src/lib/user/user.mapper.ts","../../../../libs/africanies-core/src/lib/user/user.service.ts","../../../../libs/africanies-core/src/lib/notification/notification.mapper.ts","../../../../libs/africanies-core/src/lib/notification/notification.service.ts","../../../../libs/africanies-core/src/lib/notification/notification-link.ts","../../../../libs/africanies-core/src/lib/file/file.service.ts","../../../../libs/africanies-core/src/lib/file/index.ts","../../../../libs/africanies-core/src/lib/product/product.mapper.ts","../../../../libs/africanies-core/src/lib/product/product.service.ts","../../../../libs/africanies-core/src/lib/product/index.ts","../../../../libs/africanies-core/src/lib/filters/filter-options.mapper.ts","../../../../libs/africanies-core/src/lib/filters/filter-options.resolver.ts","../../../../libs/africanies-core/src/lib/overlay/overlay-tokens.ts","../../../../libs/africanies-core/src/lib/overlay/route-overlay.service.ts","../../../../libs/africanies-core/src/lib/overlay/provide-overlay-routes.ts","../../../../libs/africanies-core/src/lib/browser/copy-to-clipboard.ts","../../../../libs/africanies-core/src/lib/browser/download-csv.ts","../../../../libs/africanies-core/src/lib/browser/index.ts","../../../../libs/africanies-core/src/index.ts","../../../../libs/africanies-core/src/africanies-africanies-core.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nimport type { ToastHttpOptions } from '../http/toast-http.context';\n\n/**\n * Default HTTP toast behaviour for {@link ApiClient} requests.\n *\n * - `'off'` (default) — no automatic tagging; use {@link withToast} on raw\n * HttpClient calls or {@link ApiRequestOptions.toast} per SDK call.\n * - `'errors'` — tag mutating SDK requests (POST / PUT / PATCH / DELETE) with\n * error toasts only. GET stays silent so list/detail screens own their empty\n * / error UI.\n * - `'all'` — success + error toasts on mutating SDK requests (GET still silent\n * unless the call opts in).\n * - Partial {@link ToastHttpOptions} — custom defaults merged per mutating request.\n */\nexport type AfricaniesSdkHttpToasts = 'off' | 'errors' | 'all' | Partial<ToastHttpOptions>;\n\n/**\n * Runtime configuration for the AFRICANIES SDK HTTP layer and related services.\n *\n * Provided once at bootstrap via {@link provideAfricaniesSdk} and injected\n * wherever the SDK needs the API origin or shared request defaults.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\n * import { provideAfricaniesSdk, provideAfricaniesHttpClient } from '@africanies/africanies-core';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideZoneChangeDetection({ eventCoalescing: true }),\n * provideAfricaniesSdk({\n * baseUrl: 'https://api.example.com',\n * timeout: 30_000,\n * defaultHeaders: { 'X-App': 'stn-web' },\n * }),\n * provideAfricaniesHttpClient(),\n * ],\n * };\n * ```\n */\nexport interface AfricaniesSdkConfig {\n /**\n * Absolute API origin used to resolve relative paths in {@link ApiClient}\n * (e.g. `'https://api.example.com'`). Trailing slashes are trimmed when\n * composing URLs so callers can pass either style.\n */\n baseUrl: string;\n\n /**\n * Per-request timeout in milliseconds applied by {@link ApiClient}.\n * Omitted when the consumer prefers HttpClient / browser defaults only.\n */\n timeout?: number;\n\n /**\n * Headers merged onto every {@link ApiClient} request.\n * Request-specific headers override these on key collision.\n */\n defaultHeaders?: Record<string, string>;\n\n /**\n * When true (default), fetch `/public/mode/config` on startup via\n * {@link provideModeConfig}. Set `false` for tests or offline-only shells.\n */\n loadModeConfig?: boolean;\n\n /**\n * Automatic {@link withToast} tagging for {@link ApiClient} HTTP calls.\n *\n * Defaults to `'off'` so production apps opt in explicitly. Admin shells use\n * `'errors'` so POST / PUT / PATCH / DELETE failures surface while GET list\n * failures stay in-page.\n */\n httpToasts?: AfricaniesSdkHttpToasts;\n}\n\n/**\n * DI token for the active {@link AfricaniesSdkConfig}.\n *\n * Apps must call {@link provideAfricaniesSdk} at bootstrap; injecting without that\n * provider throws so misconfiguration fails fast rather than silently using\n * an empty base URL.\n */\nexport const AFRICANIES_SDK_CONFIG = new InjectionToken<AfricaniesSdkConfig>(\n 'AFRICANIES_SDK_CONFIG',\n);\n","import {\n inject,\n Injectable,\n Injector,\n type Signal,\n signal,\n} from '@angular/core';\n\nimport { Observable, of } from 'rxjs';\nimport { map, take, tap } from 'rxjs/operators';\n\nimport type { ShippingMode } from '@africanies/africanies-models';\nimport {\n AFRICANIES_SHIPPING_MODE_KEY,\n SessionStorageService,\n} from '@africanies/africanies-storage';\n\nimport { ApiClient } from '../http/api-client';\n\nconst DEFAULT_MODE: ShippingMode = 'sfn';\n\n/**\n * Optional gate before a shell mode switch applies.\n *\n * Return `true` to allow {@link ShippingModeService.requestModeChange} to\n * persist the new mode; `false` keeps the current mode.\n */\nexport type ShippingModeChangeGuard = (\n next: ShippingMode,\n current: ShippingMode,\n) => Observable<boolean>;\n\n/**\n * Signal-based holder for the active {@link ShippingMode}.\n *\n * Persists through {@link SessionStorageService} under\n * {@link AFRICANIES_SHIPPING_MODE_KEY} so each browser tab can hold its own STN/SFN\n * context (refresh within the tab keeps the choice; other tabs are unaffected).\n * Defaults to `'sfn'` when nothing is stored or the stored value is not a known\n * mode — preferring a safe outbound default over failing open on corrupt storage.\n *\n * Changing mode clears {@link ApiClient}'s GET cache so `readAll` / by-id\n * dumps cannot cross STN↔SFN (cache keys omit the mode header). `ApiClient`\n * is resolved lazily via {@link Injector} to avoid a DI cycle.\n *\n * List screens should drop in-memory rows and show a blocking loader until\n * the new mode's page arrives — STN rows must not linger on SFN. Use\n * `listFetchKind` with `reason: 'mode'`.\n *\n * Features that must warn before a switch (e.g. mid Create Shipment) can\n * {@link registerModeChangeGuard}. The shell switch uses\n * {@link requestModeChange}; programmatic {@link setMode} bypasses the guard.\n *\n * Provided in root; no explicit provider registration is required.\n * Pair with {@link shipmentModeInterceptor} so HTTP calls advertise the mode.\n *\n * @example\n * ```ts\n * const shipping = inject(ShippingModeService);\n * shipping.setMode('stn');\n * console.log(shipping.mode()); // 'stn'\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ShippingModeService {\n private readonly storage = inject(SessionStorageService);\n private readonly injector = inject(Injector);\n\n private readonly _mode = signal<ShippingMode>(this.readInitialMode());\n private modeChangeGuard: ShippingModeChangeGuard | null = null;\n\n /**\n * Read-only view of the current shipping mode (`Signal` = Angular's\n * readonly signal surface; mutate only via {@link setMode} /\n * {@link requestModeChange}).\n */\n readonly mode: Signal<ShippingMode> = this._mode.asReadonly();\n\n /**\n * Register a single guard for shell mode switches. Pass `null` to clear\n * (e.g. on feature destroy). Only one guard is active at a time.\n * @param guard\n */\n registerModeChangeGuard(guard: ShippingModeChangeGuard | null): void {\n this.modeChangeGuard = guard;\n }\n\n /**\n * Shell switch entry point: runs any registered guard, then applies the\n * mode when allowed.\n *\n * @param mode - `'stn'` or `'sfn'`.\n * @returns Emits once with `true` when the mode changed, else `false`.\n */\n requestModeChange(mode: ShippingMode): Observable<boolean> {\n if (mode === this._mode()) {\n return of(false);\n }\n const current = this._mode();\n const guard = this.modeChangeGuard;\n const allowed$ = guard ? guard(mode, current) : of(true);\n return allowed$.pipe(\n take(1),\n tap((ok) => {\n if (ok) {\n this.applyMode(mode);\n }\n }),\n map((ok) => !!ok),\n );\n }\n\n /**\n * Updates the active mode and persists it for the current tab.\n * No-ops when `mode` already matches the current value.\n * Bypasses {@link registerModeChangeGuard} — prefer\n * {@link requestModeChange} for user-driven switches.\n *\n * @param mode - `'stn'` or `'sfn'`.\n */\n setMode(mode: ShippingMode): void {\n if (mode === this._mode()) {\n return;\n }\n this.applyMode(mode);\n }\n\n private applyMode(mode: ShippingMode): void {\n this._mode.set(mode);\n this.storage.set<ShippingMode>(AFRICANIES_SHIPPING_MODE_KEY, mode);\n this.injector.get(ApiClient).clearCache();\n }\n\n private readInitialMode(): ShippingMode {\n const stored = this.storage.get<ShippingMode>(AFRICANIES_SHIPPING_MODE_KEY);\n return stored === 'stn' || stored === 'sfn' ? stored : DEFAULT_MODE;\n }\n}\n","/**\n * Null-safe coercions for AFRICANIES wire JSON.\n *\n * Mappers should run every request/response field through these helpers so\n * missing keys, `null`, and wrong JSON types never throw at `.map` / `.trim`.\n */\n\n/**\n * Narrow unknown JSON into a plain object record.\n * @param value - Candidate value.\n * @returns Record when a non-array object; otherwise `null`.\n */\nexport function asRecord(value: unknown): Record<string, unknown> | null {\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * Coerce a value to an array. Non-arrays become `[]`.\n * @param value - Candidate list.\n */\nexport function asArray<T = unknown>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\n/**\n * Map every element of a wire list. Non-arrays yield `[]`.\n * @param value - Candidate list.\n * @param mapOne - Per-item mapper.\n */\nexport function mapArray<T>(\n value: unknown,\n mapOne: (entry: unknown) => T,\n): T[] {\n return asArray(value).map(mapOne);\n}\n\n/**\n * If a list payload is wrapped in a Laravel paginator / `{ data | items }`,\n * return the inner array. Otherwise return `value` unchanged.\n * @param value - Envelope `data` or a nested list field.\n */\nfunction unwrapListPayload(value: unknown): unknown {\n if (Array.isArray(value) || value == null) {\n return value;\n }\n const record = asRecord(value);\n if (record === null) {\n return value;\n }\n const nested = record['data'] ?? record['items'] ?? record['results'];\n if (Array.isArray(nested)) {\n return nested;\n }\n if (\n nested == null &&\n ('current_page' in record ||\n 'currentPage' in record ||\n 'last_page' in record ||\n 'lastPage' in record ||\n 'per_page' in record ||\n 'perPage' in record)\n ) {\n return [];\n }\n return value;\n}\n\n/**\n * Map a list-or-single payload (Laravel sometimes sends one object).\n *\n * - `null` / `undefined` → `[]`\n * - paginator / `{ data | items }` → mapped inner rows\n * - array → mapped items\n * - anything else → one mapped item\n *\n * @param value - Envelope `data` (or a nested list field).\n * @param mapOne - Per-item mapper.\n */\nexport function mapList<T>(\n value: unknown,\n mapOne: (entry: unknown) => T,\n): T[] {\n const list = unwrapListPayload(value);\n if (list == null) {\n return [];\n }\n if (Array.isArray(list)) {\n return list.map(mapOne);\n }\n return [mapOne(list)];\n}\n\n/**\n * Finite number, or `fallback` when missing/invalid.\n * @param value - Raw numeric field.\n * @param fallback - Default when not a finite number.\n */\nexport function asNumber(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\n/**\n * Finite number, or `null` when missing/invalid.\n * @param value - Raw numeric field.\n */\nexport function asNullableNumber(value: unknown): number | null {\n if (value == null || value === '') {\n return null;\n }\n const n = Number(value);\n return Number.isFinite(n) ? n : null;\n}\n\n/**\n * String, or `fallback` when the value cannot be stringified usefully.\n * @param value - Raw string field.\n * @param fallback - Default when nullish / non-scalar.\n */\nexport function asString(value: unknown, fallback = ''): string {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return fallback;\n}\n\n/**\n * String or `null` (never `undefined`).\n * @param value - Raw string field.\n */\nexport function asNullableString(value: unknown): string | null {\n if (value == null) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return null;\n}\n\n/**\n * Boolean from wire flags (`true` / `false` / `1` / `0` / `\"true\"` / `\"1\"`).\n * Missing values are `false`.\n * @param value - Raw flag.\n */\nexport function asBoolean(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n return value === 1;\n }\n const trimmed = String(value ?? '')\n .trim()\n .toLowerCase();\n return trimmed === '1' || trimmed === 'true';\n}\n\n/**\n * Boolean or `null` when the field is absent / unparseable.\n * @param value - Raw flag.\n */\nexport function asNullableBoolean(value: unknown): boolean | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number') {\n return value === 1;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim().toLowerCase();\n if (trimmed === '1' || trimmed === 'true') {\n return true;\n }\n if (trimmed === '0' || trimmed === 'false') {\n return false;\n }\n }\n return null;\n}\n\n/**\n * Wire `\"1\"` / `\"0\"` from a boolean, number, or string flag.\n * @param value - Host or wire flag.\n */\nexport function toFlag01(value: unknown): '0' | '1' {\n return asBoolean(value) ? '1' : '0';\n}\n\n/**\n * User-model `0` / `1` flag, or `null` when absent.\n * @param value - Raw flag.\n */\nexport function asNullableFlag01(value: unknown): 0 | 1 | null {\n if (value == null || value === '') {\n return null;\n }\n if (value === 1 || value === '1' || value === true) {\n return 1;\n }\n if (value === 0 || value === '0' || value === false) {\n return 0;\n }\n return null;\n}\n","import type { ApiErrorDetailModel } from '@africanies/africanies-models';\n\nimport { asArray, asRecord, asString } from './wire';\n\n/**\n * Laravel-style validation bag: `{ field: [\"msg\", ...] }`.\n * @param value - Candidate JSON object.\n */\nexport function isLaravelValidationBag(value: unknown): boolean {\n const record = asRecord(value);\n if (record === null) {\n return false;\n }\n\n const keys = Object.keys(record);\n if (keys.length === 0) {\n return false;\n }\n\n return keys.every((key) => {\n const entry = record[key];\n return (\n Array.isArray(entry) &&\n entry.every((item) => typeof item === 'string')\n );\n });\n}\n\n/**\n * Flatten a validation bag into {@link ApiErrorDetailModel} rows.\n *\n * Uses messages in order; the first message per field is what\n * {@link fieldErrorsMap} exposes for form binding.\n * @param bag - Field → messages map.\n */\nexport function mapLaravelValidationBag(\n bag: Record<string, unknown>,\n): ApiErrorDetailModel[] {\n const details: ApiErrorDetailModel[] = [];\n\n for (const [field, rawMessages] of Object.entries(bag)) {\n const messages = asArray<string>(rawMessages)\n .map((m) => asString(m).trim())\n .filter((m) => m.length > 0);\n\n for (const message of messages) {\n details.push({ field, message, code: null });\n }\n }\n\n return details;\n}\n\n/**\n * Join field errors for toast / banner copy (one line per message, de-duped).\n * Prefer this over top-level `message` when a bag is present — the envelope\n * `message` is often only the first field.\n * @param errors - Normalized field errors.\n */\nexport function joinApiErrorMessages(\n errors: ApiErrorDetailModel[] | null | undefined,\n): string | null {\n if (!errors?.length) {\n return null;\n }\n\n const lines: string[] = [];\n const seen = new Set<string>();\n\n for (const detail of errors) {\n const message = detail.message.trim();\n if (!message || seen.has(message)) {\n continue;\n }\n seen.add(message);\n lines.push(message);\n }\n\n return lines.length > 0 ? lines.join('\\n') : null;\n}\n\n/**\n * First message per field for form control binding.\n * @param errors - Normalized field errors.\n */\nexport function fieldErrorsMap(\n errors: ApiErrorDetailModel[] | null | undefined,\n): Record<string, string> {\n const map: Record<string, string> = {};\n if (!errors?.length) {\n return map;\n }\n\n for (const detail of errors) {\n const field = detail.field?.trim();\n const message = detail.message.trim();\n if (!field || !message || field in map) {\n continue;\n }\n map[field] = message;\n }\n\n return map;\n}\n","import type {\n ApiErrorDetailModel,\n ApiResponseModel,\n PaginationMetaModel,\n} from '@africanies/africanies-models';\n\nimport {\n isLaravelValidationBag,\n joinApiErrorMessages,\n mapLaravelValidationBag,\n} from './validation-bag';\nimport { asArray, asNullableString, asNumber, asRecord, asString } from './wire';\n\n/**\n * Whether the payload looks like an AFRICANIES API envelope.\n * @param value\n */\nfunction isWrappedEnvelope(value: unknown): boolean {\n const record = asRecord(value);\n return record !== null && 'success' in record && 'data' in record;\n}\n\n/**\n * Laravel LengthAwarePaginator nested inside the envelope `data` field.\n * @param value\n */\nexport function isLaravelPaginator(value: unknown): boolean {\n const record = asRecord(value);\n if (record === null) {\n return false;\n }\n\n return (\n (Array.isArray(record['data']) || record['data'] == null) &&\n ('current_page' in record ||\n 'currentPage' in record ||\n 'last_page' in record ||\n 'lastPage' in record ||\n 'per_page' in record ||\n 'perPage' in record)\n );\n}\n\n/**\n * Map pagination from snake_case (preferred), legacy camelCase, or Laravel keys.\n * @param value\n */\nexport function normalizePagination(value: unknown): PaginationMetaModel | null {\n const record = asRecord(value);\n if (record === null) {\n return null;\n }\n\n const current_page = record['current_page'] ?? record['currentPage'];\n const per_page = record['per_page'] ?? record['perPage'];\n const total_items =\n record['total_items'] ?? record['totalItems'] ?? record['total'];\n const total_pages =\n record['total_pages'] ??\n record['totalPages'] ??\n record['last_page'] ??\n record['lastPage'];\n let has_next_page = record['has_next_page'] ?? record['hasNextPage'];\n let has_previous_page =\n record['has_previous_page'] ?? record['hasPreviousPage'];\n\n if (has_next_page == null) {\n const next_page_url = record['next_page_url'] ?? record['nextPageUrl'];\n has_next_page = next_page_url != null && next_page_url !== '';\n }\n\n if (has_previous_page == null) {\n const prev_page_url = record['prev_page_url'] ?? record['prevPageUrl'];\n has_previous_page = prev_page_url != null && prev_page_url !== '';\n }\n\n return {\n current_page: asNumber(current_page),\n per_page: asNumber(per_page),\n total_items: asNumber(total_items),\n total_pages: asNumber(total_pages),\n has_next_page: Boolean(has_next_page),\n has_previous_page: Boolean(has_previous_page),\n };\n}\n\n/**\n * Flatten a Laravel paginator in `data` into list payload + {@link PaginationMetaModel}.\n * @param raw\n */\nexport function unwrapLaravelPaginator<T>(raw: unknown): {\n data: T[] | null;\n pagination: PaginationMetaModel | null;\n} {\n if (!isLaravelPaginator(raw)) {\n return {\n data: (raw as T[] | null | undefined) ?? null,\n pagination: null,\n };\n }\n\n const record = asRecord(raw);\n if (record === null) {\n return { data: null, pagination: null };\n }\n\n return {\n data: Array.isArray(record['data']) ? (record['data'] as T[]) : [],\n pagination: normalizePagination(record),\n };\n}\n\n/**\n * Coalesce a single error entry so missing field/code become `null`.\n * @param value\n */\nfunction normalizeErrorDetail(value: unknown): ApiErrorDetailModel {\n const record = asRecord(value) ?? {};\n return {\n field: asString(record['field']) || null,\n message: asString(record['message']),\n code: asString(record['code']) || null,\n };\n}\n\n/**\n * Resolve field errors from an envelope `errors` value or a failure `data` bag.\n * @param errorsRaw - Wire `errors` (array or Laravel object map).\n * @param data - Envelope `data` (may hold a validation bag on failure).\n * @param success - Envelope success flag.\n */\nfunction resolveErrors(\n errorsRaw: unknown,\n data: unknown,\n success: boolean,\n): ApiErrorDetailModel[] | null {\n if (Array.isArray(errorsRaw)) {\n const details = asArray(errorsRaw).map(normalizeErrorDetail);\n return details.length > 0 ? details : null;\n }\n\n if (isLaravelValidationBag(errorsRaw)) {\n const details = mapLaravelValidationBag(asRecord(errorsRaw) ?? {});\n return details.length > 0 ? details : null;\n }\n\n // Soft/hard validation failures often put the bag in `data` (not `errors`).\n if (!success && isLaravelValidationBag(data)) {\n const details = mapLaravelValidationBag(asRecord(data) ?? {});\n return details.length > 0 ? details : null;\n }\n\n return null;\n}\n\n/**\n * Normalize any HTTP JSON body into a fully null-safe {@link ApiResponseModel}.\n *\n * Envelope fields use snake_case where the wire does (`status_code`,\n * pagination keys). Paginated list reads often embed a Laravel paginator in\n * `data` (`data.data` + totals) — that shape is flattened here so consumers\n * always see `data: T[]` and `pagination`.\n *\n * Validation failures that return a Laravel field bag in `errors` or `data`\n * are lifted into `errors: ApiErrorDetailModel[]`. On failure, a bag in\n * `data` is cleared (`data: null`) so it is not typed as success payload `T`.\n * Top-level `message` is enriched to the joined field messages when a bag\n * exists (API `message` alone is often only the first field).\n * @param raw\n */\nexport function normalize<T>(raw: unknown): ApiResponseModel<T> {\n if (isWrappedEnvelope(raw)) {\n const record = asRecord(raw);\n if (record !== null) {\n const successRaw = record['success'];\n const success =\n typeof successRaw === 'boolean' ? successRaw : Boolean(successRaw);\n const status_code =\n record['status_code'] ?? record['statusCode'] ?? null;\n\n let pagination = normalizePagination(record['pagination']);\n let data = (record['data'] as T | null | undefined) ?? null;\n\n if (pagination === null && isLaravelPaginator(data)) {\n const unwrapped = unwrapLaravelPaginator<T>(data);\n data = (unwrapped.data as T | null | undefined) ?? null;\n pagination = unwrapped.pagination;\n }\n\n const errors = resolveErrors(record['errors'], data, success);\n const apiMessage = asNullableString(record['message']);\n\n // Do not leave a validation bag typed as success payload `T`.\n if (!success && isLaravelValidationBag(data)) {\n data = null;\n }\n\n return {\n success,\n message: joinApiErrorMessages(errors) ?? apiMessage,\n data,\n errors,\n pagination,\n status_code:\n status_code === null || status_code === undefined\n ? null\n : asNumber(status_code),\n };\n }\n }\n\n return {\n success: true,\n message: null,\n data: (raw as T | null | undefined) ?? null,\n errors: null,\n pagination: null,\n status_code: null,\n };\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport { normalize } from './normalize';\nimport { joinApiErrorMessages } from './validation-bag';\nimport { asRecord } from './wire';\n\n/**\n * Resolve user-facing error copy from an API envelope, raw body, or HttpClient error.\n *\n * Prefers joined field messages when present; otherwise envelope / HTTP `message`.\n *\n * Prefer relying on {@link ApiClient}: HTTP failures are already rethrown as\n * `Error` with this text on `.message`. Hosts mainly need this helper when\n * calling Angular `HttpClient` directly (e.g. toast interceptor).\n *\n * @param input - Normalized response, raw JSON body, or {@link HttpErrorResponse}.\n */\nexport function formatApiErrorMessage(input: unknown): string {\n if (typeof input === 'string' && input.trim()) {\n return input.trim();\n }\n\n if (input instanceof HttpErrorResponse) {\n const fromBody = formatApiErrorMessage(input.error);\n if (fromBody !== 'Something went wrong.') {\n return fromBody;\n }\n if (input.status === 0) {\n return 'Network error. Check your connection.';\n }\n if (input.status === 401 || input.status === 403) {\n return 'Authentication failed. Check your access token.';\n }\n if (input.status >= 500) {\n return 'Server error. Try again in a moment.';\n }\n if (input.message?.trim()) {\n return input.message.trim();\n }\n return `Request failed (${input.status})`;\n }\n\n if (input && typeof input === 'object' && 'success' in input && 'data' in input) {\n const normalized = normalize<unknown>(input);\n return (\n joinApiErrorMessages(normalized.errors) ??\n normalized.message?.trim() ??\n 'Something went wrong.'\n );\n }\n\n if (input && typeof input === 'object') {\n const record = asRecord(input);\n if (\n record &&\n typeof record['message'] === 'string' &&\n record['message'].trim()\n ) {\n return record['message'].trim();\n }\n }\n\n if (input instanceof Error && input.message.trim()) {\n return input.message.trim();\n }\n\n return 'Something went wrong.';\n}\n","/**\n * Tiny in-memory TTL cache for {@link ApiClient} GET responses.\n *\n * Intentionally process-local and non-persistent: it exists to skip identical\n * GETs within a short window (e.g. rapid remounts), not to replace TanStack\n * Query or server cache headers.\n *\n * ## When NOT to use caching (`cacheTtlMs`)\n *\n * - Frequently changing data (dashboards, live rates, inventory) — stale reads\n * are worse than an extra round-trip.\n * - User-specific or permission-sensitive payloads — another user/session in\n * the same SPA tab could theoretically share the in-memory map.\n * - After mutations that invalidate list/detail views — this cache has no\n * tag-based invalidation; prefer TanStack Query for that.\n * - Large payloads — every entry stays in heap until TTL expiry.\n *\n * Prefer omitting `cacheTtlMs` unless you have a measured hot-spot and a\n * known staleness budget.\n */\n\ninterface CacheEntry {\n /** Epoch ms after which the entry must not be served. */\n expiresAt: number;\n /** Normalized or raw value stored for the request key. */\n value: unknown;\n}\n\n/**\n * Key/value store with per-entry TTL eviction on read.\n */\nexport class HttpResponseCache {\n private readonly store = new Map<string, CacheEntry>();\n\n /**\n * Returns a cached value when present and not expired.\n *\n * @param key - Stable request identity (method + URL + relevant params).\n * @returns The stored value, or `null` on miss / expiry.\n */\n get<T>(key: string): T | null {\n const entry = this.store.get(key);\n if (!entry) {\n return null;\n }\n if (Date.now() >= entry.expiresAt) {\n this.store.delete(key);\n return null;\n }\n return entry.value as T;\n }\n\n /**\n * Stores a value until `ttlMs` elapses.\n *\n * @param key - Stable request identity.\n * @param value - Value to reuse for subsequent hits.\n * @param ttlMs - Time-to-live in milliseconds from now.\n */\n set(key: string, value: unknown, ttlMs: number): void {\n this.store.set(key, {\n value,\n expiresAt: Date.now() + ttlMs,\n });\n }\n\n /**\n * Drops every entry. Useful after logout or global invalidation hooks.\n */\n clear(): void {\n this.store.clear();\n }\n}\n","import { HttpContext, HttpContextToken } from '@angular/common/http';\n\nimport type { ShippingMode } from '@africanies/africanies-models';\n\n/**\n * Per-request shipping-mode override for {@link shipmentModeInterceptor}.\n *\n * When set, `x-shipment-mode` uses this value instead of\n * {@link ShippingModeService.mode}. The tab / session mode is unchanged.\n * Sentinel `null` means “use the active tab mode”.\n */\nexport const SHIPPING_MODE_OVERRIDE = new HttpContextToken<ShippingMode | null>(\n () => null,\n);\n\n/**\n * Narrow unknown JSON / option values to a {@link ShippingMode}.\n *\n * @param value - Candidate value.\n * @returns `'stn'` or `'sfn'` when valid; otherwise `undefined`.\n */\nexport function asShippingMode(value: unknown): ShippingMode | undefined {\n return value === 'stn' || value === 'sfn' ? value : undefined;\n}\n\n/**\n * Tag a request so {@link shipmentModeInterceptor} sends a different\n * `x-shipment-mode` without calling {@link ShippingModeService.setMode}.\n *\n * Prefer {@link ApiRequestOptions.shippingMode} on {@link ApiClient} calls.\n * Use this helper with raw `HttpClient`.\n *\n * @param mode - Mode for this request only.\n * @param context - Existing context to merge (e.g. from {@link withToast}).\n * @returns HttpContext with the override set.\n *\n * @example\n * ```ts\n * this.http.post(url, body, { context: withShippingMode('stn') });\n * ```\n */\nexport function withShippingMode(\n mode: ShippingMode,\n context?: HttpContext,\n): HttpContext {\n return (context ?? new HttpContext()).set(SHIPPING_MODE_OVERRIDE, mode);\n}\n","import { HttpContext, HttpContextToken } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Per-request toast flags for {@link httpToastInterceptor}.\n *\n * Attach with {@link withToast}. When the token is absent, the interceptor\n * stays quiet — toasting is opt-in per call.\n */\nexport interface ToastHttpOptions {\n /** Show a success toast when the response is OK. Default `true`. */\n success: boolean;\n /** Show an error toast when the request fails. Default `true`. */\n error: boolean;\n /** Override the default success copy. */\n successMessage?: string;\n /** Override the default error copy. */\n errorMessage?: string;\n}\n\n/**\n * Optional bridge from HTTP → toast UI.\n *\n * Provided by `@africanies/africanies-ui` {@link provideAfricaniesToasts}. When missing,\n * {@link httpToastInterceptor} is a no-op even if {@link withToast} is set.\n */\nexport interface AfricaniesHttpToastHandler {\n /** Timed success toast. */\n success(message: string): void;\n /** Persistent error toast (user must dismiss). */\n error(message: string): void;\n}\n\n/** DI token for the HTTP → toast bridge. */\nexport const AFRICANIES_HTTP_TOAST = new InjectionToken<AfricaniesHttpToastHandler>(\n 'AFRICANIES_HTTP_TOAST',\n);\n\n/**\n * Present only when the request was tagged with {@link withToast}.\n * Sentinel `null` means “not tagged”.\n */\nexport const TOAST_HTTP_OPTIONS = new HttpContextToken<ToastHttpOptions | null>(\n () => null,\n);\n\n/**\n * Opt a request into HTTP toasts.\n *\n * Defaults: `success: true`, `error: true`. Pass flags to silence either side.\n *\n * @param options - Partial overrides for the defaults.\n * @returns HttpContext ready to pass as `context` on HttpClient calls.\n *\n * @example\n * ```ts\n * // Success + error toasts\n * this.http.post(url, body, { context: withToast() });\n *\n * // Errors only\n * this.http.post(url, body, { context: withToast({ success: false }) });\n *\n * // Custom copy\n * this.http.post(url, body, {\n * context: withToast({\n * successMessage: 'Shipment saved',\n * errorMessage: 'Could not save shipment',\n * }),\n * });\n * ```\n */\nexport function withToast(\n options?: Partial<ToastHttpOptions>,\n): HttpContext {\n return new HttpContext().set(TOAST_HTTP_OPTIONS, {\n success: options?.success ?? true,\n error: options?.error ?? true,\n successMessage: options?.successMessage,\n errorMessage: options?.errorMessage,\n });\n}\n","import type { HttpContext } from '@angular/common/http';\n\nimport type { AfricaniesSdkHttpToasts } from '../config/africanies-sdk.config';\nimport {\n type ToastHttpOptions,\n withToast,\n} from './toast-http.context';\n\n/**\n *\n */\nexport type HttpToastMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | string;\n\n/**\n * Resolve {@link HttpContext} toast flags for an {@link ApiClient} request.\n *\n * Precedence:\n * 1. Per-request `toast: false` — never tag.\n * 2. GET — silent by default (list/detail failures stay in-page). Opt in with\n * an explicit per-request toast object.\n * 3. Otherwise merge config {@link AfricaniesSdkHttpToasts} with per-request overrides\n * (POST / PUT / PATCH / DELETE toast errors when config is `'errors'`).\n *\n * @param configMode - From {@link AfricaniesSdkConfig.httpToasts} (defaults to `'off'`).\n * @param perRequest - From {@link ApiRequestOptions.toast}.\n * @param method - HTTP verb so GET stays quiet under `'errors'` / `'all'`.\n */\nexport function resolveHttpToastContext(\n configMode: AfricaniesSdkHttpToasts | undefined,\n perRequest: Partial<ToastHttpOptions> | false | undefined,\n method?: HttpToastMethod,\n): HttpContext | undefined {\n if (perRequest === false) {\n return undefined;\n }\n\n const isGet = (method ?? '').toUpperCase() === 'GET';\n if (isGet && perRequest == null) {\n return undefined;\n }\n\n const fromConfig = isGet ? null : configToastDefaults(configMode);\n const merged = perRequest\n ? { ...(fromConfig ?? {}), ...perRequest }\n : fromConfig;\n\n if (!merged) {\n return undefined;\n }\n\n const success = merged.success ?? true;\n const error = merged.error ?? true;\n if (!success && !error) {\n return undefined;\n }\n\n return withToast({\n success,\n error,\n successMessage: merged.successMessage,\n errorMessage: merged.errorMessage,\n });\n}\n\nfunction configToastDefaults(\n mode: AfricaniesSdkHttpToasts | undefined,\n): Partial<ToastHttpOptions> | null {\n if (mode == null || mode === 'off') {\n return null;\n }\n if (mode === 'errors') {\n return { success: false, error: true };\n }\n if (mode === 'all') {\n return { success: true, error: true };\n }\n return mode;\n}\n","import type { HttpContext } from '@angular/common/http';\n\nimport type { AfricaniesSdkHttpToasts } from '../config/africanies-sdk.config';\nimport {\n asShippingMode,\n withShippingMode,\n} from '../shipping/shipping-mode.context';\nimport type { ApiRequestOptions } from './api-client';\nimport { resolveHttpToastContext } from './resolve-http-toast-context';\n\n/**\n * Build {@link HttpContext} for an {@link ApiClient} request.\n *\n * Merges SDK config toasts, per-request toast flags, and optional\n * {@link ApiRequestOptions.shippingMode} override.\n *\n * @param configMode - From {@link AfricaniesSdkConfig.httpToasts}.\n * @param options - Per-request {@link ApiClient} options.\n * @param method\n */\nexport function resolveApiRequestContext(\n configMode: AfricaniesSdkHttpToasts | undefined,\n options: ApiRequestOptions,\n method?: string,\n): HttpContext | undefined {\n let context = resolveHttpToastContext(configMode, options.toast, method);\n const shippingMode = asShippingMode(options.shippingMode);\n if (shippingMode) {\n context = withShippingMode(shippingMode, context);\n }\n return context;\n}\n\n/**\n * Effective shipping mode for one {@link ApiClient} request.\n *\n * @param options - Per-request options (may include {@link ApiRequestOptions.shippingMode}).\n * @param activeMode - Current tab mode from {@link ShippingModeService}.\n */\nexport function resolveRequestShippingMode(\n options: ApiRequestOptions | undefined,\n activeMode: 'stn' | 'sfn',\n): 'stn' | 'sfn' {\n return asShippingMode(options?.shippingMode) ?? activeMode;\n}\n","import {\n DEFAULT_PAGE_SIZE,\n type PaginationQueryParamsModel,\n type ResourceId,\n} from '@africanies/africanies-models';\n\n/**\n * Optional query bag for {@link ResourceId} GETs.\n *\n * `page` / `size` / `order` apply only when `id` is `null` (paginated list).\n * Extra keys are always forwarded (filters, includes, etc.).\n *\n * App Settings list screens commonly send `search`, `from`, and `to` on the\n * paginated read — use this type directly; do not invent per-domain\n * `*ReadParams` aliases for the same bag.\n */\nexport type ResourceQueryParams = PaginationQueryParamsModel &\n Record<string, string | number | boolean | null | undefined>;\n\n/**\n * Build a path for the AFRICANIES list/detail `ResourceId` convention.\n *\n * | `id` | Path |\n * |------|------|\n * | `null` | `{basePath}` — paginated |\n * | `'all'` | `{basePath}/all` — full list |\n * | `number` | `{basePath}/{id}` — single record |\n *\n * @param basePath - Endpoint base (e.g. `/product/read`).\n * @param id - {@link ResourceId}; defaults to `null` (paginated).\n * @returns Absolute-or-relative path segment for {@link ApiClient.get}.\n *\n * @example\n * ```ts\n * buildResourcePath('/product/read') // '/product/read'\n * buildResourcePath('/product/read', 'all') // '/product/read/all'\n * buildResourcePath('/product/read', 42) // '/product/read/42'\n * ```\n */\nexport function buildResourcePath(\n basePath: string,\n id: ResourceId = null,\n): string {\n const trimmed = basePath.replace(/\\/+$/, '');\n return id === null ? trimmed : `${trimmed}/${id}`;\n}\n\n/**\n * Build query params for a {@link ResourceId} request.\n *\n * Pagination fields (`page`, `size`, `order`) are included only when\n * `id === null`. Other keys are always passed through.\n *\n * Paginated lists (`id === null`) always send `size`, defaulting to\n * {@link DEFAULT_PAGE_SIZE} (`15`) when omitted.\n *\n * @param id - Active resource id mode.\n * @param params - Optional pagination + filter bag.\n * @returns Params object for {@link ApiClient}, or `undefined` when empty.\n */\nexport function buildResourceQueryParams(\n id: ResourceId,\n params?: ResourceQueryParams,\n): Record<string, string | number | boolean | null | undefined> | undefined {\n const { page, size, order, ...rest } = params ?? {};\n const out: Record<string, string | number | boolean | null | undefined> = {};\n\n for (const [key, value] of Object.entries(rest)) {\n if (value === null || value === undefined || value === '') {\n continue;\n }\n out[key] = value;\n }\n\n if (id === null) {\n if (page !== undefined) {\n out['page'] = page;\n }\n out['size'] = size ?? DEFAULT_PAGE_SIZE;\n if (order !== undefined) {\n out['order'] = order;\n }\n }\n\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/**\n * In-memory GET cache TTL for reference reads.\n *\n * Paginated lists (`id === null`) are never cached — page contents change.\n * `'all'` and by-id may use a short TTL for stable catalogs.\n *\n * @param id - Active resource id mode.\n * @param ttlMs - Desired TTL for stable reads.\n * @returns TTL to pass to {@link ApiClient}, or `undefined` to skip cache.\n */\nexport function resourceCacheTtlMs(\n id: ResourceId,\n ttlMs: number,\n): number | undefined {\n return id === null ? undefined : ttlMs;\n}\n\n/**\n * Map wire `data` according to {@link ResourceId} shape.\n *\n * - `null` / `'all'` → list mapper → `T[]`\n * - `number` → one mapper → `T` (first element if the wire sent an array)\n *\n * @typeParam T - Domain model type.\n * @param id - Active resource id mode.\n * @param raw - Envelope `data` payload.\n * @param mapOne - Mapper for a single record.\n * @param mapMany - Mapper for a list (or single object coerced to list).\n * @returns Mapped payload, or `null` when by-id data is missing.\n * List reads (`null` / `'all'`) return `[]` when `raw` is nullish.\n */\nexport function mapResourcePayload<T>(\n id: ResourceId,\n raw: unknown,\n mapOne: (raw: unknown) => T,\n mapMany: (raw: unknown) => T[],\n): T | T[] | null {\n if (raw == null) {\n return typeof id === 'number' ? null : [];\n }\n\n if (typeof id === 'number') {\n const item = Array.isArray(raw) ? raw[0] : raw;\n return item == null ? null : mapOne(item);\n }\n\n return mapMany(raw);\n}\n","import {\n HttpClient,\n HttpContext,\n HttpHeaders,\n HttpParams,\n} from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\n\nimport {\n catchError,\n map,\n Observable,\n of,\n tap,\n throwError,\n timeout,\n} from 'rxjs';\n\nimport {\n type ApiResponseModel,\n DEFAULT_PAGE_SIZE,\n type PaginationQueryParamsModel,\n type ResourceId,\n type ShippingMode,\n} from '@africanies/africanies-models';\n\nimport { AFRICANIES_SDK_CONFIG } from '../config/africanies-sdk.config';\nimport { ShippingModeService } from '../shipping/shipping-mode.service';\nimport { formatApiErrorMessage } from './api-error-message';\nimport { HttpResponseCache } from './http-cache';\nimport { normalize } from './normalize';\nimport {\n resolveApiRequestContext,\n resolveRequestShippingMode,\n} from './resolve-api-request-context';\nimport { buildResourcePath } from './resource-path';\nimport type { ToastHttpOptions } from './toast-http.context';\n\n/**\n * Shared request options for {@link ApiClient} verbs.\n *\n * ## In-memory GET caching (`cacheTtlMs`)\n *\n * Optional short-TTL cache for identical GET URLs. See {@link HttpResponseCache}\n * for when **not** to enable it (volatile data, auth-sensitive payloads,\n * post-mutation lists). Prefer TanStack Query for app-level caching.\n */\nexport interface ApiRequestOptions {\n /**\n * `'wrapped'` (default) → {@link ApiResponseModel}; `'raw'` → payload `T`.\n * Both paths still run through {@link normalize} so null-safety is consistent.\n */\n responseMode?: 'wrapped' | 'raw';\n\n /** Extra headers; override {@link AfricaniesSdkConfig.defaultHeaders} on conflict. */\n headers?: Record<string, string>;\n\n /** Query string values; `null` / `undefined` / `''` entries are omitted. */\n params?: Record<string, string | number | boolean | null | undefined>;\n\n /**\n * When set on GET, serve/store the normalized result in the in-memory cache\n * for this many milliseconds. Omit for uncached reads (the common case).\n */\n cacheTtlMs?: number;\n\n /**\n * HTTP toast tagging for this request (via {@link httpToastInterceptor}).\n *\n * - Omitted — use {@link AfricaniesSdkConfig.httpToasts} when set (mutations only;\n * GET stays silent unless you opt in here).\n * - `false` — never toast this call (overrides config). Prefer only for rare\n * cases that fully own error UI; mutations should usually toast.\n * - Partial flags — merge with config defaults (same shape as {@link withToast}).\n */\n toast?: Partial<ToastHttpOptions> | false;\n\n /**\n * Override `x-shipment-mode` for this request only.\n *\n * Does not call {@link ShippingModeService.setMode} — the tab / session mode\n * stays unchanged. {@link getResource} also uses this for the `mode` query\n * param when provided.\n */\n shippingMode?: ShippingMode;\n}\n\ntype ResponseMode = NonNullable<ApiRequestOptions['responseMode']>;\n\n/**\n * Endpoint-agnostic HTTP façade over Angular {@link HttpClient}.\n *\n * Domain services own path strings — this client never hard-codes product\n * routes (except helpers like {@link getResource} that only know conventions).\n *\n * Features:\n * - `responseMode` overloads (`wrapped` | `raw`)\n * - {@link normalize} on every **2xx** body\n * - HTTP failures rethrown as `Error` whose `.message` is already\n * user-facing ({@link formatApiErrorMessage}) — consumers do not need to\n * parse `HttpErrorResponse` bodies\n * - **No automatic retry** — fail fast so UIs can show Select / table /\n * error-state Retry instead of a stuck loading spinner\n * - Optional per-GET TTL cache via `cacheTtlMs`\n *\n * @example\n * ```ts\n * const api = inject(ApiClient);\n * api.get<User>('/users/1').subscribe({\n * next: (res) => {\n * if (res.success) console.log(res.data);\n * else console.error(res.message); // already joined when a validation bag exists\n * },\n * error: (err: Error) => console.error(err.message),\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ApiClient {\n private readonly http = inject(HttpClient);\n private readonly config = inject(AFRICANIES_SDK_CONFIG);\n private readonly shippingMode = inject(ShippingModeService);\n private readonly cache = new HttpResponseCache();\n\n /**\n * GET with wrapped {@link ApiResponseModel} (default).\n *\n * @typeParam T - Payload type inside `data`.\n */\n get<T>(\n path: string,\n options?: ApiRequestOptions & { responseMode?: 'wrapped' },\n ): Observable<ApiResponseModel<T>>;\n\n /**\n * GET returning the bare payload type (after normalize + unwrap).\n *\n * @typeParam T - Unwrapped payload type.\n */\n get<T>(\n path: string,\n options: ApiRequestOptions & { responseMode: 'raw' },\n ): Observable<T>;\n\n get<T>(\n path: string,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T> | T> {\n return this.request<T>('GET', path, undefined, options);\n }\n\n /**\n * POST with wrapped envelope (default).\n *\n * @typeParam T - Payload type inside `data`.\n * @typeParam TBody - JSON body type.\n */\n post<T, TBody = unknown>(\n path: string,\n body: TBody,\n options?: ApiRequestOptions & { responseMode?: 'wrapped' },\n ): Observable<ApiResponseModel<T>>;\n\n /**\n * POST returning bare payload `T`.\n *\n * @typeParam T - Unwrapped payload type.\n * @typeParam TBody - JSON body type.\n */\n post<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions & { responseMode: 'raw' },\n ): Observable<T>;\n\n post<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T> | T> {\n return this.request<T>('POST', path, body, options);\n }\n\n /**\n * PATCH with wrapped envelope (default).\n *\n * @typeParam T - Payload type inside `data`.\n * @typeParam TBody - JSON body type.\n */\n patch<T, TBody = unknown>(\n path: string,\n body: TBody,\n options?: ApiRequestOptions & { responseMode?: 'wrapped' },\n ): Observable<ApiResponseModel<T>>;\n\n /**\n * PATCH returning bare payload `T`.\n *\n * @typeParam T - Unwrapped payload type.\n * @typeParam TBody - JSON body type.\n */\n patch<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions & { responseMode: 'raw' },\n ): Observable<T>;\n\n patch<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T> | T> {\n return this.request<T>('PATCH', path, body, options);\n }\n\n /**\n * PUT with wrapped envelope (default).\n *\n * @typeParam T - Payload type inside `data`.\n * @typeParam TBody - JSON body type.\n */\n put<T, TBody = unknown>(\n path: string,\n body: TBody,\n options?: ApiRequestOptions & { responseMode?: 'wrapped' },\n ): Observable<ApiResponseModel<T>>;\n\n /**\n * PUT returning bare payload `T`.\n *\n * @typeParam T - Unwrapped payload type.\n * @typeParam TBody - JSON body type.\n */\n put<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions & { responseMode: 'raw' },\n ): Observable<T>;\n\n put<T, TBody = unknown>(\n path: string,\n body: TBody,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T> | T> {\n return this.request<T>('PUT', path, body, options);\n }\n\n /**\n * DELETE with wrapped envelope (default).\n *\n * @typeParam T - Payload type inside `data`.\n * @typeParam TBody - Optional JSON body (Laravel deletes that expect `{ id }`).\n */\n delete<T, TBody = unknown>(\n path: string,\n body?: TBody,\n options?: ApiRequestOptions & { responseMode?: 'wrapped' },\n ): Observable<ApiResponseModel<T>>;\n\n /**\n * DELETE returning bare payload `T`.\n *\n * @typeParam T - Unwrapped payload type.\n * @typeParam TBody - Optional JSON body.\n */\n delete<T, TBody = unknown>(\n path: string,\n body: TBody | undefined,\n options: ApiRequestOptions & { responseMode: 'raw' },\n ): Observable<T>;\n\n delete<T, TBody = unknown>(\n path: string,\n body?: TBody,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T> | T> {\n return this.request<T>('DELETE', path, body, options);\n }\n\n /**\n * List/detail GET using the AFRICANIES {@link ResourceId} convention.\n *\n * Prefer the named helpers when exploring the API in the IDE:\n * - {@link getResourcePage} — `id: null` (paginated)\n * - {@link getResourceAll} — `id: 'all'`\n * - {@link getResourceById} — numeric id\n *\n * Always attaches `mode` from the active tab or {@link ApiRequestOptions.shippingMode}\n * (in addition to the `x-shipment-mode` header from {@link shipmentModeInterceptor}).\n *\n * @typeParam T - Element type for lists, or record type for by-id.\n *\n * @example\n * ```ts\n * api.getResource<Shipment>('shipments', null, { page: 1, size: 15 })\n * .subscribe((res) => console.log(res.data, res.pagination));\n * ```\n */\n getResource<T>(\n basePath: string,\n id: null,\n query?: PaginationQueryParamsModel,\n options?: ApiRequestOptions,\n ): Observable<ApiResponseModel<T[]>>;\n\n /**\n * Full unpaginated list: `GET {basePath}/all` (pagination query ignored).\n *\n * @typeParam T - Element type of the list.\n */\n getResource<T>(\n basePath: string,\n id: 'all',\n query?: PaginationQueryParamsModel,\n options?: ApiRequestOptions,\n ): Observable<ApiResponseModel<T[]>>;\n\n /**\n * Single record: `GET {basePath}/{id}` (pagination query ignored).\n *\n * @typeParam T - Record type.\n */\n getResource<T>(\n basePath: string,\n id: number,\n query?: PaginationQueryParamsModel,\n options?: ApiRequestOptions,\n ): Observable<ApiResponseModel<T>>;\n\n getResource<T>(\n basePath: string,\n id: ResourceId,\n query?: PaginationQueryParamsModel,\n options: ApiRequestOptions = {},\n ): Observable<ApiResponseModel<T | T[]>> {\n const path = buildResourcePath(basePath, id);\n\n const params: Record<string, string | number | boolean | null | undefined> =\n {\n mode: resolveRequestShippingMode(options, this.shippingMode.mode()),\n ...(options.params ?? {}),\n };\n\n // Pagination applies only to the paginated-list shape (id === null).\n // Size always ships — SDK default is 15 unless the caller overrides.\n if (id === null) {\n if (query?.page !== undefined) {\n params['page'] = query.page;\n }\n params['size'] = query?.size ?? DEFAULT_PAGE_SIZE;\n if (query?.order !== undefined) {\n params['order'] = query.order;\n }\n }\n\n const { responseMode: _ignored, ...requestOptions } = options;\n return this.get<T | T[]>(path, { ...requestOptions, params });\n }\n\n /**\n * Paginated list — {@link ResourceId} `null`.\n * IDE-friendly alias for `getResource(basePath, null, query)`.\n *\n * Page size defaults to {@link DEFAULT_PAGE_SIZE} (`15`) unless\n * `query.size` is set. Bind `res.pagination` to `africanies-pagination`.\n *\n * @typeParam T - Element type of the list.\n * @param basePath - Resource base path (no trailing id segment).\n * @param query - Optional page/size/order.\n */\n getResourcePage<T>(\n basePath: string,\n query?: PaginationQueryParamsModel,\n ): Observable<ApiResponseModel<T[]>> {\n return this.getResource<T>(basePath, null, query);\n }\n\n /**\n * Full unpaginated dump — {@link ResourceId} `'all'`.\n * IDE-friendly alias for `getResource(basePath, 'all')`.\n *\n * @typeParam T - Element type of the list.\n * @param basePath - Resource base path.\n */\n getResourceAll<T>(basePath: string): Observable<ApiResponseModel<T[]>> {\n return this.getResource<T>(basePath, 'all');\n }\n\n /**\n * Single record — {@link ResourceId} number.\n * IDE-friendly alias for `getResource(basePath, id)`.\n *\n * @typeParam T - Record type.\n * @param basePath - Resource base path.\n * @param id - Numeric primary key.\n */\n getResourceById<T>(\n basePath: string,\n id: number,\n ): Observable<ApiResponseModel<T>> {\n return this.getResource<T>(basePath, id);\n }\n\n /**\n * Clears the in-memory GET cache (e.g. on logout).\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n private buildHttpContext(\n options: ApiRequestOptions,\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n ): HttpContext | undefined {\n return resolveApiRequestContext(this.config.httpToasts, options, method);\n }\n\n private request<T>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n path: string,\n body: unknown,\n options: ApiRequestOptions,\n ): Observable<ApiResponseModel<T> | T> {\n const responseMode: ResponseMode = options.responseMode ?? 'wrapped';\n const url = this.resolveUrl(path);\n const hasBody =\n method === 'POST' ||\n method === 'PUT' ||\n method === 'PATCH' ||\n (method === 'DELETE' && body !== undefined && body !== null);\n const isFormData =\n typeof FormData !== 'undefined' && body instanceof FormData;\n // FormData must not send application/json — the browser sets multipart + boundary.\n let headers = this.buildHeaders(options.headers, hasBody && !isFormData);\n if (isFormData && headers.has('Content-Type')) {\n headers = headers.delete('Content-Type');\n }\n const params = this.buildParams(options.params);\n const context = this.buildHttpContext(options, method);\n const cacheKey =\n method === 'GET' && options.cacheTtlMs != null\n ? `${method} ${url}?${params.toString()}`\n : null;\n\n if (cacheKey) {\n const hit = this.cache.get<ApiResponseModel<T>>(cacheKey);\n if (hit !== null) {\n return of(this.unwrap(hit, responseMode));\n }\n }\n\n let req$: Observable<unknown>;\n const httpOpts = context ? { headers, params, context } : { headers, params };\n switch (method) {\n case 'GET':\n req$ = this.http.get(url, httpOpts);\n break;\n case 'POST':\n req$ = this.http.post(url, body, httpOpts);\n break;\n case 'PUT':\n req$ = this.http.put(url, body, httpOpts);\n break;\n case 'PATCH':\n req$ = this.http.patch(url, body, httpOpts);\n break;\n case 'DELETE':\n req$ = this.http.delete(\n url,\n hasBody ? { ...httpOpts, body } : httpOpts,\n );\n break;\n }\n\n // No automatic GET retry — admin shells own Retry via UI\n // (`africanies-select` showRetry, table error→refreshClick, error-state).\n\n if (this.config.timeout != null) {\n req$ = req$.pipe(\n timeout({\n each: this.config.timeout,\n with: () =>\n throwError(\n () =>\n new Error(\n `AFRICANIES API request timed out after ${this.config.timeout}ms: ${method} ${url}`,\n ),\n ),\n }),\n );\n }\n\n return req$.pipe(\n map((raw) => normalize<T>(raw)),\n tap((envelope) => {\n if (cacheKey && options.cacheTtlMs != null) {\n this.cache.set(cacheKey, envelope, options.cacheTtlMs);\n }\n }),\n map((envelope) => this.unwrap(envelope, responseMode)),\n catchError((err: unknown) =>\n throwError(() => new Error(formatApiErrorMessage(err))),\n ),\n );\n }\n\n private unwrap<T>(\n envelope: ApiResponseModel<T>,\n responseMode: ResponseMode,\n ): ApiResponseModel<T> | T {\n if (responseMode === 'raw') {\n // Callers opting into raw want the payload; null stays null-compatible via cast.\n return envelope.data as T;\n }\n return envelope;\n }\n\n private resolveUrl(path: string): string {\n if (/^https?:\\/\\//i.test(path)) {\n return path;\n }\n const base = this.config.baseUrl.replace(/\\/+$/, '');\n const suffix = path.startsWith('/') ? path : `/${path}`;\n return `${base}${suffix}`;\n }\n\n private buildHeaders(\n extra?: Record<string, string>,\n withJsonContentType = false,\n ): HttpHeaders {\n let headers = new HttpHeaders({\n Accept: 'application/json',\n ...(this.config.defaultHeaders ?? {}),\n ...(extra ?? {}),\n });\n // Only set JSON content-type when sending a body; avoid spurious GET headers.\n if (withJsonContentType && !headers.has('Content-Type')) {\n headers = headers.set('Content-Type', 'application/json');\n }\n return headers;\n }\n\n private buildParams(\n params?: Record<string, string | number | boolean | null | undefined>,\n ): HttpParams {\n let httpParams = new HttpParams();\n if (!params) {\n return httpParams;\n }\n for (const [key, value] of Object.entries(params)) {\n if (value === null || value === undefined || value === '') {\n continue;\n }\n httpParams = httpParams.set(key, String(value));\n }\n return httpParams;\n }\n}\n","import type {\n ModeConfigDataModel,\n ModeCurrencyCode,\n ModeDimensionUnit,\n ModeMassUnit,\n ModeRegionConfigModel,\n ModeSfnConfigModel,\n ModeStnConfigModel,\n ShippingMode,\n} from '@africanies/africanies-models';\n\nimport { asRecord, asString } from '../http/wire';\n\n/** Public mode-config endpoint path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const MODE_CONFIG_PATH = '/public/mode/config';\n\n/** Fallback region when the wire omits a required branch/key. */\nconst DEFAULT_REGION: ModeRegionConfigModel = {\n dimension_unit: 'cm',\n mass_unit: 'KG',\n currency: 'NGN',\n currency_symbol: '',\n};\n\nfunction asDimensionUnit(value: unknown): ModeDimensionUnit {\n return value === 'inches' ? 'inches' : 'cm';\n}\n\nfunction asMassUnit(value: unknown): ModeMassUnit {\n return value === 'LBS' ? 'LBS' : 'KG';\n}\n\nfunction asCurrency(value: unknown): ModeCurrencyCode {\n return value === 'USD' ? 'USD' : 'NGN';\n}\n\n/**\n * Map a region object into {@link ModeRegionConfigModel} (snake_case).\n * @param raw\n */\nexport function mapRegionConfig(raw: unknown): ModeRegionConfigModel {\n const record = asRecord(raw) ?? {};\n return {\n dimension_unit: asDimensionUnit(\n record['dimension_unit'] ?? record['dimensionUnit'],\n ),\n mass_unit: asMassUnit(record['mass_unit'] ?? record['massUnit']),\n currency: asCurrency(record['currency']),\n currency_symbol: asString(\n record['currency_symbol'] ?? record['currencySymbol'],\n ),\n };\n}\n\n/**\n * Map every region entry under a mode branch (`default`, `ng`, `us`, …).\n * @param modeRaw\n */\nexport function mapModeRegions(\n modeRaw: unknown,\n): Record<string, ModeRegionConfigModel> {\n const mode = asRecord(modeRaw) ?? {};\n const out: Record<string, ModeRegionConfigModel> = {};\n for (const [key, value] of Object.entries(mode)) {\n out[key] = mapRegionConfig(value);\n }\n return out;\n}\n\nfunction regionOrDefault(\n regions: Record<string, ModeRegionConfigModel>,\n key: string,\n): ModeRegionConfigModel {\n return regions[key] ?? regions['default'] ?? { ...DEFAULT_REGION };\n}\n\n/**\n * Deep-map mode config preserving snake_case region fields.\n * @param raw\n */\nexport function mapModeConfigData(\n raw: ModeConfigDataModel | Record<string, unknown>,\n): ModeConfigDataModel {\n const record = asRecord(raw) ?? {};\n const sfnRegions = mapModeRegions(record['sfn']);\n const stnRegions = mapModeRegions(record['stn']);\n\n const sfn: ModeSfnConfigModel = {\n default: regionOrDefault(sfnRegions, 'default'),\n ng: regionOrDefault(sfnRegions, 'ng'),\n };\n\n const stn: ModeStnConfigModel = {\n default: regionOrDefault(stnRegions, 'default'),\n us: regionOrDefault(stnRegions, 'us'),\n cn: regionOrDefault(stnRegions, 'cn'),\n gb: regionOrDefault(stnRegions, 'gb'),\n };\n\n return { sfn, stn };\n}\n\n/**\n * Minimal runtime guard for hydrated storage payloads.\n * @param value\n */\nexport function isModeConfigData(value: unknown): value is ModeConfigDataModel {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n const record = value as Record<string, unknown>;\n const sfn = record['sfn'];\n const stn = record['stn'];\n if (sfn === null || typeof sfn !== 'object' || Array.isArray(sfn)) {\n return false;\n }\n if (stn === null || typeof stn !== 'object' || Array.isArray(stn)) {\n return false;\n }\n const sfnRecord = sfn as Record<string, unknown>;\n const stnRecord = stn as Record<string, unknown>;\n return (\n sfnRecord['default'] != null &&\n typeof sfnRecord['default'] === 'object' &&\n stnRecord['default'] != null &&\n typeof stnRecord['default'] === 'object'\n );\n}\n\n/**\n * Resolve currency and measurement units for a country within a shipping mode.\n * @param config\n * @param mode\n * @param countryCode\n */\nexport function resolveModeRegionConfig(\n config: ModeConfigDataModel | null | undefined,\n mode: ShippingMode,\n countryCode: string | null | undefined,\n): ModeRegionConfigModel {\n const regions = mode === 'sfn' ? config?.sfn : config?.stn;\n const keyed = (regions ?? {}) as unknown as Record<\n string,\n ModeRegionConfigModel | undefined\n >;\n\n if (countryCode != null && countryCode !== '') {\n const key = asString(countryCode).toLowerCase();\n if (key !== 'default') {\n const region = keyed[key];\n if (region != null) {\n return region;\n }\n }\n }\n\n return keyed['default'] ?? { ...DEFAULT_REGION };\n}\n","import { inject, Injectable, type Signal, signal } from '@angular/core';\n\nimport { finalize, Observable, tap } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ModeAppType,\n ModeConfigDataModel,\n ModeRegionConfigModel,\n} from '@africanies/africanies-models';\nimport { AFRICANIES_MODE_CONFIG_KEY, STORAGE_TOKEN } from '@africanies/africanies-storage';\n\nimport { ApiClient } from '../http/api-client';\nimport { ShippingModeService } from '../shipping/shipping-mode.service';\nimport {\n isModeConfigData,\n mapModeConfigData,\n MODE_CONFIG_PATH,\n resolveModeRegionConfig,\n} from './mode-config.mapper';\n\n/**\n * Source of truth for region currency and measurement units (STN / SFN).\n *\n * On startup (via {@link provideModeConfig}), loads\n * `GET /public/mode/config`, normalizes snake_case wire fields once, and\n * persists the mapped record to storage. {@link getRegionConfig} reads that\n * saved record and resolves by country code + active shipping mode.\n *\n * @example\n * ```ts\n * // app.config.ts\n * providers: [\n * provideAfricaniesSdk({ baseUrl: 'https://test-api-export.africaniestest.com/api' }),\n * provideHttpClient(withInterceptors([shipmentModeInterceptor])),\n * provideModeConfig(),\n * ];\n *\n * // feature — format for shipment origin country\n * const modeConfig = inject(ModeConfigService);\n * const region = modeConfig.getRegionConfig('us');\n * if (region) {\n * console.log(region.currency_symbol, region.mass_unit);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ModeConfigService {\n private readonly api = inject(ApiClient);\n private readonly storage = inject(STORAGE_TOKEN);\n private readonly shippingMode = inject(ShippingModeService);\n\n private readonly _config = signal<ModeConfigDataModel | null>(null);\n private readonly _loading = signal(false);\n\n /** Latest mode-config record (storage hydrate or last successful fetch). */\n readonly config: Signal<ModeConfigDataModel | null> = this._config.asReadonly();\n\n /** `true` while {@link loadConfig} is in flight. */\n readonly loading: Signal<boolean> = this._loading.asReadonly();\n\n constructor() {\n this.hydrateFromStorage();\n }\n\n /**\n * Fetches mode config from the server, updates {@link config}, and persists.\n *\n * @returns Normalized API envelope; errors propagate to subscribers.\n */\n loadConfig(): Observable<ApiResponseModel<ModeConfigDataModel>> {\n this._loading.set(true);\n return this.api.get<ModeConfigDataModel>(MODE_CONFIG_PATH).pipe(\n tap((res) => {\n if (res.success && res.data !== null) {\n this.saveRecord(mapModeConfigData(res.data));\n }\n }),\n finalize(() => {\n this._loading.set(false);\n }),\n );\n }\n\n /**\n * Region units and currency for a country code under the active (or given) mode.\n *\n * @param countryCode - e.g. `'ng'`, `'us'`, `'cn'` — unknown keys use `default`.\n * @param appType - Defaults to {@link ShippingModeService.mode}.\n * @returns Resolved region, or `null` before the first load/hydrate.\n */\n getRegionConfig(\n countryCode: string | null | undefined,\n appType?: ModeAppType,\n ): ModeRegionConfigModel | null {\n const config = this._config();\n if (config === null) {\n return null;\n }\n\n const mode = appType ?? this.shippingMode.mode();\n return resolveModeRegionConfig(config, mode, countryCode);\n }\n\n /**\n * Replace the in-memory record and persist — used after {@link loadConfig}.\n * @param config\n */\n private saveRecord(config: ModeConfigDataModel): void {\n this._config.set(config);\n this.storage.set(AFRICANIES_MODE_CONFIG_KEY, config);\n }\n\n /** Restore the last saved server record so region lookups work offline. */\n private hydrateFromStorage(): void {\n const stored = this.storage.get<ModeConfigDataModel>(AFRICANIES_MODE_CONFIG_KEY);\n if (isModeConfigData(stored)) {\n this._config.set(stored);\n }\n }\n}\n","import {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideAppInitializer,\n} from '@angular/core';\n\nimport { catchError, firstValueFrom, of } from 'rxjs';\n\nimport { ModeConfigService } from './mode-config.service';\n\n/**\n * Fetches `/public/mode/config` on app startup and hydrates {@link ModeConfigService}.\n *\n * Failures do not block bootstrap — cached storage (if any) remains usable.\n * Pair with {@link provideAfricaniesSdk} and a real {@link AfricaniesSdkConfig.baseUrl}.\n *\n * @returns Environment providers that run the mode-config initializer.\n */\nexport function provideModeConfig(): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideAppInitializer(() => {\n const modeConfig = inject(ModeConfigService);\n return firstValueFrom(\n modeConfig.loadConfig().pipe(catchError(() => of(null))),\n );\n }),\n ]);\n}\n","import {\n type EnvironmentProviders,\n makeEnvironmentProviders,\n} from '@angular/core';\n\nimport { provideLocalStorage } from '@africanies/africanies-storage';\n\nimport { provideModeConfig } from '../mode/provide-mode-config';\nimport { AFRICANIES_SDK_CONFIG, type AfricaniesSdkConfig } from './africanies-sdk.config';\n\n/**\n * Registers SDK configuration and ensures browser storage is available.\n *\n * Also calls {@link provideLocalStorage} so theme / mode-config / auth-token\n * persistence works out of the box. {@link ShippingModeService} always uses\n * {@link SessionStorageService} so each tab can hold its own STN/SFN mode.\n * When {@link AfricaniesSdkConfig.loadModeConfig} is not `false`, {@link provideModeConfig}\n * runs on startup.\n *\n * @param config - API origin and optional timeout / default headers.\n * @returns Environment providers for `app.config.ts`.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { ApplicationConfig } from '@angular/core';\n * import {\n * provideAfricaniesSdk,\n * provideAfricaniesHttpClient,\n * } from '@africanies/africanies-core';\n * import { provideSessionStorage } from '@africanies/africanies-storage';\n *\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * provideAfricaniesSdk({\n * baseUrl: import.meta.env['NG_APP_API_URL'],\n * timeout: 30_000,\n * }),\n * // Optional: override the localStorage default registered above\n * // provideSessionStorage(),\n * provideAfricaniesHttpClient(),\n * // Or with app interceptors:\n * // provideAfricaniesHttpClient({ interceptors: [loggingInterceptor] }),\n * ],\n * };\n * ```\n */\nexport function provideAfricaniesSdk(config: AfricaniesSdkConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: AFRICANIES_SDK_CONFIG, useValue: config },\n provideLocalStorage(),\n ...(config.loadModeConfig !== false ? [provideModeConfig()] : []),\n ]);\n}\n","/** Forgot-password path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const AUTH_FORGOT_PASSWORD_PATH = '/auth/forgot/password';\n","import { inject, Injectable } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ForgotPasswordRequestModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport { asString } from '../http/wire';\nimport { AUTH_FORGOT_PASSWORD_PATH } from './auth.paths';\n\n/**\n * Unauthenticated auth endpoints (`POST /auth/…`).\n *\n * **Forgot password is email-only.** `forgot()` POSTs `{ email }`; the\n * backend emails a reset link. This product UI never collects a new password\n * for that link (no token in the route, `/onboarding/reset-password` is\n * **not** that flow).\n *\n * `/onboarding/reset-password` is first login with a default password: after\n * login, if `user.default_password` is set, the host sends the user there to\n * change current → new via {@link UserService.changePassword}.\n *\n * Token persistence stays on {@link AuthTokenService}. These calls do not\n * require a bearer token — the interceptor omits `Authorization` when none\n * is stored. Admin user/partner screens reuse {@link forgot} with that\n * user’s email.\n *\n * @example\n * ```ts\n * const authApi = inject(AuthService);\n *\n * authApi.forgot('user@example.com').subscribe((res) => {\n * if (res.success) {\n * // Show res.message, then “Reset completed? Login here”.\n * }\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private readonly api = inject(ApiClient);\n\n /**\n * Request a password-reset email (`POST /auth/forgot/password`).\n *\n * Enable submit only when the address looks valid. Wire `data` is an empty\n * array on success — use {@link ApiResponseModel.message} for the banner.\n *\n * @param email - Registered account email.\n * @returns Normalized envelope (`data` is typically `[]`).\n */\n forgot(email: string): Observable<ApiResponseModel<unknown[]>> {\n return this.api.post<unknown[], ForgotPasswordRequestModel>(\n AUTH_FORGOT_PASSWORD_PATH,\n { email: asString(email).trim() },\n );\n }\n}\n","import { inject, Injectable, type Signal, signal } from '@angular/core';\n\nimport { AFRICANIES_ACCESS_TOKEN_KEY, STORAGE_TOKEN } from '@africanies/africanies-storage';\n\nimport { ApiClient } from '../http/api-client';\nimport { asString } from '../http/wire';\n\n/**\n * Holds the bearer access token used by {@link authInterceptor}.\n *\n * After login/register in the host app, call {@link set}. The SDK persists the\n * token via {@link STORAGE_TOKEN} and attaches `Authorization: Bearer …` on\n * outbound HTTP. On logout, call {@link UserService.logoutFromAllSessions}\n * while the token is still set, then {@link clear} (also clears the GET cache).\n *\n * @example\n * ```ts\n * const auth = inject(AuthTokenService);\n * const users = inject(UserService);\n *\n * // after login\n * auth.set(res.access_token);\n *\n * // later — UserService.me() is authenticated automatically\n * // on logout — POST while the token is still set, then drop it\n * users.logoutFromAllSessions().subscribe({\n * next: () => auth.clear(),\n * error: () => auth.clear(),\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthTokenService {\n private readonly storage = inject(STORAGE_TOKEN);\n private readonly api = inject(ApiClient);\n\n private readonly _token = signal<string | null>(this.readInitialToken());\n\n /** Read-only view of the current access token. */\n readonly token: Signal<string | null> = this._token.asReadonly();\n\n /**\n * Current access token, or `null` when logged out / unset.\n */\n get(): string | null {\n return this._token();\n }\n\n /**\n * Persist and activate an access token from login/register.\n *\n * @param accessToken - Bearer token string (whitespace-only is treated as clear).\n */\n set(accessToken: string): void {\n const trimmed = asString(accessToken).trim();\n if (trimmed === '') {\n this.clear();\n return;\n }\n this._token.set(trimmed);\n this.storage.set<string>(AFRICANIES_ACCESS_TOKEN_KEY, trimmed);\n }\n\n /**\n * Remove the token from memory and storage, and clear the HTTP GET cache.\n */\n clear(): void {\n this._token.set(null);\n this.storage.remove(AFRICANIES_ACCESS_TOKEN_KEY);\n this.api.clearCache();\n }\n\n private readInitialToken(): string | null {\n const stored = this.storage.get<string>(AFRICANIES_ACCESS_TOKEN_KEY);\n if (typeof stored !== 'string') {\n return null;\n }\n const trimmed = stored.trim();\n return trimmed === '' ? null : trimmed;\n }\n}\n","import { asString } from '../http/wire';\n\n/**\n * Enable forgot-password submit when the address looks like an email.\n *\n * Intentionally loose (`local@host.tld`) — the API owns uniqueness and\n * deliverability. Empty / whitespace-only values fail.\n *\n * @param value - Raw field value.\n * @returns Whether submit should be enabled.\n */\nexport function isValidEmail(value: unknown): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(asString(value).trim());\n}\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { SHIPPING_MODE_OVERRIDE } from './shipping-mode.context';\nimport { ShippingModeService } from './shipping-mode.service';\n\n/**\n * Attaches the current shipping mode as an `x-shipment-mode` header.\n *\n * Uses {@link SHIPPING_MODE_OVERRIDE} when the request was tagged (via\n * {@link ApiRequestOptions.shippingMode} or {@link withShippingMode});\n * otherwise {@link ShippingModeService.mode}. The tab mode is never mutated.\n *\n * Some backends also expect `mode` as a query param (see {@link ApiClient.getResource});\n * this interceptor covers the header half so domain calls stay consistent\n * without each service remembering the header name.\n *\n * Prefer {@link provideAfricaniesHttpClient}, which registers this interceptor by\n * default. {@link ShippingModeService} is `providedIn: 'root'` and needs no\n * extra provider.\n *\n * @param req - Outgoing request.\n * @param next - Next handler in the interceptor chain.\n * @returns The downstream observable for the cloned request.\n * @example\n * ```ts\n * provideAfricaniesSdk({ baseUrl: 'https://api.example.com' }),\n * provideAfricaniesHttpClient(),\n *\n * api.post('/claim', body, { shippingMode: 'stn' });\n * ```\n */\nexport const shipmentModeInterceptor: HttpInterceptorFn = (req, next) => {\n const override = req.context.get(SHIPPING_MODE_OVERRIDE);\n const mode = override ?? inject(ShippingModeService).mode();\n return next(\n req.clone({\n setHeaders: { 'x-shipment-mode': mode },\n }),\n );\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { AuthTokenService } from '../auth/auth-token.service';\n\n/**\n * Functional interceptor that sets `Authorization: Bearer <token>` when\n * {@link AuthTokenService} has an access token (from {@link AuthTokenService.set}).\n *\n * Compose via {@link provideAfricaniesHttpClient} (preferred) or pass explicitly to\n * `provideHttpClient(withInterceptors([...]))`.\n * @param req\n * @param next\n */\nexport const authInterceptor: HttpInterceptorFn = (req, next) => {\n const token = inject(AuthTokenService).get();\n if (token === null || token === '') {\n return next(req);\n }\n return next(\n req.clone({\n setHeaders: { Authorization: `Bearer ${token}` },\n }),\n );\n};\n","import { type HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\n\nimport { catchError, tap, throwError } from 'rxjs';\n\nimport { formatApiErrorMessage } from './api-error-message';\nimport {\n AFRICANIES_HTTP_TOAST,\n TOAST_HTTP_OPTIONS,\n} from './toast-http.context';\n\n/**\n * Shows success / error toasts for requests tagged with {@link withToast}.\n *\n * Requires {@link AFRICANIES_HTTP_TOAST} (from `provideAfricaniesToasts` in `@africanies/africanies-ui`).\n * Untagged requests never toast. Missing handler → silent no-op.\n * @param req - Outgoing HTTP request.\n * @param next - Next interceptor handler.\n * @returns Observable for the HTTP response stream.\n */\nexport const httpToastInterceptor: HttpInterceptorFn = (req, next) => {\n const options = req.context.get(TOAST_HTTP_OPTIONS);\n if (!options) {\n return next(req);\n }\n\n const toast = inject(AFRICANIES_HTTP_TOAST, { optional: true });\n if (!toast) {\n return next(req);\n }\n\n return next(req).pipe(\n tap(() => {\n if (options.success) {\n toast.success(options.successMessage ?? 'Done');\n }\n }),\n catchError((err: unknown) => {\n if (options.error) {\n toast.error(options.errorMessage ?? defaultHttpErrorMessage(err));\n }\n return throwError(() => err);\n }),\n );\n};\n\n/**\n * @param err - Failure from HttpClient.\n * @returns User-facing copy (joined field errors when the body is a validation bag).\n */\nfunction defaultHttpErrorMessage(err: unknown): string {\n return formatApiErrorMessage(err);\n}\n","import type { ApiJsonObjectModel, ApiJsonValue } from '@africanies/africanies-models';\n\nimport { asArray, asRecord } from './wire';\n\n/**\n * Deep-map arbitrary JSON into {@link ApiJsonValue} with no `undefined`.\n *\n * - `undefined` / unsupported types → `null`\n * - Arrays → every element mapped (never sparse/`undefined` slots)\n * - Objects → every own key mapped to {@link ApiJsonValue}\n *\n * @param raw - Wire value (may be missing or malformed).\n * @returns Null-safe JSON tree, or `null` when `raw` is nullish/unusable.\n */\nexport function mapApiJsonValue(raw: unknown): ApiJsonValue | null {\n if (raw === null || raw === undefined) {\n return null;\n }\n if (typeof raw === 'string' || typeof raw === 'boolean') {\n return raw;\n }\n if (typeof raw === 'number') {\n return Number.isFinite(raw) ? raw : null;\n }\n if (Array.isArray(raw)) {\n return raw.map((entry) => mapApiJsonValue(entry) ?? null);\n }\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n const out: Record<string, ApiJsonValue> = {};\n for (const [key, value] of Object.entries(record)) {\n out[key] = mapApiJsonValue(value) ?? null;\n }\n return out as ApiJsonObjectModel;\n}\n\n/**\n * Map a wire list into a null-safe {@link ApiJsonValue} array.\n * Non-arrays become `[]`.\n * @param raw - Candidate list.\n * @returns Mapped array (never null/undefined).\n */\nexport function mapApiJsonList(raw: unknown): ApiJsonValue[] {\n return asArray(raw).map((entry) => mapApiJsonValue(entry) ?? null);\n}\n","import {\n type HttpFeature,\n type HttpFeatureKind,\n type HttpInterceptorFn,\n provideHttpClient,\n withInterceptors,\n} from '@angular/common/http';\nimport { type EnvironmentProviders } from '@angular/core';\n\nimport { shipmentModeInterceptor } from '../shipping/shipment-mode.interceptor';\nimport { authInterceptor } from './auth.interceptor';\nimport { httpToastInterceptor } from './http-toast.interceptor';\n\n/**\n * Options for {@link provideAfricaniesHttpClient}.\n */\nexport interface AfricaniesHttpClientOptions {\n /**\n * Extra interceptors appended **after** the SDK defaults\n * (`shipmentModeInterceptor`, `authInterceptor`, `httpToastInterceptor`).\n */\n interceptors?: HttpInterceptorFn[];\n}\n\n/**\n * Registers `HttpClient` with AFRICANIES default interceptors baked in.\n *\n * Defaults (in order):\n * 1. {@link shipmentModeInterceptor} — `x-shipment-mode`\n * 2. {@link authInterceptor} — `Authorization` when {@link AuthTokenService} has a token\n * 3. {@link httpToastInterceptor} — toasts for requests tagged with {@link withToast}\n * (no-op until `provideAfricaniesToasts()` registers {@link AFRICANIES_HTTP_TOAST})\n * 4. Any {@link AfricaniesHttpClientOptions.interceptors} from the host\n *\n * @param options - Optional extra interceptors.\n * @param features - Extra `provideHttpClient` features (`withFetch`, etc.).\n * @returns Environment providers for `app.config.ts`.\n *\n * @example\n * ```ts\n * provideAfricaniesSdk({ baseUrl: 'https://api.example.com' }),\n * provideAfricaniesHttpClient(),\n * provideAfricaniesToasts(), // from @africanies/africanies-ui — enables HTTP toasts\n * ```\n */\nexport function provideAfricaniesHttpClient(\n options?: AfricaniesHttpClientOptions,\n ...features: HttpFeature<HttpFeatureKind>[]\n): EnvironmentProviders {\n const extras = options?.interceptors ?? [];\n return provideHttpClient(\n withInterceptors([\n shipmentModeInterceptor,\n authInterceptor,\n httpToastInterceptor,\n ...extras,\n ]),\n ...features,\n );\n}\n","/**\n * Why a list screen is fetching.\n *\n * - `initial` — first paint (no rows yet).\n * - `focus` — tab/window became visible again.\n * - `refresh` — toolbar Refresh.\n * - `page` — pager page or size change.\n * - `mode` — {@link ShippingModeService} switched STN ↔ SFN.\n */\nexport type ListFetchReason =\n | 'initial'\n | 'focus'\n | 'refresh'\n | 'page'\n | 'mode';\n\n/**\n * How to bind the list table while that fetch is in flight.\n *\n * - `loading` — body spinner. Use when there is no data, or the shipping\n * mode changed (previous rows belong to the other mode — drop them).\n * - `pagination` — keep rows; pager spinner.\n * - `refreshing` — keep rows; refresh icon spins (focus / Refresh).\n */\nexport type ListFetchKind = 'loading' | 'pagination' | 'refreshing';\n\n/**\n * Pick blocking vs keep-rows fetch for a list table.\n *\n * Body loading only when there is no initial data or the shipping mode\n * switched. Page/size keeps rows. Tab focus and Refresh keep rows.\n *\n * @param options\n * @param options.hasData - Rows from the *current* mode are already on screen.\n * @param options.reason - What triggered this fetch.\n * @returns Kind to map onto `loading` / `pageLoading` / `refreshing`.\n *\n * @example\n * ```ts\n * const kind = listFetchKind({\n * hasData: this.rows().length > 0,\n * reason: 'mode',\n * });\n * this.isLoading.set(kind === 'loading');\n * if (kind === 'loading') {\n * this.rows.set([]);\n * }\n * ```\n */\nexport function listFetchKind(options: {\n hasData: boolean;\n reason: ListFetchReason;\n}): ListFetchKind {\n if (!options.hasData || options.reason === 'mode') {\n return 'loading';\n }\n if (options.reason === 'page') {\n return 'pagination';\n }\n return 'refreshing';\n}\n","/**\n * Shared TanStack Query defaults for AFRICANIES consuming apps.\n *\n * `@tanstack/angular-query-experimental` is **not** a dependency of this SDK —\n * query cache lifetime is app state. These helpers return a plain\n * `defaultOptions` object you pass into your own `QueryClient`.\n *\n * Pin an **exact** `@tanstack/angular-query-experimental` version in the app\n * (no caret/tilde): TanStack marks the Angular adapter experimental and\n * breaking changes land without major bumps.\n *\n * Query retries default to **0** to match {@link ApiClient} (fail fast;\n * screens use manual Retry). Apps can override per `QueryClient` if needed.\n */\n\n/**\n * Shape compatible with TanStack `QueryClient` `defaultOptions` without\n * importing `@tanstack/*` into the SDK.\n */\nexport interface AfricaniesQueryClientDefaults {\n queries: {\n /** Time before a successful query is considered stale (ms). */\n staleTime: number;\n /** Unused-query garbage-collection time (ms). */\n gcTime: number;\n /** Max failed-fetch retries for queries (default 0 — fail fast). */\n retry: number;\n /** Delay between retries when {@link AfricaniesQueryClientDefaults.queries.retry} > 0. */\n retryDelay: (attemptIndex: number) => number;\n };\n mutations: {\n /** Mutations are not retried by default — side effects must stay explicit. */\n retry: number;\n };\n}\n\n/**\n * Factory for TanStack `QueryClient` `defaultOptions`.\n *\n * @returns Plain defaults object — no Angular providers, no TanStack imports.\n *\n * @example\n * ```ts\n * // app.config.ts — pin exact experimental version in package.json\n * import {\n * provideAngularQuery,\n * QueryClient,\n * } from '@tanstack/angular-query-experimental';\n * import { createAfricaniesQueryClientDefaults } from '@africanies/africanies-core';\n *\n * const queryClient = new QueryClient({\n * defaultOptions: createAfricaniesQueryClientDefaults(),\n * });\n *\n * export const appConfig = {\n * providers: [provideAngularQuery(queryClient)],\n * };\n * ```\n *\n * @example\n * ```ts\n * // Map injectQuery() signals → AsyncQueryStateModel for <africanies-async-state>\n * import type { AsyncQueryStateModel } from '@africanies/africanies-models';\n * import { injectQuery } from '@tanstack/angular-query-experimental';\n *\n * const query = injectQuery(() => ({\n * queryKey: ['shipments'],\n * queryFn: () => firstValueFrom(api.getResource<Shipment>('shipments', null)),\n * }));\n *\n * const state: AsyncQueryStateModel<Shipment[] | null> = {\n * data: query.data()?.data ?? undefined,\n * isLoading: query.isLoading(),\n * isFetching: query.isFetching(),\n * isError: query.isError(),\n * error: query.error()?.message ?? null,\n * };\n * ```\n */\nexport function createAfricaniesQueryClientDefaults(): AfricaniesQueryClientDefaults {\n return {\n queries: {\n staleTime: 60_000,\n gcTime: 5 * 60_000,\n retry: 0,\n retryDelay: (attemptIndex: number) =>\n Math.min(1000 * 2 ** attemptIndex, 30_000),\n },\n mutations: {\n retry: 0,\n },\n };\n}\n\n/**\n * Alias of {@link createAfricaniesQueryClientDefaults} for apps that prefer a\n * `provide*` naming style beside {@link provideAfricaniesSdk}.\n *\n * Returns a plain object (not `EnvironmentProviders`) so it can be passed\n * straight into `new QueryClient({ defaultOptions: ... })`.\n *\n * @returns Same object as {@link createAfricaniesQueryClientDefaults}.\n *\n * @example\n * ```ts\n * const queryClient = new QueryClient({\n * defaultOptions: provideAfricaniesQueryDefaults(),\n * });\n * ```\n */\nexport function provideAfricaniesQueryDefaults(): AfricaniesQueryClientDefaults {\n return createAfricaniesQueryClientDefaults();\n}\n","import type { CountryModel, CountryStateModel } from '@africanies/africanies-models';\n\nimport {\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n} from '../http/wire';\n\n/** Public country-read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const COUNTRY_READ_PATH = '/public/country/read';\n\n/**\n * Map a wire state object into {@link CountryStateModel} (snake_case preserved).\n * @param raw - State object from the wire.\n * @returns Normalized {@link CountryStateModel}.\n */\nexport function mapCountryState(raw: unknown): CountryStateModel {\n const record = asRecord(raw) ?? {};\n return {\n name: asString(record['name']),\n state_code: asString(record['state_code'] ?? record['stateCode']),\n };\n}\n\n/**\n * Map a wire country object into {@link CountryModel} (snake_case preserved).\n * @param raw - Country object from the wire.\n * @returns Normalized {@link CountryModel}.\n */\nexport function mapCountry(raw: unknown): CountryModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n iso3: asString(record['iso3']),\n iso2: asString(record['iso2']),\n states: mapArray(record['states'], mapCountryState),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link CountryModel}[].\n *\n * @param raw - `data` payload from `/public/country/read/{id|all}`.\n * @returns Mapped country list (empty when `raw` is null/undefined).\n */\nexport function mapCountryList(raw: unknown): CountryModel[] {\n return mapList(raw, mapCountry);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n CountryModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n COUNTRY_READ_PATH,\n mapCountry,\n mapCountryList,\n} from './country.mapper';\n\n/** In-memory GET cache TTL for country reference dumps / by-id (5 minutes). */\nconst COUNTRY_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Public country utility reads (`GET /public/country/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link CountryModel}\n *\n * @example\n * ```ts\n * const countries = inject(CountryService);\n *\n * countries.read(null, { page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n *\n * countries.readAll().subscribe((res) => console.log(res.data?.length));\n * countries.readById(1).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class CountryService {\n private readonly api = inject(ApiClient);\n\n /**\n * Paginated country page — {@link ResourceId} `null`.\n *\n * @param id - Omit or pass `null` for a paginated list.\n * @param params - Optional page/size/order and filters.\n */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel[]>>;\n\n /**\n * Full country list — {@link ResourceId} `'all'`.\n *\n * @param id - Must be `'all'`.\n * @param params - Optional filters (pagination fields ignored).\n */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel[]>>;\n\n /**\n * Single country — {@link ResourceId} number.\n *\n * @param id - Country id.\n * @param params - Optional filters (pagination fields ignored).\n */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel | CountryModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(COUNTRY_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, COUNTRY_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapCountry, mapCountryList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CountryModel>> {\n return this.read(id, params);\n }\n}\n","import type { CountryModel } from '@africanies/africanies-models';\n\n/** Default CDN for ISO country flags ([flagcdn.com](https://flagcdn.com)). */\nexport const COUNTRY_FLAG_CDN_BASE = 'https://flagcdn.com';\n\n/** Image format supported by the flag CDN. */\nexport type CountryFlagFormat = 'png' | 'webp' | 'jpg' | 'svg';\n\n/**\n * Options for {@link countryFlagUrl}.\n */\nexport interface CountryFlagUrlOptions {\n /** Pixel width (`w{width}` on flagcdn). Default `40`. */\n width?: number;\n /** Pixel height (`h{height}` on flagcdn). Used instead of {@link width} when set. */\n height?: number;\n /** Image format. Default `'png'`. */\n format?: CountryFlagFormat;\n}\n\n/**\n * Select row shape for country pickers (maps cleanly to {@link SelectOption.prefixImageUrl} in UI).\n */\nexport interface CountrySelectOption {\n label: string;\n value: number;\n iso2: string;\n prefixImageUrl: string;\n}\n\n/**\n * Build a flagcdn.com URL from an ISO 3166-1 alpha-2 code.\n *\n * Examples:\n * - `countryFlagUrl('NG')` → `https://flagcdn.com/w40/ng.png`\n * - `countryFlagUrl('us', { width: 80, format: 'webp' })` → `https://flagcdn.com/w80/us.webp`\n *\n * @param iso2 - Two-letter country code (case-insensitive).\n * @param options - Width, height, or format overrides.\n * @returns CDN URL, or `''` when `iso2` is not two letters.\n */\nexport function countryFlagUrl(\n iso2: string,\n options: CountryFlagUrlOptions = {},\n): string {\n const code = iso2.trim().toLowerCase();\n if (!/^[a-z]{2}$/.test(code)) {\n return '';\n }\n\n const format = options.format ?? 'png';\n if (options.height != null) {\n return `${COUNTRY_FLAG_CDN_BASE}/h${options.height}/${code}.${format}`;\n }\n\n const width = options.width ?? 40;\n return `${COUNTRY_FLAG_CDN_BASE}/w${width}/${code}.${format}`;\n}\n\n/**\n * Map {@link CountryModel} rows into select options with flag CDN URLs.\n *\n * @param countries - Countries from {@link CountryService.readAll} / `readPage`.\n * @param options - Passed through to {@link countryFlagUrl}.\n */\nexport function mapCountrySelectOptions(\n countries: CountryModel[] | null | undefined,\n options?: CountryFlagUrlOptions,\n): CountrySelectOption[] {\n if (!countries?.length) {\n return [];\n }\n\n return countries.map((country) => ({\n label: country.name,\n value: country.id,\n iso2: country.iso2,\n prefixImageUrl: countryFlagUrl(country.iso2, options),\n }));\n}\n","/**\n * Public country utility exports.\n */\n\nexport {\n COUNTRY_READ_PATH,\n mapCountry,\n mapCountryList,\n mapCountryState,\n} from './country.mapper';\nexport { CountryService } from './country.service';\nexport {\n COUNTRY_FLAG_CDN_BASE,\n type CountryFlagFormat,\n countryFlagUrl,\n type CountryFlagUrlOptions,\n type CountrySelectOption,\n mapCountrySelectOptions,\n} from './country-flag';\n","import type { FileReadModel } from '@africanies/africanies-models';\n\nimport { asRecord, asString } from '../http/wire';\n\n/** File read path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const FILE_READ_PATH = '/file/read';\n\n/** Query flag for multi-file waybill reads (`POST /file/read?multiple=yes`). */\nexport const FILE_READ_MULTIPLE_PARAM = 'yes';\n\n/**\n * Map wire `data` into {@link FileReadModel} (snake_case preserved).\n *\n * `POST /file/read` returns a single object in `data` (not a list).\n * If the wire unexpectedly sends a one-element array, the first entry is used.\n *\n * @param raw - Envelope `data` from `POST /file/read`.\n * @returns Normalized {@link FileReadModel}.\n */\nexport function mapFileRead(raw: unknown): FileReadModel {\n const entry = Array.isArray(raw) ? raw[0] : raw;\n const record = asRecord(entry) ?? {};\n return {\n mime_type: asString(record['mime_type'] ?? record['mimeType']),\n base_64: asString(record['base_64'] ?? record['base64']),\n url: asString(record['url']),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link FileReadModel}[].\n *\n * Used for `POST /file/read?multiple=yes` (e-commerce waybills).\n *\n * @param raw - Envelope `data` from multi-file reads.\n * @returns Mapped file list (empty when `raw` is null/undefined).\n */\nexport function mapFileReadList(raw: unknown): FileReadModel[] {\n if (Array.isArray(raw)) {\n return raw.map((entry) => mapFileRead(entry));\n }\n if (raw == null) {\n return [];\n }\n return [mapFileRead(raw)];\n}\n","import type { DocumentModel, FileReadModel } from '@africanies/africanies-models';\n\nimport { mapFileRead } from '../file/file.mapper';\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n} from '../http/wire';\n\n/** Public document read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const DOCUMENT_READ_PATH = '/public/document/read';\n\n/**\n * Map nested or legacy flat preview fields into {@link FileReadModel}.\n * @param record - Document wire object.\n */\nfunction mapDocumentFileRef(record: Record<string, unknown>): FileReadModel | null {\n const nested = asRecord(record['file_ref'] ?? record['fileRef']);\n if (nested !== null) {\n return mapFileRead(nested);\n }\n\n const mime_type = asNullableString(record['mime_type'] ?? record['mimeType']);\n const base_64 = asNullableString(record['base_64'] ?? record['base64']);\n const url = asNullableString(record['url']);\n if (mime_type === null && base_64 === null && url === null) {\n return null;\n }\n\n return mapFileRead({\n mime_type,\n base_64,\n url,\n });\n}\n\n/**\n * Map a wire document into {@link DocumentModel} (snake_case preserved).\n * @param raw - Single document object from the API.\n * @returns Normalized {@link DocumentModel}.\n */\nexport function mapDocument(raw: unknown): DocumentModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n description: asNullableString(record['description']),\n type: asNullableString(record['type']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n file_ref: mapDocumentFileRef(record),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link DocumentModel}[].\n * @param raw - `data` payload from `/public/document/read/{id|all}`.\n * @returns Mapped document list.\n */\nexport function mapDocumentList(raw: unknown): DocumentModel[] {\n return mapList(raw, mapDocument);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n DocumentModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n DOCUMENT_READ_PATH,\n mapDocument,\n mapDocumentList,\n} from './document.mapper';\n\n/** In-memory GET cache TTL for document reference dumps / by-id (5 minutes). */\nconst DOCUMENT_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Public document catalog reads (`GET /public/document/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link DocumentModel} (may include preview `url` / `base_64`)\n *\n * @example\n * ```ts\n * const documents = inject(DocumentService);\n *\n * documents.readPage({ page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * documents.readById(12).subscribe((res) => {\n * console.log(res.data?.url ?? res.data?.base_64);\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class DocumentService {\n private readonly api = inject(ApiClient);\n\n /** Paginated document page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel[]>>;\n\n /** Full document list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel[]>>;\n\n /** Single document — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel | DocumentModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(DOCUMENT_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, DOCUMENT_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapDocument, mapDocumentList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<DocumentModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Public document catalog exports.\n */\n\nexport {\n DOCUMENT_READ_PATH,\n mapDocument,\n mapDocumentList,\n} from './document.mapper';\nexport { DocumentService } from './document.service';\n","import type { PlanModel, PlanPackageModel } from '@africanies/africanies-models';\n\nimport {\n asBoolean,\n asNullableNumber,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n} from '../http/wire';\n\n/** Public plan read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const PLAN_READ_PATH = '/public/plan/read';\n\n/**\n * Map a wire plan package into {@link PlanPackageModel}.\n * @param raw - Package object nested under a plan.\n * @returns Normalized {@link PlanPackageModel}.\n */\nexport function mapPlanPackage(raw: unknown): PlanPackageModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n plan_id: asNullableNumber(record['plan_id'] ?? record['planId']),\n company_service_id: asNullableNumber(\n record['company_service_id'] ?? record['companyServiceId'],\n ),\n name: asString(record['name']),\n metrics: asNullableString(record['metrics']),\n volume: asNullableNumber(record['volume']),\n discount: asNullableString(record['discount']),\n model: asNullableString(record['model']),\n monthly: asNullableString(record['monthly']),\n quarterly: asNullableString(record['quarterly']),\n biannually: asNullableString(record['biannually']),\n annually: asNullableString(record['annually']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n };\n}\n\n/**\n * Map a wire plan into {@link PlanModel} (snake_case preserved).\n * @param raw - Single plan object from the API.\n * @returns Normalized {@link PlanModel}.\n */\nexport function mapPlan(raw: unknown): PlanModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n packages: mapArray(record['packages'], mapPlanPackage),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link PlanModel}[].\n * @param raw - `data` payload from `/public/plan/read/{id|all}`.\n * @returns Mapped plan list.\n */\nexport function mapPlanList(raw: unknown): PlanModel[] {\n return mapList(raw, mapPlan);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n PlanModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport { mapPlan, mapPlanList, PLAN_READ_PATH } from './plan.mapper';\n\n/** In-memory GET cache TTL for plan reference dumps / by-id (5 minutes). */\nconst PLAN_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Public subscription-plan reads (`GET /public/plan/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link PlanModel}\n *\n * @example\n * ```ts\n * const plans = inject(PlanService);\n *\n * plans.readPage({ page: 1, order: 'desc' }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * plans.readById(1).subscribe((res) => {\n * console.log(res.data?.packages?.length);\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class PlanService {\n private readonly api = inject(ApiClient);\n\n /** Paginated plan page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel[]>>;\n\n /** Full plan list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel[]>>;\n\n /** Single plan — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel | PlanModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(PLAN_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, PLAN_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapPlan, mapPlanList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PlanModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Public plan catalog exports.\n */\n\nexport {\n mapPlan,\n mapPlanList,\n mapPlanPackage,\n PLAN_READ_PATH,\n} from './plan.mapper';\nexport { PlanService } from './plan.service';\n","import type { ServiceModel } from '@africanies/africanies-models';\n\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n} from '../http/wire';\n\n/** Public service read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const SERVICE_READ_PATH = '/public/service/read';\n\n/**\n * Map a wire service into {@link ServiceModel} (snake_case preserved).\n * @param raw - Single service object from the API.\n * @returns Normalized {@link ServiceModel}.\n */\nexport function mapService(raw: unknown): ServiceModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n description: asNullableString(record['description']),\n model: asString(record['model']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link ServiceModel}[].\n * @param raw - `data` payload from `/public/service/read/{id|all}`.\n * @returns Mapped service list.\n */\nexport function mapServiceList(raw: unknown): ServiceModel[] {\n return mapList(raw, mapService);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ResourceId,\n ServiceModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n mapService,\n mapServiceList,\n SERVICE_READ_PATH,\n} from './service.mapper';\n\n/** In-memory GET cache TTL for service reference dumps / by-id (5 minutes). */\nconst SERVICE_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Public subscription-service reads (`GET /public/service/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link ServiceModel}\n *\n * @example\n * ```ts\n * const services = inject(ServiceService);\n *\n * services.readPage({ page: 1, search: 'box' }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * services.readAll().subscribe((res) => console.log(res.data?.length));\n * services.readById(3).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ServiceService {\n private readonly api = inject(ApiClient);\n\n /** Paginated service page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel[]>>;\n\n /** Full service list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel[]>>;\n\n /** Single service — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel | ServiceModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(SERVICE_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, SERVICE_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapService, mapServiceList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ServiceModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Public service catalog exports.\n */\n\nexport {\n mapService,\n mapServiceList,\n SERVICE_READ_PATH,\n} from './service.mapper';\nexport { ServiceService } from './service.service';\n","import type {\n CurrencyCreateRequestModel,\n CurrencyDeleteRequestModel,\n CurrencyFlag01,\n CurrencyModel,\n CurrencyPaymentMethodModel,\n CurrencyPaymentMethodPivotModel,\n CurrencyUpdateRequestModel,\n} from '@africanies/africanies-models';\n\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n toFlag01,\n} from '../http/wire';\n\n/** Currency read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const CURRENCY_READ_PATH = '/currency/read';\n\n/** Create path (App Settings → Currencies). */\nexport const CURRENCY_CREATE_PATH = '/currency/create';\n\n/** Update path — name / short_code are not sent. */\nexport const CURRENCY_UPDATE_PATH = '/currency/update';\n\n/** Delete path — JSON body `{ id }`. */\nexport const CURRENCY_DELETE_PATH = '/currency/delete';\n\n/**\n * Serialize a boolean / `\"1\"` / `\"0\"` flag for currency create/update.\n * @param value - Host boolean or wire flag.\n * @returns `\"1\"` or `\"0\"`.\n */\nexport function toCurrencyFlag01(\n value: boolean | CurrencyFlag01 | number | null | undefined,\n): CurrencyFlag01 {\n return toFlag01(value);\n}\n\n/**\n * Map a currency ↔ payment-method pivot (snake_case preserved).\n * @param raw - Pivot object from the wire.\n * @returns Normalized {@link CurrencyPaymentMethodPivotModel}.\n */\nexport function mapCurrencyPaymentMethodPivot(\n raw: unknown,\n): CurrencyPaymentMethodPivotModel {\n const record = asRecord(raw) ?? {};\n return {\n currency_id: asNumber(record['currency_id'] ?? record['currencyId']),\n payment_method_id: asNumber(\n record['payment_method_id'] ?? record['paymentMethodId'],\n ),\n };\n}\n\n/**\n * Map a wire payment method into {@link CurrencyPaymentMethodModel}.\n * @param raw - Payment-method object from the wire.\n * @returns Normalized {@link CurrencyPaymentMethodModel}.\n */\nexport function mapCurrencyPaymentMethod(\n raw: unknown,\n): CurrencyPaymentMethodModel {\n const record = asRecord(raw) ?? {};\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n model: asString(record['model']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n pivot: mapCurrencyPaymentMethodPivot(record['pivot']),\n };\n}\n\n/**\n * Map a wire currency into {@link CurrencyModel} (snake_case preserved).\n * @param raw - Currency object from the API.\n * @returns Normalized {@link CurrencyModel}.\n */\nexport function mapCurrency(raw: unknown): CurrencyModel {\n const record = asRecord(raw) ?? {};\n const payment_methods = mapArray(\n record['payment_methods'] ?? record['paymentMethods'],\n mapCurrencyPaymentMethod,\n );\n const nairaGreater = asBoolean(\n record['is_naira_greater'] ??\n record['isNairaGreater'] ??\n record['is_local_currency_greater'] ??\n record['isLocalCurrencyGreater'],\n );\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n short_code: asString(record['short_code'] ?? record['shortCode']),\n division_rate: asString(record['division_rate'] ?? record['divisionRate']),\n multiplication_rate: asString(\n record['multiplication_rate'] ?? record['multiplicationRate'],\n ),\n is_local_currency_greater: nairaGreater,\n is_naira_greater: nairaGreater,\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n payment_methods,\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link CurrencyModel}[].\n *\n * @param raw - `data` payload from `/currency/read/{id|all}`.\n * @returns Mapped currency list (empty when `raw` is null/undefined).\n */\nexport function mapCurrencyList(raw: unknown): CurrencyModel[] {\n return mapList(raw, mapCurrency);\n}\n\nfunction paymentMethodIds(raw: unknown): number[] {\n return mapArray(raw, (entry) => asNumber(entry));\n}\n\n/**\n * Wire body for `POST /currency/create`.\n * @param body - Host create payload.\n * @returns JSON body with `\"1\"` / `\"0\"` flags.\n */\nexport function toCurrencyCreateBody(\n body: CurrencyCreateRequestModel | null | undefined,\n): {\n name: string;\n short_code: string;\n multiplication_rate: string;\n division_rate: string;\n active: CurrencyFlag01;\n is_naira_greater: CurrencyFlag01;\n payment_method_ids: number[];\n} {\n return {\n name: asString(body?.name).trim(),\n short_code: asString(body?.short_code).trim(),\n multiplication_rate: asString(body?.multiplication_rate),\n division_rate: asString(body?.division_rate),\n active: toCurrencyFlag01(body?.active),\n is_naira_greater: toCurrencyFlag01(body?.is_naira_greater),\n payment_method_ids: paymentMethodIds(body?.payment_method_ids),\n };\n}\n\n/**\n * Wire body for `PUT /currency/update` (no name / short_code).\n * @param body - Host update payload.\n * @returns JSON body with `\"1\"` / `\"0\"` flags.\n */\nexport function toCurrencyUpdateBody(\n body: CurrencyUpdateRequestModel | null | undefined,\n): {\n id: number;\n multiplication_rate: string;\n division_rate: string;\n active: CurrencyFlag01;\n is_naira_greater: CurrencyFlag01;\n payment_method_ids: number[];\n} {\n return {\n id: asNumber(body?.id),\n multiplication_rate: asString(body?.multiplication_rate),\n division_rate: asString(body?.division_rate),\n active: toCurrencyFlag01(body?.active),\n is_naira_greater: toCurrencyFlag01(body?.is_naira_greater),\n payment_method_ids: paymentMethodIds(body?.payment_method_ids),\n };\n}\n\n/**\n * Wire body for `DELETE /currency/delete`.\n * @param body - Currency id wrapper.\n * @returns `{ id }`.\n */\nexport function toCurrencyDeleteBody(\n body: CurrencyDeleteRequestModel | number | null | undefined,\n): { id: number } {\n if (typeof body === 'number') {\n return { id: asNumber(body) };\n }\n return { id: asNumber(body?.id) };\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable, tap } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n CurrencyCreateRequestModel,\n CurrencyDeleteRequestModel,\n CurrencyModel,\n CurrencyUpdateRequestModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n CURRENCY_CREATE_PATH,\n CURRENCY_DELETE_PATH,\n CURRENCY_READ_PATH,\n CURRENCY_UPDATE_PATH,\n mapCurrency,\n mapCurrencyList,\n toCurrencyCreateBody,\n toCurrencyDeleteBody,\n toCurrencyUpdateBody,\n} from './currency.mapper';\n\n/** In-memory GET cache TTL for currency reference dumps / by-id (5 minutes). */\nconst CURRENCY_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Currency App Settings API (`GET /currency/read/{id?}` plus create / update / delete).\n *\n * Uses the AFRICANIES {@link ResourceId} convention for reads:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link CurrencyModel}\n *\n * Paginated responses embed a Laravel paginator in `data`; {@link ApiClient}\n * flattens that to `data: CurrencyModel[]` plus `pagination`.\n *\n * Writes send `\"1\"` / `\"0\"` flags. Delete uses a JSON `{ id }` body (not query\n * params). After each write, show `res.message` and call {@link readPage} again.\n *\n * @example\n * ```ts\n * const currencies = inject(CurrencyService);\n *\n * currencies.readPage({ page: 1, order: 'desc' }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * currencies.readAll().subscribe((res) => console.log(res.data?.[0]?.short_code));\n * currencies.readById(5).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class CurrencyService {\n private readonly api = inject(ApiClient);\n\n /** Paginated currency page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel[]>>;\n\n /** Full currency list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel[]>>;\n\n /** Single currency — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel | CurrencyModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(CURRENCY_READ_PATH, id), {\n toast: false,\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, CURRENCY_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapCurrency, mapCurrencyList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<CurrencyModel>> {\n return this.read(id, params);\n }\n\n /**\n * Create a currency (`POST /currency/create`).\n *\n * `name` / `short_code` come from the host’s local currency list, not GET.\n * Flags may be boolean or `\"1\"` / `\"0\"`; they are serialized to `\"1\"` / `\"0\"`.\n *\n * @param body - Create payload.\n * @returns Normalized envelope — use {@link ApiResponseModel.message}.\n */\n create(\n body: CurrencyCreateRequestModel,\n ): Observable<ApiResponseModel<unknown>> {\n return this.api\n .post<unknown, ReturnType<typeof toCurrencyCreateBody>>(\n CURRENCY_CREATE_PATH,\n toCurrencyCreateBody(body),\n )\n .pipe(tap(() => this.api.clearCache()));\n }\n\n /**\n * Update rates, flags, and payment methods (`PUT /currency/update`).\n *\n * Name and short code are not sent. Before edit, copy the row into the form\n * (`true` / `false` may stay booleans — this method serializes flags).\n *\n * @param body - Update payload including `id`.\n * @returns Normalized envelope — use {@link ApiResponseModel.message}.\n */\n update(\n body: CurrencyUpdateRequestModel,\n ): Observable<ApiResponseModel<unknown>> {\n return this.api\n .put<unknown, ReturnType<typeof toCurrencyUpdateBody>>(\n CURRENCY_UPDATE_PATH,\n toCurrencyUpdateBody(body),\n )\n .pipe(tap(() => this.api.clearCache()));\n }\n\n /**\n * Delete a currency (`DELETE /currency/delete`) with JSON body `{ id }`.\n *\n * @param body - Currency id or `{ id }`.\n * @returns Normalized envelope — use {@link ApiResponseModel.message}.\n */\n remove(\n body: CurrencyDeleteRequestModel | number,\n ): Observable<ApiResponseModel<unknown>> {\n return this.api\n .delete<unknown, { id: number }>(\n CURRENCY_DELETE_PATH,\n toCurrencyDeleteBody(body),\n )\n .pipe(tap(() => this.api.clearCache()));\n }\n}\n","/**\n * Currency utility exports.\n */\n\nexport {\n CURRENCY_CREATE_PATH,\n CURRENCY_DELETE_PATH,\n CURRENCY_READ_PATH,\n CURRENCY_UPDATE_PATH,\n mapCurrency,\n mapCurrencyList,\n mapCurrencyPaymentMethod,\n mapCurrencyPaymentMethodPivot,\n toCurrencyCreateBody,\n toCurrencyDeleteBody,\n toCurrencyFlag01,\n toCurrencyUpdateBody,\n} from './currency.mapper';\nexport { CurrencyService } from './currency.service';\n","import type {\n PaymentMethodCurrencyModel,\n PaymentMethodFlag01,\n PaymentMethodModel,\n PaymentMethodUpdateRequestModel,\n} from '@africanies/africanies-models';\n\nimport {\n mapCurrency,\n mapCurrencyPaymentMethodPivot,\n} from '../currency/currency.mapper';\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n toFlag01,\n} from '../http/wire';\n\n/** Payment-method read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const PAYMENT_METHOD_READ_PATH = '/payment_method/read';\n\n/** Payment-method update path (`PUT`). */\nexport const PAYMENT_METHOD_UPDATE_PATH = '/payment_method/update';\n\n/**\n * Serialize a boolean / `\"1\"` / `\"0\"` flag for payment-method update.\n * @param value - Host boolean or wire flag.\n * @returns `\"1\"` or `\"0\"`.\n */\nexport function toPaymentMethodFlag01(\n value: boolean | PaymentMethodFlag01 | number | null | undefined,\n): PaymentMethodFlag01 {\n return toFlag01(value);\n}\n\n/**\n * Build the wire body for `PUT /payment_method/update`.\n *\n * @param body - Host update payload (`active` may be boolean).\n * @returns Body with `active` as `\"1\"` / `\"0\"`.\n */\nexport function toPaymentMethodUpdateBody(\n body: PaymentMethodUpdateRequestModel,\n): {\n id: number;\n name: string;\n model: string;\n active: PaymentMethodFlag01;\n} {\n return {\n id: asNumber(body?.id),\n name: asString(body?.name),\n model: asString(body?.model),\n active: toPaymentMethodFlag01(body?.active),\n };\n}\n\n/**\n * Map a currency nested on a payment method (rates + pivot, no processors).\n * @param raw - Currency object from `currencies[]`.\n * @returns Normalized {@link PaymentMethodCurrencyModel}.\n */\nexport function mapPaymentMethodCurrency(\n raw: unknown,\n): PaymentMethodCurrencyModel {\n const mapped = mapCurrency(raw);\n const record = asRecord(raw) ?? {};\n return {\n id: mapped.id,\n name: mapped.name,\n short_code: mapped.short_code,\n division_rate: mapped.division_rate,\n multiplication_rate: mapped.multiplication_rate,\n is_local_currency_greater: mapped.is_local_currency_greater,\n is_naira_greater: mapped.is_naira_greater,\n active: mapped.active,\n deleted_at: mapped.deleted_at,\n created_at: mapped.created_at,\n updated_at: mapped.updated_at,\n pivot: mapCurrencyPaymentMethodPivot(record['pivot']),\n };\n}\n\n/**\n * Map a wire payment method into {@link PaymentMethodModel}.\n * @param raw - Payment-method object from the API.\n * @returns Normalized {@link PaymentMethodModel}.\n */\nexport function mapPaymentMethod(raw: unknown): PaymentMethodModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n model: asString(record['model']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n currencies: mapList(record['currencies'], mapPaymentMethodCurrency),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link PaymentMethodModel}[].\n *\n * @param raw - `data` payload from `/payment_method/read/{id|all}`.\n * @returns Mapped payment-method list (empty when `raw` is null/undefined).\n */\nexport function mapPaymentMethodList(raw: unknown): PaymentMethodModel[] {\n return mapList(raw, mapPaymentMethod);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable, tap } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n PaymentMethodModel,\n PaymentMethodUpdateRequestModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n mapPaymentMethod,\n mapPaymentMethodList,\n PAYMENT_METHOD_READ_PATH,\n PAYMENT_METHOD_UPDATE_PATH,\n toPaymentMethodUpdateBody,\n} from './payment-method.mapper';\n\n/** In-memory GET cache TTL for payment-method dumps / by-id (5 minutes). */\nconst PAYMENT_METHOD_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Payment-method App Settings API (`GET /payment_method/read/{id?}` plus update).\n *\n * Uses the AFRICANIES {@link ResourceId} convention for reads:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link PaymentMethodModel}\n *\n * Paginated responses embed a Laravel paginator in `data`; {@link ApiClient}\n * flattens that to `data: PaymentMethodModel[]` plus `pagination`.\n *\n * The only write is {@link update} (active toggle). There is no create or\n * delete on this board — processors are linked from Currencies via\n * `payment_method_ids`. After update, show `res.message` and patch the row’s\n * local `updated_at` — do not reload the full list.\n *\n * @example\n * ```ts\n * const methods = inject(PaymentMethodService);\n *\n * methods.readPage({ page: 1, order: 'desc' }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * methods.readAll().subscribe((res) => console.log(res.data?.[0]?.name));\n * methods.readById(4).subscribe((res) => console.log(res.data?.currencies));\n *\n * methods.update({\n * id: row.id,\n * name: row.name,\n * model: row.model,\n * active: nextActive,\n * }).subscribe((res) => {\n * // toast res.message; patch row.updated_at locally\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class PaymentMethodService {\n private readonly api = inject(ApiClient);\n\n /** Paginated payment-method page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel[]>>;\n\n /** Full payment-method list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel[]>>;\n\n /** Single payment method — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel | PaymentMethodModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(PAYMENT_METHOD_READ_PATH, id), {\n toast: false,\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, PAYMENT_METHOD_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(\n id,\n res.data,\n mapPaymentMethod,\n mapPaymentMethodList,\n ),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<PaymentMethodModel>> {\n return this.read(id, params);\n }\n\n /**\n * Toggle / update a payment method (`PUT /payment_method/update`).\n *\n * App Settings only edits `active` (status switch). Resend `name` and\n * `model` from the current row. `active` may be boolean or `\"1\"` / `\"0\"`;\n * this method serializes to `\"1\"` / `\"0\"`.\n *\n * On success: show {@link ApiResponseModel.message}, patch that row’s\n * local `updated_at`, and do **not** call {@link readPage} again.\n *\n * @param body - Update payload including `id`.\n * @returns Normalized envelope — use {@link ApiResponseModel.message}.\n */\n update(\n body: PaymentMethodUpdateRequestModel,\n ): Observable<ApiResponseModel<unknown>> {\n return this.api\n .put<unknown, ReturnType<typeof toPaymentMethodUpdateBody>>(\n PAYMENT_METHOD_UPDATE_PATH,\n toPaymentMethodUpdateBody(body),\n )\n .pipe(tap(() => this.api.clearCache()));\n }\n}\n","/**\n * Payment-method utility exports.\n */\n\nexport {\n mapPaymentMethod,\n mapPaymentMethodCurrency,\n mapPaymentMethodList,\n PAYMENT_METHOD_READ_PATH,\n PAYMENT_METHOD_UPDATE_PATH,\n toPaymentMethodFlag01,\n toPaymentMethodUpdateBody,\n} from './payment-method.mapper';\nexport { PaymentMethodService } from './payment-method.service';\n","import type {\n ShipmentMethodModel,\n ShipmentMethodZoneLinkModel,\n ShipmentMethodZonePageModel,\n ShipmentZoneModel,\n ShippingMode,\n} from '@africanies/africanies-models';\n\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n} from '../http/wire';\n\n/** Shipment-method read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const SHIPMENT_METHOD_READ_PATH = '/shipment_method/read';\n\nfunction asYesNo(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n return asString(value).trim().toLowerCase() === 'yes';\n}\n\nfunction asShippingMode(value: unknown): ShippingMode {\n return value === 'stn' ? 'stn' : 'sfn';\n}\n\n/**\n * Map a nested zone object into {@link ShipmentZoneModel}.\n * @param raw\n */\nexport function mapShipmentZone(raw: unknown): ShipmentZoneModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n type: asString(record['type']),\n active: asBoolean(record['active']),\n };\n}\n\n/**\n * Map a method↔zone link into {@link ShipmentMethodZoneLinkModel}.\n * @param raw\n */\nexport function mapShipmentMethodZoneLink(\n raw: unknown,\n): ShipmentMethodZoneLinkModel {\n const record = asRecord(raw) ?? {};\n return {\n id: asNumber(record['id']),\n zone_id: asNumber(record['zone_id'] ?? record['zoneId']),\n shipment_method_id: asNumber(\n record['shipment_method_id'] ?? record['shipmentMethodId'],\n ),\n active: asBoolean(record['active']),\n mode: asShippingMode(record['mode']),\n zone: mapShipmentZone(record['zone']),\n };\n}\n\n/**\n * Map a Laravel-style `zone_values` page into {@link ShipmentMethodZonePageModel}.\n * @param raw\n */\nexport function mapShipmentMethodZonePage(\n raw: unknown,\n): ShipmentMethodZonePageModel {\n const record = asRecord(raw);\n if (record === null) {\n return {\n data: [],\n current_page: 0,\n per_page: 0,\n total: 0,\n last_page: 0,\n };\n }\n\n return {\n data: mapArray(\n record['data'] ?? record['items'],\n mapShipmentMethodZoneLink,\n ),\n current_page: asNumber(record['current_page'] ?? record['currentPage']),\n per_page: asNumber(record['per_page'] ?? record['perPage']),\n total: asNumber(record['total']),\n last_page: asNumber(record['last_page'] ?? record['lastPage']),\n };\n}\n\n/**\n * Map a wire shipment method into {@link ShipmentMethodModel} (snake_case).\n * @param raw\n */\nexport function mapShipmentMethod(raw: unknown): ShipmentMethodModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n slug: asString(record['slug']),\n model: asString(record['model']),\n min_delivery_business_day: asNumber(\n record['min_delivery_business_day'] ?? record['minDeliveryBusinessDay'],\n ),\n max_delivery_business_day: asNumber(\n record['max_delivery_business_day'] ?? record['maxDeliveryBusinessDay'],\n ),\n notes: asString(record['notes']),\n blacklisted_words: asNullableString(\n record['blacklisted_words'] ?? record['blacklistedWords'],\n ),\n position: asNumber(record['position']),\n min_weight: asNumber(record['min_weight'] ?? record['minWeight']),\n max_weight: asNumber(record['max_weight'] ?? record['maxWeight']),\n max_length: asNumber(record['max_length'] ?? record['maxLength']),\n max_width: asNumber(record['max_width'] ?? record['maxWidth']),\n max_height: asNumber(record['max_height'] ?? record['maxHeight']),\n markup: asNumber(record['markup']),\n surcharge: asNumber(record['surcharge']),\n insurance_benchmark: asNumber(\n record['insurance_benchmark'] ?? record['insuranceBenchmark'],\n ),\n insurance: asNumber(record['insurance']),\n clearing_handling: asNumber(\n record['clearing_handling'] ?? record['clearingHandling'],\n ),\n destination: asString(record['destination']),\n sea_only: asYesNo(record['sea_only'] ?? record['seaOnly']),\n currency: asString(record['currency']),\n type: asString(record['type']),\n active: asBoolean(record['active']),\n multiple_rates: asBoolean(record['multiple_rates'] ?? record['multipleRates']),\n first_shipment_discount: asNumber(\n record['first_shipment_discount'] ?? record['firstShipmentDiscount'],\n ),\n discount_type: asString(record['discount_type'] ?? record['discountType']),\n discount_active: asBoolean(\n record['discount_active'] ?? record['discountActive'],\n ),\n mode: asShippingMode(record['mode']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n markdown: asNumber(record['markdown']),\n zone_values: mapShipmentMethodZonePage(\n record['zone_values'] ?? record['zoneValues'],\n ),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link ShipmentMethodModel}[].\n * @param raw\n */\nexport function mapShipmentMethodList(raw: unknown): ShipmentMethodModel[] {\n return mapList(raw, mapShipmentMethod);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ResourceId,\n ShipmentMethodModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n mapShipmentMethod,\n mapShipmentMethodList,\n SHIPMENT_METHOD_READ_PATH,\n} from './shipment-method.mapper';\n\n/** In-memory GET cache TTL for method reference dumps / by-id (5 minutes). */\nconst SHIPMENT_METHOD_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Shipment method / carrier utility reads (`GET /shipment_method/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link ShipmentMethodModel}\n *\n * @example\n * ```ts\n * const methods = inject(ShipmentMethodService);\n *\n * methods.readPage({ page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * methods.readAll().subscribe((res) => console.log(res.data?.[0]?.name));\n * methods.readById(12).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ShipmentMethodService {\n private readonly api = inject(ApiClient);\n\n /** Paginated method page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel[]>>;\n\n /** Full method list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel[]>>;\n\n /** Single method — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel | ShipmentMethodModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(SHIPMENT_METHOD_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, SHIPMENT_METHOD_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(\n id,\n res.data,\n mapShipmentMethod,\n mapShipmentMethodList,\n ),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ShipmentMethodModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Shipment method / carrier utility exports.\n */\n\nexport {\n mapShipmentMethod,\n mapShipmentMethodList,\n mapShipmentMethodZoneLink,\n mapShipmentMethodZonePage,\n mapShipmentZone,\n SHIPMENT_METHOD_READ_PATH,\n} from './shipment-method.mapper';\nexport { ShipmentMethodService } from './shipment-method.service';\n","import type {\n CountryModel,\n WarehouseModel,\n WarehouseStateModel,\n} from '@africanies/africanies-models';\n\nimport { mapCountry } from '../country/country.mapper';\nimport { mapApiJsonValue } from '../http/map-api-json';\nimport {\n asBoolean,\n asNullableNumber,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n} from '../http/wire';\n\n/** Warehouse read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const WAREHOUSE_READ_PATH = '/warehouse/read';\n\n/**\n * Map warehouse state into {@link WarehouseStateModel} (snake_case).\n * @param raw\n */\nexport function mapWarehouseState(raw: unknown): WarehouseStateModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n state_code: asString(record['state_code'] ?? record['stateCode']),\n country: asString(record['country']),\n country_code: asString(record['country_code'] ?? record['countryCode']),\n };\n}\n\n/**\n * Map nested country (same shape as public country utility).\n * @param raw\n */\nexport function mapWarehouseCountry(raw: unknown): CountryModel | null {\n if (raw == null) {\n return null;\n }\n return mapCountry(raw);\n}\n\n/**\n * Map a wire warehouse into {@link WarehouseModel} (snake_case preserved).\n * @param raw\n */\nexport function mapWarehouse(raw: unknown): WarehouseModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n partner_id: asNullableNumber(record['partner_id'] ?? record['partnerId']),\n name: asString(record['name']),\n phone: asString(record['phone']),\n email: asString(record['email']),\n country: mapWarehouseCountry(record['country']),\n api_enabled: asBoolean(record['api_enabled'] ?? record['apiEnabled']),\n state: mapWarehouseState(record['state']),\n city: asString(record['city']),\n address: asString(record['address']),\n longitude: asNumber(record['longitude']),\n latitude: asNumber(record['latitude']),\n zip_code: asString(record['zip_code'] ?? record['zipCode']),\n usage: asNumber(record['usage']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n storage_charge: asNumber(\n record['storage_charge'] ?? record['storageCharge'],\n ),\n storage_period: asNumber(\n record['storage_period'] ?? record['storagePeriod'],\n ),\n delivery_charge: asNumber(\n record['delivery_charge'] ?? record['deliveryCharge'],\n ),\n delivery_count: asNumber(\n record['delivery_count'] ?? record['deliveryCount'],\n ),\n currency: asString(record['currency']),\n etw_shipment_available: asBoolean(\n record['etw_shipment_available'] ?? record['etwShipmentAvailable'],\n ),\n local: asBoolean(record['local']),\n no_shippo: asBoolean(record['no_shippo'] ?? record['noShippo']),\n partner: mapApiJsonValue(record['partner']),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link WarehouseModel}[].\n * @param raw\n */\nexport function mapWarehouseList(raw: unknown): WarehouseModel[] {\n return mapList(raw, mapWarehouse);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ResourceId,\n WarehouseModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport {\n mapWarehouse,\n mapWarehouseList,\n WAREHOUSE_READ_PATH,\n} from './warehouse.mapper';\n\n/** In-memory GET cache TTL for warehouse reference dumps / by-id (5 minutes). */\nconst WAREHOUSE_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Warehouse utility reads (`GET /warehouse/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link WarehouseModel}\n *\n * @example\n * ```ts\n * const warehouses = inject(WarehouseService);\n *\n * warehouses.readPage({ page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * warehouses.readAll().subscribe((res) => console.log(res.data?.length));\n * warehouses.readById(37).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class WarehouseService {\n private readonly api = inject(ApiClient);\n\n /** Paginated warehouse page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel[]>>;\n\n /** Full warehouse list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel[]>>;\n\n /** Single warehouse — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel | WarehouseModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(WAREHOUSE_READ_PATH, id), {\n toast: false,\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, WAREHOUSE_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(\n id,\n res.data,\n mapWarehouse,\n mapWarehouseList,\n ),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<WarehouseModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Warehouse utility exports.\n */\n\nexport {\n mapWarehouse,\n mapWarehouseCountry,\n mapWarehouseList,\n mapWarehouseState,\n WAREHOUSE_READ_PATH,\n} from './warehouse.mapper';\nexport { WarehouseService } from './warehouse.service';\n","import type { ZoneModel } from '@africanies/africanies-models';\n\nimport {\n asBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n} from '../http/wire';\n\n/** Zone read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const ZONE_READ_PATH = '/zone/read/records';\n\n/**\n * Map a wire zone into {@link ZoneModel} (snake_case preserved).\n * @param raw\n */\nexport function mapZone(raw: unknown): ZoneModel {\n const record = asRecord(raw) ?? {};\n return {\n id: asNumber(record['id']),\n name: asString(record['name']),\n type: asString(record['type']),\n active: asBoolean(record['active']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link ZoneModel}[].\n * @param raw\n */\nexport function mapZoneList(raw: unknown): ZoneModel[] {\n return mapList(raw, mapZone);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ResourceId,\n ZoneModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport { mapZone, mapZoneList, ZONE_READ_PATH } from './zone.mapper';\n\n/** In-memory GET cache TTL for zone reference dumps / by-id (5 minutes). */\nconst ZONE_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Zone utility reads (`GET /zone/read/records/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link ZoneModel}\n *\n * @example\n * ```ts\n * const zones = inject(ZoneService);\n *\n * zones.readPage({ page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * zones.readAll().subscribe((res) => console.log(res.data?.length));\n * zones.readById(1).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ZoneService {\n private readonly api = inject(ApiClient);\n\n /** Paginated zone page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel[]>>;\n\n /** Full zone list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel[]>>;\n\n /** Single zone — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel | ZoneModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(ZONE_READ_PATH, id), {\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, ZONE_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapZone, mapZoneList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(params?: ResourceQueryParams): Observable<ApiResponseModel<ZoneModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ZoneModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Zone utility exports.\n */\n\nexport { mapZone, mapZoneList, ZONE_READ_PATH } from './zone.mapper';\nexport { ZoneService } from './zone.service';\n","import type {\n AccountType,\n PlanType,\n ShippingType,\n UserAccountManagerModel,\n UserBusinessAccountModel,\n UserCountryModel,\n UserGatewayPayloadModel,\n UserModel,\n UserModelType,\n UserPaymentPayloadModel,\n UserPlanModel,\n UserPlanPackageModel,\n UserStateModel,\n UserSubscriptionModel,\n} from '@africanies/africanies-models';\n\nimport {\n asNullableBoolean,\n asNullableFlag01,\n asNullableNumber,\n asNullableString,\n asRecord,\n mapArray,\n} from '../http/wire';\n\n/** Current-user path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const USER_PATH = '/user';\n\n/** Change-password path after a default-password first login. */\nexport const USER_CHANGE_PASSWORD_PATH = '/user/change/password';\n\n/** Invalidate every session for the signed-in user. */\nexport const USER_LOGOUT_FROM_ALL_SESSIONS_PATH =\n '/user/logout-from-all-sessions';\n\nconst ACCOUNT_TYPES = new Set<AccountType>(['business', 'individual']);\nconst SHIPPING_TYPES = new Set<ShippingType>(['instant', 'consolidation']);\nconst PLAN_TYPES = new Set<PlanType>([\n 'monthly',\n 'quarterly',\n 'biannually',\n 'annually',\n]);\nconst USER_MODEL_TYPES = new Set<UserModelType>([\n 'App\\\\Models\\\\Customer',\n 'App\\\\Models\\\\Admin',\n]);\n\n/**\n * @param value - Candidate union member.\n * @param allowed - Allowed set.\n * @returns Value when allowed; otherwise `null`.\n */\nfunction asEnumMember<T extends string>(\n value: unknown,\n allowed: Set<T>,\n): T | null {\n if (typeof value !== 'string') {\n return null;\n }\n return allowed.has(value as T) ? (value as T) : null;\n}\n\n/**\n * Map a state row under country.states.\n * @param raw - State object from the wire.\n * @returns {@link UserStateModel}, or `null`.\n */\nexport function mapUserCountryState(raw: unknown): UserStateModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n name: asNullableString(record['name']),\n state_code: asNullableString(\n record['state_code'] ?? record['stateCode'],\n ),\n };\n}\n\n/**\n * Map nested country on the user profile.\n * @param raw - Country object from the wire.\n * @returns {@link UserCountryModel}, or `null`.\n */\nexport function mapUserCountry(raw: unknown): UserCountryModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n const states = Array.isArray(record['states'])\n ? mapArray(record['states'], mapUserCountryState).filter(\n (entry): entry is UserStateModel => entry !== null,\n )\n : null;\n\n return {\n id: asNullableNumber(record['id']),\n name: asNullableString(record['name']),\n iso3: asNullableString(record['iso3']),\n iso2: asNullableString(record['iso2']),\n states,\n };\n}\n\n/**\n * Normalize `state` when the API returns a string (or an object with `name`).\n * @param raw - Wire `state` field.\n * @returns String label, or `null`.\n */\nexport function mapUserStateLabel(raw: unknown): string | null {\n if (raw == null) {\n return null;\n }\n if (typeof raw === 'string') {\n return raw;\n }\n const record = asRecord(raw);\n if (record !== null) {\n return asNullableString(record['name'] ?? record['state']);\n }\n return null;\n}\n\n/**\n * @param raw - Plan package object.\n * @returns {@link UserPlanPackageModel}, or `null`.\n */\nexport function mapUserPlanPackage(raw: unknown): UserPlanPackageModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNullableNumber(record['id']),\n plan_id: asNullableNumber(record['plan_id'] ?? record['planId']),\n company_service_id: asNullableNumber(\n record['company_service_id'] ?? record['companyServiceId'],\n ),\n name: asNullableString(record['name']),\n metrics: asNullableString(record['metrics']),\n volume: asNullableNumber(record['volume']),\n discount: asNullableString(record['discount']),\n model: asNullableString(record['model']),\n monthly: asNullableString(record['monthly']),\n quarterly: asNullableString(record['quarterly']),\n biannually: asNullableString(record['biannually']),\n annually: asNullableString(record['annually']),\n active: asNullableBoolean(record['active']),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n };\n}\n\n/**\n * @param raw - Plan object.\n * @returns {@link UserPlanModel}, or `null`.\n */\nexport function mapUserPlan(raw: unknown): UserPlanModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n const packages = Array.isArray(record['packages'])\n ? mapArray(record['packages'], mapUserPlanPackage).filter(\n (entry): entry is UserPlanPackageModel => entry !== null,\n )\n : null;\n\n return {\n id: asNullableNumber(record['id']),\n name: asNullableString(record['name']),\n active: asNullableBoolean(record['active']),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n packages,\n };\n}\n\n/**\n * @param raw - Gateway payload object.\n * @returns {@link UserGatewayPayloadModel}, or `null`.\n */\nexport function mapUserGatewayPayload(\n raw: unknown,\n): UserGatewayPayloadModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n authorization_url: asNullableString(\n record['authorization_url'] ?? record['authorizationUrl'],\n ),\n access_code: asNullableString(\n record['access_code'] ?? record['accessCode'],\n ),\n reference: asNullableString(record['reference']),\n redirect_url: asNullableString(\n record['redirect_url'] ?? record['redirectUrl'],\n ),\n };\n}\n\n/**\n * @param raw - Payment payload object (already parsed).\n * @returns {@link UserPaymentPayloadModel}, or `null`.\n */\nexport function mapUserPaymentPayload(\n raw: unknown,\n): UserPaymentPayloadModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n url: asNullableString(record['url']),\n redirect_url: asNullableString(\n record['redirect_url'] ?? record['redirectUrl'],\n ),\n gateway_payload: mapUserGatewayPayload(\n record['gateway_payload'] ?? record['gatewayPayload'],\n ),\n reference: asNullableString(record['reference']),\n };\n}\n\n/**\n * @param raw - Subscription object.\n * @returns {@link UserSubscriptionModel}, or `null`.\n */\nexport function mapUserSubscription(\n raw: unknown,\n): UserSubscriptionModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNullableNumber(record['id']),\n user_id: asNullableNumber(record['user_id'] ?? record['userId']),\n plan_id: asNullableNumber(record['plan_id'] ?? record['planId']),\n account_id: asNullableNumber(record['account_id'] ?? record['accountId']),\n reference: asNullableString(record['reference']),\n process_url: asNullableString(\n record['process_url'] ?? record['processUrl'],\n ),\n reference_salt: asNullableString(\n record['reference_salt'] ?? record['referenceSalt'],\n ),\n amount: asNullableString(record['amount']),\n currency: asNullableString(record['currency']),\n payment_amount: asNullableString(\n record['payment_amount'] ?? record['paymentAmount'],\n ),\n payment_currency: asNullableString(\n record['payment_currency'] ?? record['paymentCurrency'],\n ),\n coupon_id: asNullableNumber(record['coupon_id'] ?? record['couponId']),\n coupon_discount: asNullableString(\n record['coupon_discount'] ?? record['couponDiscount'],\n ),\n coupon_amount: asNullableString(\n record['coupon_amount'] ?? record['couponAmount'],\n ),\n payment_payload: asNullableString(\n record['payment_payload'] ?? record['paymentPayload'],\n ),\n plan_type: asEnumMember(\n record['plan_type'] ?? record['planType'],\n PLAN_TYPES,\n ),\n used: asNullableBoolean(record['used']),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n };\n}\n\n/**\n * @param raw - Business account object.\n * @returns {@link UserBusinessAccountModel}, or `null`.\n */\nexport function mapUserBusinessAccount(\n raw: unknown,\n): UserBusinessAccountModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNullableNumber(record['id']),\n user_id: asNullableNumber(record['user_id'] ?? record['userId']),\n plan_id: asNullableNumber(record['plan_id'] ?? record['planId']),\n name: asNullableString(record['name']),\n account_email: asNullableString(\n record['account_email'] ?? record['accountEmail'],\n ),\n plan_type: asEnumMember(\n record['plan_type'] ?? record['planType'],\n PLAN_TYPES,\n ),\n first_payment: asNullableBoolean(\n record['first_payment'] ?? record['firstPayment'],\n ),\n is_whitelisted: asNullableBoolean(\n record['is_whitelisted'] ?? record['isWhitelisted'],\n ),\n no_state_validation: asNullableBoolean(\n record['no_state_validation'] ?? record['noStateValidation'],\n ),\n show_waybill: asNullableBoolean(\n record['show_waybill'] ?? record['showWaybill'],\n ),\n notify_api_shipment: asNullableBoolean(\n record['notify_api_shipment'] ?? record['notifyApiShipment'],\n ),\n active: asNullableBoolean(record['active']),\n expires_at: asNullableString(\n record['expires_at'] ?? record['expiresAt'],\n ),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n type: asEnumMember(record['type'], ACCOUNT_TYPES),\n days_left: asNullableNumber(record['days_left'] ?? record['daysLeft']),\n plan: mapUserPlan(record['plan']),\n subscription: mapUserSubscription(record['subscription']),\n };\n}\n\n/**\n * @param raw - Account manager object.\n * @returns {@link UserAccountManagerModel}, or `null`.\n */\nexport function mapUserAccountManager(\n raw: unknown,\n): UserAccountManagerModel | null {\n const record = asRecord(raw);\n if (record === null) {\n return null;\n }\n return {\n id: asNullableNumber(record['id']),\n user_id: asNullableNumber(record['user_id'] ?? record['userId']),\n manager_id: asNullableNumber(record['manager_id'] ?? record['managerId']),\n account_id: asNullableNumber(record['account_id'] ?? record['accountId']),\n name: asNullableString(record['name']),\n email: asNullableString(record['email']),\n phone: asNullableString(record['phone']),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n };\n}\n\n/**\n * Map a bare wire user object into {@link UserModel} (snake_case preserved).\n * @param raw - User object from `GET /user` (unwrapped).\n * @returns Normalized {@link UserModel}.\n */\nexport function mapUser(raw: unknown): UserModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNullableNumber(record['id']),\n central_id: asNullableString(\n record['central_id'] ?? record['centralId'],\n ),\n name: asNullableString(record['name']),\n first_name: asNullableString(\n record['first_name'] ?? record['firstName'],\n ),\n middle_name: asNullableString(\n record['middle_name'] ?? record['middleName'],\n ),\n last_name: asNullableString(\n record['last_name'] ?? record['lastName'],\n ),\n email: asNullableString(record['email']),\n phone: asNullableString(record['phone']),\n unit_number: asNullableString(\n record['unit_number'] ?? record['unitNumber'],\n ),\n referral_code: asNullableString(\n record['referral_code'] ?? record['referralCode'],\n ),\n old_unit_number: asNullableString(\n record['old_unit_number'] ?? record['oldUnitNumber'],\n ),\n account_email: asNullableString(\n record['account_email'] ?? record['accountEmail'],\n ),\n two_factor: asNullableBoolean(\n record['two_factor'] ?? record['twoFactor'],\n ),\n default_pin: asNullableBoolean(\n record['default_pin'] ?? record['defaultPin'],\n ),\n model: asEnumMember(\n record['model'],\n USER_MODEL_TYPES,\n ),\n country: mapUserCountry(record['country']),\n state: mapUserStateLabel(record['state']),\n email_verified_at: asNullableString(\n record['email_verified_at'] ?? record['emailVerifiedAt'],\n ),\n phone_verified_at: asNullableString(\n record['phone_verified_at'] ?? record['phoneVerifiedAt'],\n ),\n kyc_verified_at: asNullableString(\n record['kyc_verified_at'] ?? record['kycVerifiedAt'],\n ),\n passport_verified_at: asNullableString(\n record['passport_verified_at'] ?? record['passportVerifiedAt'],\n ),\n suspended_at: asNullableString(\n record['suspended_at'] ?? record['suspendedAt'],\n ),\n deactivated_at: asNullableString(\n record['deactivated_at'] ?? record['deactivatedAt'],\n ),\n active: asNullableBoolean(record['active']),\n default_password: asNullableBoolean(\n record['default_password'] ?? record['defaultPassword'],\n ),\n type: asEnumMember(record['type'], ACCOUNT_TYPES),\n deleted_at: asNullableString(\n record['deleted_at'] ?? record['deletedAt'],\n ),\n created_at: asNullableString(\n record['created_at'] ?? record['createdAt'],\n ),\n updated_at: asNullableString(\n record['updated_at'] ?? record['updatedAt'],\n ),\n last_login_at: asNullableString(\n record['last_login_at'] ?? record['lastLoginAt'],\n ),\n socialite_signup: asNullableFlag01(\n record['socialite_signup'] ?? record['socialiteSignup'],\n ),\n form_signup: asNullableFlag01(\n record['form_signup'] ?? record['formSignup'],\n ),\n main_region: asNullableString(\n record['main_region'] ?? record['mainRegion'],\n ),\n shipping_type: asEnumMember(\n record['shipping_type'] ?? record['shippingType'],\n SHIPPING_TYPES,\n ),\n accounts: Array.isArray(record['accounts']) ? record['accounts'] : null,\n business_account: mapUserBusinessAccount(\n record['business_account'] ?? record['businessAccount'],\n ),\n account_manager: mapUserAccountManager(\n record['account_manager'] ?? record['accountManager'],\n ),\n };\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ChangePasswordRequestModel,\n UserModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport { asString } from '../http/wire';\nimport {\n mapUser,\n USER_CHANGE_PASSWORD_PATH,\n USER_LOGOUT_FROM_ALL_SESSIONS_PATH,\n USER_PATH,\n} from './user.mapper';\n\n/**\n * Current authenticated user (`GET /user`).\n *\n * The backend returns a **bare** user object (no `{ success, data }` wrapper).\n * {@link ApiClient} normalizes that into {@link ApiResponseModel}; this service\n * maps wire fields once into {@link UserModel} (snake_case preserved).\n *\n * Requires an access token via {@link AuthTokenService.set}. Not cached — profile\n * data is auth-sensitive and can change per session.\n *\n * After login, if `user.default_password` is set, send the user to\n * `/onboarding/reset-password` and call {@link changePassword} (current → new).\n * That page is **not** the email-link forgot-password flow.\n *\n * On logout, call {@link logoutFromAllSessions} while the bearer token is still\n * set, then {@link AuthTokenService.clear}.\n *\n * @example\n * ```ts\n * const users = inject(UserService);\n *\n * users.me().subscribe((res) => {\n * if (res.success) console.log(res.data?.email);\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class UserService {\n private readonly api = inject(ApiClient);\n\n /**\n * Fetch the current user.\n *\n * @returns Normalized envelope with mapped {@link UserModel} (or `null` data).\n */\n me(): Observable<ApiResponseModel<UserModel>> {\n return this.api.get<unknown>(USER_PATH).pipe(\n map((res) => ({\n ...res,\n data: res.data == null ? null : mapUser(res.data),\n })),\n );\n }\n\n /**\n * Change the signed-in user’s password (`POST /user/change/password`).\n *\n * Used on first login when {@link UserModel.default_password} is true —\n * not the email-only {@link AuthService.forgot} flow.\n *\n * @param body - Current password plus new password and confirmation.\n * @returns Normalized envelope (`data` is typically unused).\n */\n changePassword(\n body: ChangePasswordRequestModel,\n ): Observable<ApiResponseModel<unknown>> {\n return this.api.post<unknown, ChangePasswordRequestModel>(\n USER_CHANGE_PASSWORD_PATH,\n {\n current_password: asString(body?.current_password),\n password: asString(body?.password),\n password_confirmation: asString(body?.password_confirmation),\n },\n );\n }\n\n /**\n * Sign out of this device and every other session\n * (`POST /user/logout-from-all-sessions`).\n *\n * Call while the bearer token is still set so the interceptor can attach\n * `Authorization`. Then {@link AuthTokenService.clear} locally.\n *\n * @returns Normalized envelope (`data` is typically unused).\n */\n logoutFromAllSessions(): Observable<ApiResponseModel<unknown>> {\n return this.api.post<unknown, Record<string, never>>(\n USER_LOGOUT_FROM_ALL_SESSIONS_PATH,\n {},\n );\n }\n}\n","import type {\n NotificationInboxItemModel,\n NotificationModel,\n NotificationPayloadModel,\n} from '@africanies/africanies-models';\n\nimport {\n asNullableBoolean,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapList,\n} from '../http/wire';\n\n/** User notifications read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const NOTIFICATION_READ_PATH = '/user/notifications/read';\n\n/** Mark read endpoint (single `{ id }` or `{}` for all). */\nexport const NOTIFICATION_UPDATE_PATH = '/user/notifications/update';\n\n/**\n * Parse the Laravel `data` column (JSON string or object) into\n * {@link NotificationPayloadModel}.\n * @param raw\n */\nexport function mapNotificationPayload(raw: unknown): NotificationPayloadModel {\n let record = asRecord(raw);\n\n if (typeof raw === 'string' && raw.trim()) {\n try {\n record = asRecord(JSON.parse(raw));\n } catch {\n record = null;\n }\n }\n\n const payload = record ?? {};\n const userId = payload['user_id'] ?? payload['userId'];\n return {\n user_id: userId == null ? null : asNumber(userId),\n title: asString(payload['title']),\n body: asNullableString(payload['body']),\n link: asNullableString(payload['link']),\n image: asNullableString(payload['image']),\n external_link: asNullableBoolean(\n payload['external_link'] ?? payload['externalLink'],\n ),\n };\n}\n\n/**\n * Map a wire notification row into {@link NotificationModel}.\n * @param raw\n */\nexport function mapNotification(raw: unknown): NotificationModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asString(record['id']),\n type: asString(record['type']),\n notifiable_type: asString(\n record['notifiable_type'] ?? record['notifiableType'],\n ),\n notifiable_id: asNumber(record['notifiable_id'] ?? record['notifiableId']),\n data: mapNotificationPayload(record['data']),\n read_at: asNullableString(record['read_at'] ?? record['readAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n };\n}\n\n/**\n * Map wire list payloads into {@link NotificationModel}[].\n * @param raw\n */\nexport function mapNotificationList(raw: unknown): NotificationModel[] {\n return mapList(raw, mapNotification).filter((row) => row.id !== '');\n}\n\n/**\n * Derive a header/drawer inbox item from a mapped notification.\n * @param notification\n */\nexport function mapNotificationInboxItem(\n notification: NotificationModel | null | undefined,\n): NotificationInboxItemModel {\n const row = notification ?? mapNotification(null);\n const data = row.data ?? mapNotificationPayload(null);\n\n return {\n id: asString(row.id),\n title: asString(data.title),\n body: data.body ?? undefined,\n timestamp: row.created_at ?? undefined,\n read: row.read_at != null && row.read_at !== '',\n link: data.link ?? undefined,\n external_link: data.external_link ?? undefined,\n image: data.image,\n };\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { catchError, map, Observable, of } from 'rxjs';\n\nimport {\n type ApiResponseModel,\n NOTIFICATION_PAGE_SIZE,\n type NotificationModel,\n type ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport { asString } from '../http/wire';\nimport {\n mapNotification,\n mapNotificationList,\n NOTIFICATION_READ_PATH,\n NOTIFICATION_UPDATE_PATH,\n} from './notification.mapper';\n\n/**\n * Authenticated user notifications (`GET /user/notifications/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention for paginated / full-list reads.\n * Notification primary keys are UUID strings — use {@link readOne} for a single row.\n *\n * Requires an access token via {@link AuthTokenService.set}. Not cached — inbox\n * data is auth-sensitive and changes frequently.\n *\n * @example\n * ```ts\n * const notifications = inject(NotificationService);\n *\n * notifications.readAll().subscribe((res) => {\n * console.log(res.data?.length);\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationService {\n private readonly api = inject(ApiClient);\n\n /** Paginated inbox page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<NotificationModel[]>>;\n\n /** Full inbox list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<NotificationModel[]>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<NotificationModel[]>> {\n const query: ResourceQueryParams | undefined =\n id === null\n ? { ...params, size: params?.size ?? NOTIFICATION_PAGE_SIZE }\n : params;\n\n return this.api\n .get<unknown>(buildResourcePath(NOTIFICATION_READ_PATH, id), {\n params: buildResourceQueryParams(id, query),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(\n id,\n res?.data,\n mapNotification,\n mapNotificationList,\n ) as NotificationModel[] | null,\n })),\n catchError(() =>\n of({\n success: false,\n message: null,\n data: [] as NotificationModel[],\n errors: null,\n pagination: null,\n status_code: null,\n }),\n ),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * Size defaults to {@link NOTIFICATION_PAGE_SIZE} (`30`).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<NotificationModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<NotificationModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single notification by UUID (`GET /user/notifications/read/{uuid}`).\n * @param id\n */\n readOne(id: string): Observable<ApiResponseModel<NotificationModel>> {\n const trimmed = asString(id).trim();\n return this.api\n .get<unknown>(`${NOTIFICATION_READ_PATH}/${encodeURIComponent(trimmed)}`)\n .pipe(\n map((res) => ({\n ...res,\n data:\n res.data == null\n ? null\n : mapNotification(\n Array.isArray(res.data) ? res.data[0] : res.data,\n ),\n })),\n );\n }\n\n /**\n * Mark one or all notifications read (`PUT /user/notifications/update`).\n *\n * @param id - When set, marks that notification read; omit to mark all read.\n */\n markRead(id?: string): Observable<ApiResponseModel<unknown>> {\n const body = id ? { id: asString(id) } : {};\n return this.api.put<unknown, { id?: string }>(NOTIFICATION_UPDATE_PATH, body);\n }\n}\n","import type { ShippingMode } from '@africanies/africanies-models';\n\nimport { asString } from '../http/wire';\n\nconst SHIPMENT_APP_BY_MODE: Record<ShippingMode, string> = {\n stn: 'shiptonaija',\n sfn: 'shipfromnaija',\n};\n\n/**\n * Rewrite a notification portal URL for the active {@link ShippingMode}.\n *\n * Swaps `-export` / `-import` host segments and sets `shipment_app` to\n * `shipfromnaija` (SFN) or `shiptonaija` (STN).\n * @param link\n * @param mode\n */\nexport function resolveNotificationLinkForMode(\n link: string | null | undefined,\n mode: ShippingMode,\n): string {\n const trimmed = asString(link).trim();\n if (!trimmed) {\n return trimmed;\n }\n\n try {\n const url = new URL(trimmed);\n url.searchParams.set('shipment_app', SHIPMENT_APP_BY_MODE[mode]);\n url.hostname = rewriteNotificationHostForMode(url.hostname, mode);\n return url.toString();\n } catch {\n return rewriteNotificationLinkFallback(trimmed, mode);\n }\n}\n\nfunction rewriteNotificationHostForMode(\n hostname: string,\n mode: ShippingMode,\n): string {\n if (mode === 'stn') {\n return hostname.replace(/-export/i, '-import');\n }\n return hostname.replace(/-import/i, '-export');\n}\n\nfunction rewriteNotificationLinkFallback(\n link: string,\n mode: ShippingMode,\n): string {\n let out = link.replace(\n /shipment_app=(?:shipfromnaija|shiptonaija)/gi,\n `shipment_app=${SHIPMENT_APP_BY_MODE[mode]}`,\n );\n\n if (!/shipment_app=/i.test(out)) {\n const joiner = out.includes('?') ? '&' : '?';\n out = `${out}${joiner}shipment_app=${SHIPMENT_APP_BY_MODE[mode]}`;\n }\n\n if (mode === 'stn') {\n return out.replace(/-export/gi, '-import');\n }\n return out.replace(/-import/gi, '-export');\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n FileReadModel,\n FileReadRequestModel,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport { asString } from '../http/wire';\nimport {\n FILE_READ_MULTIPLE_PARAM,\n FILE_READ_PATH,\n mapFileRead,\n mapFileReadList,\n} from './file.mapper';\n\n/**\n * File utility reads (`POST /file/read`).\n *\n * Primary preview path when a record stores a `file_ref` string (shipments,\n * tracking items, waybills, KYC, etc.). Body `{ ref }` → `data` with\n * `mime_type` and `base_64` for `<img>` / PDF viewers.\n *\n * Document catalog previews use {@link DocumentService.readById} instead\n * (`GET /public/document/read/{id}` → `data.file_ref.base_64`).\n *\n * @example\n * ```ts\n * const files = inject(FileService);\n *\n * files.read(item.file_ref).subscribe((res) => {\n * if (res.success) console.log(res.data?.base_64);\n * });\n *\n * files.readMultiple(waybillRef).subscribe((res) => {\n * console.log(res.data?.map((f) => f.mime_type));\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FileService {\n private readonly api = inject(ApiClient);\n\n /**\n * Resolve one file reference (`POST /file/read`, body `{ ref }`).\n *\n * @param ref - Storage / document UUID from `file_ref` on a record.\n * @returns Normalized envelope with mapped {@link FileReadModel}.\n */\n read(ref: string): Observable<ApiResponseModel<FileReadModel>> {\n return this.readByBody({ ref: asString(ref) });\n }\n\n /**\n * Resolve multiple files for one ref (`POST /file/read?multiple=yes`).\n *\n * E-commerce waybill flows may return several pages in `data[]`.\n *\n * @param ref - Storage reference token.\n * @returns Normalized envelope with mapped {@link FileReadModel}[].\n */\n readMultiple(ref: string): Observable<ApiResponseModel<FileReadModel[]>> {\n return this.readByBodyMultiple({ ref: asString(ref) });\n }\n\n /**\n * Resolve a file from an explicit request body.\n *\n * @param body - Wire body (`{ ref }`).\n * @returns Normalized envelope with mapped {@link FileReadModel}.\n */\n readByBody(\n body: FileReadRequestModel,\n ): Observable<ApiResponseModel<FileReadModel>> {\n return this.api\n .post<unknown, FileReadRequestModel>(FILE_READ_PATH, {\n ref: asString(body?.ref),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: res.data == null ? null : mapFileRead(res.data),\n })),\n );\n }\n\n /**\n * Multi-file variant of {@link readByBody}.\n *\n * @param body - Wire body (`{ ref }`).\n * @returns Normalized envelope with mapped {@link FileReadModel}[].\n */\n readByBodyMultiple(\n body: FileReadRequestModel,\n ): Observable<ApiResponseModel<FileReadModel[]>> {\n return this.api\n .post<unknown, FileReadRequestModel>(\n FILE_READ_PATH,\n { ref: asString(body?.ref) },\n { params: { multiple: FILE_READ_MULTIPLE_PARAM } },\n )\n .pipe(\n map((res) => ({\n ...res,\n data: res.data == null ? null : mapFileReadList(res.data),\n })),\n );\n }\n}\n","/**\n * File utility exports.\n */\nexport {\n FILE_READ_MULTIPLE_PARAM,\n FILE_READ_PATH,\n mapFileRead,\n mapFileReadList,\n} from './file.mapper';\nexport { FileService } from './file.service';\n","import type { ProductModel } from '@africanies/africanies-models';\n\nimport { mapApiJsonList } from '../http/map-api-json';\nimport {\n asBoolean,\n asNullableNumber,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n} from '../http/wire';\n\n/** Product read base path (relative to {@link AfricaniesSdkConfig.baseUrl}). */\nexport const PRODUCT_READ_PATH = '/product/read';\n\nfunction asNullableNumberArray(value: unknown): number[] | null {\n if (value == null || !Array.isArray(value)) {\n return null;\n }\n return mapArray(value, (entry) => asNumber(entry));\n}\n\n/**\n * Map a wire product into {@link ProductModel} (snake_case preserved).\n * @param raw - Single product object from the API.\n * @returns Normalized {@link ProductModel}.\n */\nexport function mapProduct(raw: unknown): ProductModel {\n const record = asRecord(raw) ?? {};\n\n return {\n id: asNumber(record['id']),\n account_id: asNullableNumber(record['account_id'] ?? record['accountId']),\n product_category_id: asNullableNumber(\n record['product_category_id'] ?? record['productCategoryId'],\n ),\n hs_code: asString(record['hs_code'] ?? record['hsCode']),\n hs_code_10: asNullableString(record['hs_code_10'] ?? record['hsCode10']),\n hs_code_8: asNullableString(record['hs_code_8'] ?? record['hsCode8']),\n hs_code_6: asNullableString(record['hs_code_6'] ?? record['hsCode6']),\n name: asString(record['name']),\n value: asNumber(record['value']),\n usage: asNumber(record['usage']),\n document_ids: asNullableNumberArray(\n record['document_ids'] ?? record['documentIds'],\n ),\n etw_ids: asNullableNumberArray(record['etw_ids'] ?? record['etwIds']),\n active: asBoolean(record['active']),\n is_external: asBoolean(record['is_external'] ?? record['isExternal']),\n deleted_at: asNullableString(record['deleted_at'] ?? record['deletedAt']),\n created_at: asNullableString(record['created_at'] ?? record['createdAt']),\n updated_at: asNullableString(record['updated_at'] ?? record['updatedAt']),\n document_details: mapArray(\n record['document_details'] ?? record['documentDetails'],\n (entry) => asString(entry),\n ),\n etw_document_details: mapArray(\n record['etw_document_details'] ?? record['etwDocumentDetails'],\n (entry) => asString(entry),\n ),\n zone_product_required_documents: mapApiJsonList(\n record['zone_product_required_documents'] ??\n record['zoneProductRequiredDocuments'],\n ),\n };\n}\n\n/**\n * Map a list (or single object) payload into {@link ProductModel}[].\n * @param raw - `data` payload from `/product/read/{id|all}`.\n * @returns Mapped product list.\n */\nexport function mapProductList(raw: unknown): ProductModel[] {\n return mapList(raw, mapProduct);\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { map, Observable } from 'rxjs';\n\nimport type {\n ApiResponseModel,\n ProductModel,\n ResourceId,\n} from '@africanies/africanies-models';\n\nimport { ApiClient } from '../http/api-client';\nimport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from '../http/resource-path';\nimport { mapProduct, mapProductList, PRODUCT_READ_PATH } from './product.mapper';\n\n/** In-memory GET cache TTL for product reference dumps / by-id (5 minutes). */\nconst PRODUCT_CACHE_TTL_MS = 5 * 60_000;\n\n/**\n * Product utility reads (`GET /product/read/{id?}`).\n *\n * Uses the AFRICANIES {@link ResourceId} convention:\n * - `null` (default) → paginated page\n * - `'all'` → full list\n * - `number` → single {@link ProductModel}\n *\n * @example\n * ```ts\n * const products = inject(ProductService);\n *\n * products.readPage({ page: 1 }).subscribe((res) => {\n * console.log(res.data, res.pagination);\n * });\n * products.readAll().subscribe((res) => console.log(res.data?.[0]?.hs_code));\n * products.readById(6280).subscribe((res) => console.log(res.data?.name));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ProductService {\n private readonly api = inject(ApiClient);\n\n /** Paginated product page — {@link ResourceId} `null`. */\n read(\n id?: null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel[]>>;\n\n /** Full product list — {@link ResourceId} `'all'`. */\n read(\n id: 'all',\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel[]>>;\n\n /** Single product — {@link ResourceId} number. */\n read(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel>>;\n\n read(\n id: ResourceId = null,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel | ProductModel[]>> {\n return this.api\n .get<unknown>(buildResourcePath(PRODUCT_READ_PATH, id), {\n toast: false,\n params: buildResourceQueryParams(id, params),\n cacheTtlMs: resourceCacheTtlMs(id, PRODUCT_CACHE_TTL_MS),\n })\n .pipe(\n map((res) => ({\n ...res,\n data: mapResourcePayload(id, res.data, mapProduct, mapProductList),\n })),\n );\n }\n\n /**\n * Paginated page — alias for {@link read}(`null`, params).\n * @param params\n */\n readPage(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel[]>> {\n return this.read(null, params);\n }\n\n /**\n * Full list — alias for {@link read}(`'all'`).\n * @param params\n */\n readAll(\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel[]>> {\n return this.read('all', params);\n }\n\n /**\n * Single record — alias for {@link read}(id).\n * @param id\n * @param params\n */\n readById(\n id: number,\n params?: ResourceQueryParams,\n ): Observable<ApiResponseModel<ProductModel>> {\n return this.read(id, params);\n }\n}\n","/**\n * Product utility exports.\n */\n\nexport {\n mapProduct,\n mapProductList,\n PRODUCT_READ_PATH,\n} from './product.mapper';\nexport { ProductService } from './product.service';\n","import type {\n FilterFieldModel,\n FilterOptionsSource,\n ModuleFilterConfigModel,\n} from '@africanies/africanies-models';\nimport type { ShipmentMethodModel, WarehouseModel } from '@africanies/africanies-models';\n\nimport { asArray } from '../http/wire';\n\n/** One select row for filter drawer `optionLists` (wire value + label). */\nexport interface FilterSelectOption {\n value: string;\n label: string;\n /** Optional leading text/emoji (e.g. country flag emoji) in select rows. */\n prefixText?: string;\n /** Optional leading image URL (e.g. {@link countryFlagUrl} flag CDN). */\n prefixImageUrl?: string;\n}\n\n/** Host bag keyed by {@link FilterFieldModel.key}. */\nexport type FilterOptionLists = Record<string, FilterSelectOption[]>;\n\n/** Select field with a required, non-static {@link FilterOptionsSource}. */\nexport type ResolvableSelectField = Omit<FilterFieldModel, 'optionsSource' | 'type'> & {\n type: 'select';\n optionsSource: Exclude<FilterOptionsSource, 'static'>;\n};\n\n/**\n * Select fields that declare a non-static {@link FilterOptionsSource}.\n *\n * @param config - Module filter schema.\n * @returns Fields that need async option resolution.\n */\nexport function collectResolvableSelectFields(\n config: ModuleFilterConfigModel | null | undefined,\n): ResolvableSelectField[] {\n return asArray<FilterFieldModel>(config?.fields).filter(\n (field): field is ResolvableSelectField =>\n field.type === 'select' &&\n field.optionsSource != null &&\n field.optionsSource !== 'static',\n );\n}\n\n/**\n * Unique {@link FilterOptionsSource} values referenced by a config (excluding static).\n *\n * @param config - Module filter schema.\n */\nexport function collectFilterOptionsSources(\n config: ModuleFilterConfigModel,\n): FilterOptionsSource[] {\n const sources = new Set<FilterOptionsSource>();\n for (const field of collectResolvableSelectFields(config)) {\n sources.add(field.optionsSource);\n }\n return [...sources];\n}\n\n/**\n * Map {@link WarehouseModel}[] into filter select options (`value` = id string).\n *\n * @param rows - Warehouses from {@link WarehouseService.readAll}.\n */\nexport function mapWarehouseFilterOptions(\n rows: WarehouseModel[] | null | undefined,\n): FilterSelectOption[] {\n if (!rows?.length) {\n return [];\n }\n return rows.map((row) => ({\n value: String(row.id),\n label: row.name,\n }));\n}\n\n/**\n * Map {@link ShipmentMethodModel}[] into filter select options.\n *\n * @param rows - Methods from {@link ShipmentMethodService.readAll}.\n */\nexport function mapShipmentMethodFilterOptions(\n rows: ShipmentMethodModel[] | null | undefined,\n): FilterSelectOption[] {\n if (!rows?.length) {\n return [];\n }\n return rows.map((row) => ({\n value: String(row.id),\n label: row.name,\n }));\n}\n\n/**\n * Merge SDK-resolved lists with host overrides (host wins per field key).\n *\n * @param resolved - Output from {@link FilterOptionsResolver.resolve}.\n * @param overrides - Host catalogs (e.g. manifests without a built-in service).\n */\nexport function mergeFilterOptionLists(\n resolved: FilterOptionLists,\n overrides?: FilterOptionLists | null,\n): FilterOptionLists {\n if (!overrides) {\n return { ...resolved };\n }\n return { ...resolved, ...overrides };\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { forkJoin, map, Observable, of } from 'rxjs';\n\nimport type {\n FilterFieldModel,\n FilterOptionsSource,\n ModuleFilterConfigModel,\n} from '@africanies/africanies-models';\n\nimport { ShipmentMethodService } from '../shipment-method/shipment-method.service';\nimport { WarehouseService } from '../warehouse/warehouse.service';\nimport {\n collectResolvableSelectFields,\n type FilterOptionLists,\n type FilterSelectOption,\n mapShipmentMethodFilterOptions,\n mapWarehouseFilterOptions,\n} from './filter-options.mapper';\n\n/**\n * Built-in {@link FilterOptionsSource} keys wired to SDK catalog services.\n *\n * `shipmentManifests` has no built-in service yet — resolve to `[]` and pass\n * host `optionLists` for those field keys.\n */\nconst SDK_FILTER_OPTIONS_SOURCES = new Set<FilterOptionsSource>([\n 'warehouses',\n 'shipmentMethods',\n]);\n\n/**\n * Resolves filter drawer select options from built-in SDK catalog services.\n *\n * Prefer opening {@link FilterDrawerService} immediately — the drawer lazy-loads\n * per field via {@link resolveField}. {@link resolve} remains for bulk prefetch.\n *\n * @example\n * ```ts\n * const resolver = inject(FilterOptionsResolver);\n *\n * filterDrawer.open({\n * config: updateShipmentsFilterConfig,\n * optionLists: { shipment_manifest_id: hostManifests },\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FilterOptionsResolver {\n private readonly warehouses = inject(WarehouseService);\n private readonly shipmentMethods = inject(ShipmentMethodService);\n\n /**\n * Resolve SDK-backed options for one select field (lazy drawer load).\n *\n * @param field - Filter schema field with `optionsSource`.\n * @returns Select rows or an error when the catalog HTTP call fails.\n */\n resolveField(field: FilterFieldModel): Observable<FilterSelectOption[]> {\n if (\n field.type !== 'select' ||\n field.optionsSource == null ||\n field.optionsSource === 'static'\n ) {\n return of(this.staticFieldOptions(field));\n }\n if (!SDK_FILTER_OPTIONS_SOURCES.has(field.optionsSource)) {\n return of([]);\n }\n return this.fetchSource(field.optionsSource);\n }\n\n /**\n * Resolve all SDK-backed select options for a module config (bulk prefetch).\n *\n * @param config - Module filter schema.\n * @returns `optionLists` keyed by field.key.\n */\n resolve(config: ModuleFilterConfigModel): Observable<FilterOptionLists> {\n const fields = collectResolvableSelectFields(config);\n if (fields.length === 0) {\n return of({});\n }\n\n const fetched = new Set<FilterOptionsSource>();\n const fetches: Record<string, Observable<FilterOptionLists>> = {};\n\n for (const field of fields) {\n const source = field.optionsSource;\n if (!SDK_FILTER_OPTIONS_SOURCES.has(source) || fetched.has(source)) {\n continue;\n }\n fetched.add(source);\n fetches[source] = this.fetchSource(source).pipe(\n map((options) => {\n const lists: FilterOptionLists = {};\n for (const f of fields) {\n if (f.optionsSource === source) {\n lists[f.key] = options;\n }\n }\n return lists;\n }),\n );\n }\n\n const keys = Object.keys(fetches) as FilterOptionsSource[];\n if (keys.length === 0) {\n return of({});\n }\n\n return forkJoin(\n keys.reduce(\n (acc, key) => {\n acc[key] = fetches[key]!;\n return acc;\n },\n {} as Record<FilterOptionsSource, Observable<FilterOptionLists>>,\n ),\n ).pipe(\n map((parts) =>\n keys.reduce<FilterOptionLists>((merged, key) => {\n Object.assign(merged, parts[key]);\n return merged;\n }, {}),\n ),\n );\n }\n\n private staticFieldOptions(field: FilterFieldModel): FilterSelectOption[] {\n return (field.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }));\n }\n\n private fetchSource(\n source: FilterOptionsSource,\n ): Observable<FilterSelectOption[]> {\n switch (source) {\n case 'warehouses':\n return this.warehouses.readAll().pipe(\n map((res) =>\n res.success ? mapWarehouseFilterOptions(res.data) : [],\n ),\n );\n case 'shipmentMethods':\n return this.shipmentMethods.readAll().pipe(\n map((res) =>\n res.success ? mapShipmentMethodFilterOptions(res.data) : [],\n ),\n );\n default:\n return of([]);\n }\n }\n}\n","import { InjectionToken, type Type } from '@angular/core';\n\nimport type { Observable } from 'rxjs';\n\nimport type { OverlayRouteConfig } from './overlay-route.types';\n\n/**\n * Handle returned by modal/drawer openers so route sync can close and\n * observe dismissal without depending on `@africanies/africanies-ui`.\n *\n * @typeParam TResult - Value passed to `close(result)` by the overlay content.\n */\nexport interface OverlayHandle<TResult = unknown> {\n /**\n * Closes the overlay, optionally with a result.\n *\n * @param result - Value forwarded to `afterClosed` subscribers.\n */\n close(result?: TResult): void;\n\n /**\n * Emits once when the overlay finishes closing, then completes.\n */\n afterClosed(): Observable<TResult | undefined>;\n}\n\n/**\n * Minimal opener contract implemented by UI `ModalService` / `DrawerService`.\n *\n * Defined in `africanies-core` (and provided from `africanies-ui`) so route-driven\n * overlays do not create a circular package dependency.\n */\nexport interface OverlayOpener {\n /**\n * Opens `component` in an overlay host.\n *\n * @param component - Standalone component type to instantiate.\n * @param config - Optional data bag (other query params) and close behavior.\n */\n open<TData = unknown, TResult = unknown>(\n component: Type<unknown>,\n config?: { data?: TData; dismissible?: boolean },\n ): OverlayHandle<TResult>;\n}\n\n/**\n * Optional token for the app's modal opener (provided by `@africanies/africanies-ui`).\n *\n * {@link RouteOverlayService} injects this with `{ optional: true }` so apps\n * can register route overlays before UI is wired — opens are skipped until\n * a provider exists.\n */\nexport const MODAL_SERVICE = new InjectionToken<OverlayOpener>(\n 'AFRICANIES_MODAL_SERVICE',\n);\n\n/**\n * Optional token for the app's drawer opener (provided by `@africanies/africanies-ui`).\n *\n * Same optional pattern as {@link MODAL_SERVICE}.\n */\nexport const DRAWER_SERVICE = new InjectionToken<OverlayOpener>(\n 'AFRICANIES_DRAWER_SERVICE',\n);\n\n/**\n * DI token for the list of {@link OverlayRouteConfig} registered via\n * {@link provideOverlayRoutes}.\n */\nexport const OVERLAY_ROUTE_CONFIGS = new InjectionToken<OverlayRouteConfig[]>(\n 'AFRICANIES_OVERLAY_ROUTE_CONFIGS',\n);\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRoute, ParamMap, Router } from '@angular/router';\n\nimport { Subscription } from 'rxjs';\n\nimport type { OverlayRouteConfig } from './overlay-route.types';\nimport {\n DRAWER_SERVICE,\n MODAL_SERVICE,\n OVERLAY_ROUTE_CONFIGS,\n type OverlayHandle,\n} from './overlay-tokens';\n\ninterface OpenOverlayState {\n /** Query param value that opened this overlay. */\n value: string;\n /** Active handle from modal/drawer opener. */\n handle: OverlayHandle;\n /** True while close was triggered by URL (back button) — skip re-navigate. */\n closingFromUrl: boolean;\n /** Subscription to afterClosed for cleanup. */\n afterClosedSub: Subscription;\n}\n\n/**\n * Keeps query-param state in sync with modal/drawer overlays.\n *\n * Instantiated eagerly via {@link provideOverlayRoutes}'s `provideAppInitializer`\n * so a hard refresh with `?modal=…` already present reopens the overlay.\n *\n * Bidirectional sync:\n * - Param appears / matches a route → open (passing sibling query params as data)\n * - Param removed (e.g. browser back) → close without navigating again\n * - Overlay closed by UI → strip the trigger param with `queryParamsHandling: 'merge'`\n *\n * Modal/drawer implementations live in `@africanies/africanies-ui` and are injected through\n * {@link MODAL_SERVICE} / {@link DRAWER_SERVICE} to avoid a circular dependency.\n */\n@Injectable()\nexport class RouteOverlayService {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly configs = inject(OVERLAY_ROUTE_CONFIGS);\n private readonly modal = inject(MODAL_SERVICE, { optional: true });\n private readonly drawer = inject(DRAWER_SERVICE, { optional: true });\n\n private readonly openByKey = new Map<string, OpenOverlayState>();\n\n constructor() {\n // Start immediately — provideAppInitializer only forces construction.\n this.route.queryParamMap.subscribe((params) => this.onQueryParams(params));\n }\n\n private onQueryParams(params: ParamMap): void {\n for (const config of this.configs) {\n this.syncConfig(config, params);\n }\n }\n\n private syncConfig(config: OverlayRouteConfig, params: ParamMap): void {\n const value = params.get(config.paramKey);\n const current = this.openByKey.get(config.paramKey);\n\n if (value === null || value === '') {\n if (current) {\n current.closingFromUrl = true;\n current.handle.close();\n this.teardown(config.paramKey);\n }\n return;\n }\n\n const entry = config.routes[value];\n if (!entry) {\n return;\n }\n\n // Already showing the same route value — leave it alone.\n if (current?.value === value) {\n return;\n }\n\n if (current) {\n current.closingFromUrl = true;\n current.handle.close();\n this.teardown(config.paramKey);\n }\n\n const opener = entry.overlay === 'modal' ? this.modal : this.drawer;\n if (!opener) {\n // UI package has not provided the opener yet — skip until it does.\n return;\n }\n\n // Sibling query params (e.g. id=123) become OVERLAY_DATA in africanies-ui.\n const data = this.siblingParams(params, config.paramKey);\n const handle = opener.open(entry.component, { data });\n\n const state: OpenOverlayState = {\n value,\n handle,\n closingFromUrl: false,\n afterClosedSub: handle.afterClosed().subscribe(() => {\n const open = this.openByKey.get(config.paramKey);\n if (!open || open.handle !== handle) {\n return;\n }\n const fromUrl = open.closingFromUrl;\n this.teardown(config.paramKey);\n if (!fromUrl) {\n // Manual / UI close — drop the trigger param, keep other params.\n void this.router.navigate([], {\n queryParams: { [config.paramKey]: null },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n }),\n };\n\n this.openByKey.set(config.paramKey, state);\n }\n\n private siblingParams(\n params: ParamMap,\n excludeKey: string,\n ): Record<string, string> {\n const data: Record<string, string> = {};\n params.keys.forEach((key) => {\n if (key === excludeKey) {\n return;\n }\n const value = params.get(key);\n if (value !== null) {\n data[key] = value;\n }\n });\n return data;\n }\n\n private teardown(paramKey: string): void {\n const current = this.openByKey.get(paramKey);\n if (!current) {\n return;\n }\n current.afterClosedSub.unsubscribe();\n this.openByKey.delete(paramKey);\n }\n}\n","import {\n type EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideAppInitializer,\n} from '@angular/core';\n\nimport type { OverlayRouteConfig } from './overlay-route.types';\nimport { OVERLAY_ROUTE_CONFIGS } from './overlay-tokens';\nimport { RouteOverlayService } from './route-overlay.service';\n\n/**\n * Registers query-param → overlay maps and eagerly starts {@link RouteOverlayService}.\n *\n * Call beside {@link provideAfricaniesSdk} in `app.config.ts`. Modal/drawer openers\n * must still be provided by `@africanies/africanies-ui` (`MODAL_SERVICE` / `DRAWER_SERVICE`).\n *\n * @param configs - One or more param-key namespaces (e.g. `modal` and `drawer`).\n * @returns Environment providers including an app initializer.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { provideRouter, Routes } from '@angular/router';\n * import {\n * provideAfricaniesSdk,\n * provideOverlayRoutes,\n * } from '@africanies/africanies-core';\n * import { EditShipmentModal } from './edit-shipment.modal';\n *\n * export const appConfig = {\n * providers: [\n * provideAfricaniesSdk({ baseUrl: 'https://api.example.com' }),\n * provideRouter(routes),\n * provideOverlayRoutes([\n * {\n * paramKey: 'modal',\n * routes: {\n * 'edit-shipment': {\n * component: EditShipmentModal,\n * overlay: 'modal',\n * },\n * },\n * },\n * ]),\n * // From @africanies/africanies-ui — binds MODAL_SERVICE / DRAWER_SERVICE\n * // provideAfricaniesOverlays(),\n * ],\n * };\n *\n * // Template — open via query params (refresh with the same URL reopens):\n * // <a routerLink=\".\" [queryParams]=\"{ modal: 'edit-shipment', id: row.id }\">\n * // Edit\n * // </a>\n * ```\n */\nexport function provideOverlayRoutes(\n configs: OverlayRouteConfig[],\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: OVERLAY_ROUTE_CONFIGS, useValue: configs },\n RouteOverlayService,\n provideAppInitializer(() => {\n // Force construction so queryParamMap subscription starts at bootstrap\n // (including hard refresh when the param is already present).\n inject(RouteOverlayService);\n }),\n ]);\n}\n","/**\n * Copy plain text to the system clipboard.\n *\n * Prefers `navigator.clipboard.writeText`. Falls back to a temporary\n * `textarea` + `document.execCommand('copy')` when the Clipboard API is\n * missing or throws (older browsers, some embedded / non-secure contexts).\n *\n * Safe to call during SSR — returns `false` when `document` is unavailable.\n *\n * @param value - Text to place on the clipboard.\n * @returns `true` when the write succeeded; `false` otherwise.\n *\n * @example\n * ```ts\n * const ok = await copyToClipboard(iconName);\n * if (ok) {\n * toast.success(`Copied “${iconName}”`);\n * }\n * ```\n */\nexport async function copyToClipboard(value: string): Promise<boolean> {\n if (typeof document === 'undefined') {\n return false;\n }\n\n try {\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(value);\n return true;\n }\n } catch {\n // Fall through to the legacy execCommand path.\n }\n\n try {\n const el = document.createElement('textarea');\n el.value = value;\n el.setAttribute('readonly', '');\n el.style.position = 'fixed';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.select();\n const ok = document.execCommand('copy');\n document.body.removeChild(el);\n return ok;\n } catch {\n return false;\n }\n}\n","/** Value that can be serialized into a CSV cell. */\nexport type CsvCellValue = string | number | boolean | null | undefined;\n\n/**\n * Options for {@link downloadCsv}.\n */\nexport interface DownloadCsvOptions {\n /** Download filename, including `.csv`. */\n filename: string;\n /** Optional header row. */\n headers?: readonly CsvCellValue[];\n /** Data rows. Each inner array is one CSV record. */\n rows: readonly (readonly CsvCellValue[])[];\n /**\n * Prefix a UTF-8 BOM so Excel opens the file as UTF-8. Defaults to `true`.\n */\n bom?: boolean;\n}\n\n/**\n * Escape a single CSV field (RFC 4180).\n *\n * Quotes fields that contain commas, quotes, or line breaks. `null` /\n * `undefined` become an empty cell.\n *\n * @param value - Cell value.\n */\nexport function csvCell(value: CsvCellValue): string {\n const text = value == null ? '' : String(value);\n if (/[\",\\n\\r]/.test(text)) {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n }\n return text;\n}\n\n/**\n * Build a CSV document string (optional BOM + header + rows).\n *\n * @param options - Headers, rows, and BOM flag (filename is ignored).\n */\nexport function toCsvString(\n options: Pick<DownloadCsvOptions, 'headers' | 'rows' | 'bom'>,\n): string {\n const lines: string[] = [];\n if (options.headers?.length) {\n lines.push(options.headers.map(csvCell).join(','));\n }\n for (const row of options.rows) {\n lines.push(row.map(csvCell).join(','));\n }\n const body = lines.length ? `${lines.join('\\n')}\\n` : '';\n const bom = options.bom === false ? '' : '\\uFEFF';\n return `${bom}${body}`;\n}\n\n/**\n * Download a CSV file in the browser.\n *\n * Hosts supply filename, headers, and already-mapped row values. Safe during\n * SSR — returns `false` when `document` is unavailable.\n *\n * @param options - Filename, headers, and row cells.\n * @returns `true` when the download was triggered.\n *\n * @example\n * ```ts\n * downloadCsv({\n * filename: 'warehouses.csv',\n * headers: ['Name', 'Status'],\n * rows: warehouses.map((row) => [\n * row.name,\n * row.active ? 'Active' : 'In-Active',\n * ]),\n * });\n * ```\n */\nexport function downloadCsv(options: DownloadCsvOptions): boolean {\n if (typeof document === 'undefined' || typeof URL === 'undefined') {\n return false;\n }\n\n const blob = new Blob([toCsvString(options)], {\n type: 'text/csv;charset=utf-8',\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = options.filename;\n link.rel = 'noopener';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n return true;\n}\n","/**\n * Browser helpers (clipboard, CSV download, etc.) shared across host apps.\n */\nexport { copyToClipboard } from './copy-to-clipboard';\nexport {\n csvCell,\n type CsvCellValue,\n downloadCsv,\n type DownloadCsvOptions,\n toCsvString,\n} from './download-csv';\n","// Config\nexport {\n AFRICANIES_SDK_CONFIG,\n type AfricaniesSdkConfig,\n type AfricaniesSdkHttpToasts,\n} from './lib/config/africanies-sdk.config';\nexport { provideAfricaniesSdk } from './lib/config/provide-africanies-sdk';\n\n// Auth\nexport {\n AUTH_FORGOT_PASSWORD_PATH,\n AuthService,\n AuthTokenService,\n isValidEmail,\n} from './lib/auth';\n\n// Shipping mode\nexport { shipmentModeInterceptor } from './lib/shipping/shipment-mode.interceptor';\nexport {\n asShippingMode,\n SHIPPING_MODE_OVERRIDE,\n withShippingMode,\n} from './lib/shipping/shipping-mode.context';\nexport { type ShippingModeChangeGuard,ShippingModeService } from './lib/shipping/shipping-mode.service';\n\n// HTTP\nexport { ApiClient, type ApiRequestOptions } from './lib/http/api-client';\nexport { formatApiErrorMessage } from './lib/http/api-error-message';\nexport { authInterceptor } from './lib/http/auth.interceptor';\nexport { HttpResponseCache } from './lib/http/http-cache';\nexport { httpToastInterceptor } from './lib/http/http-toast.interceptor';\nexport { mapApiJsonList, mapApiJsonValue } from './lib/http/map-api-json';\nexport { normalize, normalizePagination, unwrapLaravelPaginator } from './lib/http/normalize';\nexport {\n type AfricaniesHttpClientOptions,\n provideAfricaniesHttpClient,\n} from './lib/http/provide-africanies-http-client';\nexport {\n buildResourcePath,\n buildResourceQueryParams,\n mapResourcePayload,\n resourceCacheTtlMs,\n type ResourceQueryParams,\n} from './lib/http/resource-path';\nexport {\n AFRICANIES_HTTP_TOAST,\n type AfricaniesHttpToastHandler,\n TOAST_HTTP_OPTIONS,\n type ToastHttpOptions,\n withToast,\n} from './lib/http/toast-http.context';\nexport {\n fieldErrorsMap,\n isLaravelValidationBag,\n joinApiErrorMessages,\n mapLaravelValidationBag,\n} from './lib/http/validation-bag';\nexport {\n asArray,\n asBoolean,\n asNullableBoolean,\n asNullableFlag01,\n asNullableNumber,\n asNullableString,\n asNumber,\n asRecord,\n asString,\n mapArray,\n mapList,\n toFlag01,\n} from './lib/http/wire';\n\n// Query defaults (plain object — no @tanstack dependency)\nexport {\n type ListFetchKind,\n listFetchKind,\n type ListFetchReason,\n} from './lib/query/list-fetch-kind';\nexport {\n type AfricaniesQueryClientDefaults,\n createAfricaniesQueryClientDefaults,\n provideAfricaniesQueryDefaults,\n} from './lib/query/provide-africanies-query-defaults';\n\n// Mode config\nexport {\n mapModeConfigData,\n MODE_CONFIG_PATH,\n resolveModeRegionConfig,\n} from './lib/mode/mode-config.mapper';\nexport { ModeConfigService } from './lib/mode/mode-config.service';\nexport { provideModeConfig } from './lib/mode/provide-mode-config';\n\n// Country utility\nexport {\n COUNTRY_FLAG_CDN_BASE,\n COUNTRY_READ_PATH,\n type CountryFlagFormat,\n countryFlagUrl,\n type CountryFlagUrlOptions,\n type CountrySelectOption,\n CountryService,\n mapCountry,\n mapCountryList,\n mapCountrySelectOptions,\n mapCountryState,\n} from './lib/country';\n\n// Public document catalog\nexport {\n DOCUMENT_READ_PATH,\n DocumentService,\n mapDocument,\n mapDocumentList,\n} from './lib/document';\n\n// Public plan catalog\nexport {\n mapPlan,\n mapPlanList,\n mapPlanPackage,\n PLAN_READ_PATH,\n PlanService,\n} from './lib/plan';\n\n// Public service catalog\nexport {\n mapService,\n mapServiceList,\n SERVICE_READ_PATH,\n ServiceService,\n} from './lib/service';\n\n// Currencies\nexport {\n CURRENCY_CREATE_PATH,\n CURRENCY_DELETE_PATH,\n CURRENCY_READ_PATH,\n CURRENCY_UPDATE_PATH,\n CurrencyService,\n mapCurrency,\n mapCurrencyList,\n mapCurrencyPaymentMethod,\n mapCurrencyPaymentMethodPivot,\n toCurrencyCreateBody,\n toCurrencyDeleteBody,\n toCurrencyFlag01,\n toCurrencyUpdateBody,\n} from './lib/currency';\n\n// Payment methods (checkout processors)\nexport {\n mapPaymentMethod,\n mapPaymentMethodCurrency,\n mapPaymentMethodList,\n PAYMENT_METHOD_READ_PATH,\n PAYMENT_METHOD_UPDATE_PATH,\n PaymentMethodService,\n toPaymentMethodFlag01,\n toPaymentMethodUpdateBody,\n} from './lib/payment-method';\n\n// Shipment methods / carriers\nexport {\n mapShipmentMethod,\n mapShipmentMethodList,\n mapShipmentMethodZoneLink,\n mapShipmentMethodZonePage,\n mapShipmentZone,\n SHIPMENT_METHOD_READ_PATH,\n ShipmentMethodService,\n} from './lib/shipment-method';\n\n// Warehouses\nexport {\n mapWarehouse,\n mapWarehouseCountry,\n mapWarehouseList,\n mapWarehouseState,\n WAREHOUSE_READ_PATH,\n WarehouseService,\n} from './lib/warehouse';\n\n// Zones\nexport {\n mapZone,\n mapZoneList,\n ZONE_READ_PATH,\n ZoneService,\n} from './lib/zone';\n\n// Current user (bare /user payload — auth required)\nexport {\n mapUser,\n mapUserAccountManager,\n mapUserBusinessAccount,\n mapUserCountry,\n mapUserCountryState,\n mapUserGatewayPayload,\n mapUserPaymentPayload,\n mapUserPlan,\n mapUserPlanPackage,\n mapUserStateLabel,\n mapUserSubscription,\n USER_CHANGE_PASSWORD_PATH,\n USER_LOGOUT_FROM_ALL_SESSIONS_PATH,\n USER_PATH,\n UserService,\n} from './lib/user';\n\n// User notifications (auth required)\nexport {\n mapNotification,\n mapNotificationInboxItem,\n mapNotificationList,\n mapNotificationPayload,\n NOTIFICATION_READ_PATH,\n NOTIFICATION_UPDATE_PATH,\n NotificationService,\n resolveNotificationLinkForMode,\n} from './lib/notification';\n\n// File reads (POST /file/read — may require auth)\nexport {\n FILE_READ_MULTIPLE_PARAM,\n FILE_READ_PATH,\n FileService,\n mapFileRead,\n mapFileReadList,\n} from './lib/file';\n\n// Products\nexport {\n mapProduct,\n mapProductList,\n PRODUCT_READ_PATH,\n ProductService,\n} from './lib/product';\n\n// Filter select options (SDK catalog → drawer optionLists)\nexport {\n collectFilterOptionsSources,\n collectResolvableSelectFields,\n type FilterOptionLists,\n FilterOptionsResolver,\n type FilterSelectOption,\n mapShipmentMethodFilterOptions,\n mapWarehouseFilterOptions,\n mergeFilterOptionLists,\n} from './lib/filters';\n\n// Route-driven overlays (openers provided by africanies-ui)\nexport type {\n OverlayRouteConfig,\n OverlayRouteEntry,\n} from './lib/overlay/overlay-route.types';\nexport {\n DRAWER_SERVICE,\n MODAL_SERVICE,\n OVERLAY_ROUTE_CONFIGS,\n type OverlayHandle,\n type OverlayOpener,\n} from './lib/overlay/overlay-tokens';\nexport { provideOverlayRoutes } from './lib/overlay/provide-overlay-routes';\nexport { RouteOverlayService } from './lib/overlay/route-overlay.service';\n\n// Browser utilities\nexport { copyToClipboard } from './lib/browser';\nexport {\n csvCell,\n type CsvCellValue,\n downloadCsv,\n type DownloadCsvOptions,\n toCsvString,\n} from './lib/browser';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["asShippingMode","map","tap"],"mappings":"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"}