uni-manager 0.0.12 → 0.0.14

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.
@@ -175,6 +175,160 @@ async function executeImage(url, init) {
175
175
  return URL.createObjectURL(blob);
176
176
  }
177
177
 
178
+ class UniLocaleManager {
179
+ /* ------------------------------------------------------------------------------- */
180
+ /* ----------------------------------- Config ------------------------------------ */
181
+ /* ------------------------------------------------------------------------------- */
182
+ /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */
183
+ static { this.locale = 'en-US'; }
184
+ /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */
185
+ static { this.prefix = ''; }
186
+ /* ------------------------------------------------------------------------------- */
187
+ /* ------------------------------------ Store ------------------------------------ */
188
+ /* ------------------------------------------------------------------------------- */
189
+ /** Store privato (Subject) */
190
+ static { this.store = new BehaviorSubject({}); }
191
+ /** Store pubblico (Observable) */
192
+ static { this.store$ = this.store.asObservable(); }
193
+ /** Ottiene il dizionario attuale senza sottoscrizione */
194
+ static get currentValue() {
195
+ return this.store.getValue();
196
+ }
197
+ /* ------------------------------------------------------------------------------- */
198
+ /* -------------------------------- Metodi: setup -------------------------------- */
199
+ /* ------------------------------------------------------------------------------- */
200
+ /**
201
+ * Inizializza la configurazione di rete del manager.
202
+ * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.
203
+ */
204
+ static setup(locale, prefix) {
205
+ this.locale = locale ?? 'en-US';
206
+ this.prefix = prefix;
207
+ }
208
+ static addTranslations(translations) {
209
+ this.store.next(translations ?? {});
210
+ }
211
+ /* ------------------------------------------------------------------------------- */
212
+ /* ----------------------------- Metodi: traduzioni ------------------------------ */
213
+ /* ------------------------------------------------------------------------------- */
214
+ /**
215
+ * Traduce una label in base al dizionario caricato.
216
+ * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.
217
+ */
218
+ static translate(label, prefix = 'lbl', interpolateParams, translations) {
219
+ const translationsObj = translations ?? this.currentValue;
220
+ // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola
221
+ const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1);
222
+ const finalKey = `${this.prefix}${prefix}${capitalizedLabel}`;
223
+ // Cerca la chiave in minuscolo (standardizzazione)
224
+ const finalKeyLower = finalKey.toLowerCase();
225
+ let translation = translationsObj?.[finalKeyLower];
226
+ // Log e Fallback se la traduzione manca
227
+ if (translation === undefined) {
228
+ console.warn(`Translation missing for key: ${finalKeyLower}`);
229
+ return `🔑 ${finalKey}`;
230
+ }
231
+ // Interpolazione variabili (es: "Ciao {{name}}")
232
+ if (interpolateParams) {
233
+ for (const [key, value] of Object.entries(interpolateParams)) {
234
+ const displayValue = value instanceof Date ? value.toLocaleDateString(this.locale) : String(value);
235
+ translation = translation.replaceAll(`{{${key}}}`, displayValue);
236
+ }
237
+ }
238
+ return translation;
239
+ }
240
+ /* ------------------------------------------------------------------------------- */
241
+ /* ------------------------------- Metodi: numeri -------------------------------- */
242
+ /* ------------------------------------------------------------------------------- */
243
+ /**
244
+ * Converte un valore numerico in una stringa formattata secondo il locale impostato.
245
+ * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.
246
+ */
247
+ static toNumberString(value, decimal) {
248
+ return new Intl.NumberFormat(this.locale, {
249
+ useGrouping: true,
250
+ minimumFractionDigits: decimal,
251
+ maximumFractionDigits: decimal,
252
+ numberingSystem: 'latn',
253
+ }).format(value);
254
+ }
255
+ /* ------------------------------------------------------------------------------- */
256
+ /* -------------------------------- Metodi: date --------------------------------- */
257
+ /* ------------------------------------------------------------------------------- */
258
+ /**
259
+ * Formatta una data o una stringa in base al locale corrente.
260
+ * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.
261
+ */
262
+ static toDate(date, mode = 'full', force) {
263
+ const dt = new Date(date);
264
+ // Controllo: validità data
265
+ if (isNaN(dt.getTime())) {
266
+ console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);
267
+ return '';
268
+ }
269
+ // Controllo: locale da forzare
270
+ const locale = force && this.locale.startsWith(force.oldLang) ? force.newLocale : this.locale;
271
+ switch (mode) {
272
+ case 'date':
273
+ return dt.toLocaleDateString(locale);
274
+ case 'time':
275
+ return dt.toLocaleTimeString(locale);
276
+ case 'full':
277
+ default:
278
+ return dt.toLocaleString(locale);
279
+ }
280
+ }
281
+ }
282
+
283
+ /* eslint-disable @typescript-eslint/no-explicit-any */
284
+ class UniToastManager {
285
+ /* ------------------------------------------------------------------------------- */
286
+ /* -------------------------------- Metodi: setup -------------------------------- */
287
+ /* ------------------------------------------------------------------------------- */
288
+ /**
289
+ * Inizializza il manager con una serie di operazioni
290
+ */
291
+ static setup(operations) {
292
+ this.manager = operations;
293
+ }
294
+ /* ------------------------------------------------------------------------------- */
295
+ /* -------------------------------- Metodi: show --------------------------------- */
296
+ /* ------------------------------------------------------------------------------- */
297
+ /**
298
+ * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.
299
+ */
300
+ static show(label, interpolateParams, operation = 'success') {
301
+ /* Messaggio tradotto */
302
+ const msg = UniLocaleManager.translate(label, 'toast', interpolateParams);
303
+ this.manager[operation](msg);
304
+ }
305
+ /**
306
+ * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.
307
+ */
308
+ static showHttp(res, config) {
309
+ const { label, params, resParams, resLengthParams, formatters } = config;
310
+ /* Parametri statici di base */
311
+ const allParams = { ...params };
312
+ /* Estrazione parametri dalla risposta (se esiste ed è un oggetto) */
313
+ if (res && typeof res === 'object') {
314
+ resParams?.forEach((key) => {
315
+ if (!(key in res))
316
+ return;
317
+ const rawValue = res[key];
318
+ // Se esiste un formatter per questa chiave lo si usa, altrimenti valore grezzo
319
+ allParams[key] = formatters?.[key] ? formatters[key](rawValue) : rawValue;
320
+ });
321
+ }
322
+ /* Conteggio array */
323
+ if (resLengthParams && Array.isArray(res)) {
324
+ allParams[resLengthParams] = res.length;
325
+ }
326
+ /* Messaggio tradotto */
327
+ const msg = UniLocaleManager.translate(label, 'toast', allParams);
328
+ this.manager.success(msg);
329
+ }
330
+ }
331
+
178
332
  /**
179
333
  * Aggiunge una nuova ref nello store solo se non è già presente.
180
334
  * Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.
@@ -310,7 +464,7 @@ function errorHandler(err, errorMode, ref) {
310
464
 
311
465
  function http$(url, refType, config, promiseFactory) {
312
466
  /* Recupero configurazione */
313
- const { ref, hasLoader } = config;
467
+ const { ref, toast, hasLoader } = config;
314
468
  return defer(() => {
315
469
  const http$ = from(promiseFactory());
316
470
  return http$.pipe(tap({
@@ -326,6 +480,12 @@ function http$(url, refType, config, promiseFactory) {
326
480
  /* Rimozione reference */
327
481
  remove(ref);
328
482
  },
483
+ next: (res) => {
484
+ /* Mostra toast (se presente) */
485
+ if (toast) {
486
+ UniToastManager.showHttp(res, toast);
487
+ }
488
+ },
329
489
  }), catchError((err) => {
330
490
  /* Gestione errore */
331
491
  return errorHandler(err, PollingErrorMode.STOP, ref);
@@ -357,12 +517,16 @@ function httpPolling$(url, config, promiseFactory) {
357
517
  }
358
518
  return defer(() => {
359
519
  const http$ = from(promiseFactory());
360
- return http$.pipe(tap(() => {
520
+ return http$.pipe(tap((res) => {
361
521
  /* Rimozione popup di errore nel caso di errorMode = 'IGNORE_WITH_ERROR' */
362
522
  if (errorMode === PollingErrorMode.IGNORE_WITH_ERROR) {
363
523
  updateHasError(ref, false);
364
524
  UniErrorManager.remove(ref);
365
525
  }
526
+ /* Prima risposta */
527
+ if (index === 0 && firstIteration) {
528
+ UniToastManager.showHttp(res, firstIteration.toast);
529
+ }
366
530
  }), catchError((err) => {
367
531
  /* Gestione errore */
368
532
  return errorHandler(err, errorMode, ref);
@@ -502,111 +666,6 @@ class UniHttpManager {
502
666
  }
503
667
  }
504
668
 
505
- class UniLocaleManager {
506
- /* ------------------------------------------------------------------------------- */
507
- /* ----------------------------------- Config ------------------------------------ */
508
- /* ------------------------------------------------------------------------------- */
509
- /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */
510
- static { this.locale = 'en-US'; }
511
- /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */
512
- static { this.prefix = ''; }
513
- /* ------------------------------------------------------------------------------- */
514
- /* ------------------------------------ Store ------------------------------------ */
515
- /* ------------------------------------------------------------------------------- */
516
- /** Store privato (Subject) */
517
- static { this.store = new BehaviorSubject({}); }
518
- /** Store pubblico (Observable) */
519
- static { this.store$ = this.store.asObservable(); }
520
- /** Ottiene il dizionario attuale senza sottoscrizione */
521
- static get currentValue() {
522
- return this.store.getValue();
523
- }
524
- /* ------------------------------------------------------------------------------- */
525
- /* -------------------------------- Metodi: setup -------------------------------- */
526
- /* ------------------------------------------------------------------------------- */
527
- /**
528
- * Inizializza la configurazione di rete del manager.
529
- * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.
530
- */
531
- static setup(locale, prefix) {
532
- this.locale = locale ?? 'en-US';
533
- this.prefix = prefix;
534
- }
535
- static addTranslations(translations) {
536
- this.store.next(translations ?? {});
537
- }
538
- /* ------------------------------------------------------------------------------- */
539
- /* ----------------------------- Metodi: traduzioni ------------------------------ */
540
- /* ------------------------------------------------------------------------------- */
541
- /**
542
- * Traduce una label in base al dizionario caricato.
543
- * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.
544
- */
545
- static translate(label, prefix = 'lbl', interpolateParams, translations) {
546
- const translationsObj = translations ?? this.currentValue;
547
- // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola
548
- const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1);
549
- const finalKey = `${this.prefix}${prefix}${capitalizedLabel}`;
550
- // Cerca la chiave in minuscolo (standardizzazione)
551
- const finalKeyLower = finalKey.toLowerCase();
552
- let translation = translationsObj?.[finalKeyLower];
553
- // Log e Fallback se la traduzione manca
554
- if (translation === undefined) {
555
- console.warn(`Translation missing for key: ${finalKeyLower}`);
556
- return `🔑 ${finalKey}`;
557
- }
558
- // Interpolazione variabili (es: "Ciao {{name}}")
559
- if (interpolateParams) {
560
- for (const [key, value] of Object.entries(interpolateParams)) {
561
- const displayValue = value instanceof Date ? value.toLocaleDateString(this.locale) : String(value);
562
- translation = translation.replaceAll(`{{${key}}}`, displayValue);
563
- }
564
- }
565
- return translation;
566
- }
567
- /* ------------------------------------------------------------------------------- */
568
- /* ------------------------------- Metodi: numeri -------------------------------- */
569
- /* ------------------------------------------------------------------------------- */
570
- /**
571
- * Converte un valore numerico in una stringa formattata secondo il locale impostato.
572
- * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.
573
- */
574
- static toNumberString(value, decimal) {
575
- return new Intl.NumberFormat(this.locale, {
576
- useGrouping: true,
577
- minimumFractionDigits: decimal,
578
- maximumFractionDigits: decimal,
579
- numberingSystem: 'latn',
580
- }).format(value);
581
- }
582
- /* ------------------------------------------------------------------------------- */
583
- /* -------------------------------- Metodi: date --------------------------------- */
584
- /* ------------------------------------------------------------------------------- */
585
- /**
586
- * Formatta una data o una stringa in base al locale corrente.
587
- * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.
588
- */
589
- static toDate(date, mode = 'full', force) {
590
- const dt = new Date(date);
591
- // Controllo: validità data
592
- if (isNaN(dt.getTime())) {
593
- console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);
594
- return '';
595
- }
596
- // Controllo: locale da forzare
597
- const locale = force && this.locale.startsWith(force.oldLang) ? force.newLocale : this.locale;
598
- switch (mode) {
599
- case 'date':
600
- return dt.toLocaleDateString(locale);
601
- case 'time':
602
- return dt.toLocaleTimeString(locale);
603
- case 'full':
604
- default:
605
- return dt.toLocaleString(locale);
606
- }
607
- }
608
- }
609
-
610
669
  /*
611
670
  * Public API Surface of uni-manager
612
671
  */
@@ -615,5 +674,5 @@ class UniLocaleManager {
615
674
  * Generated bundle index. Do not edit.
616
675
  */
617
676
 
618
- export { EmitValueMode, MapOperator, PollingErrorMode, UniErrorManager, UniHttpManager, UniLocaleManager };
677
+ export { EmitValueMode, MapOperator, PollingErrorMode, UniErrorManager, UniHttpManager, UniLocaleManager, UniToastManager };
619
678
  //# sourceMappingURL=uni-manager.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"uni-manager.mjs","sources":["../../../projects/uni-manager/src/lib/error/manager.ts","../../../projects/uni-manager/src/lib/http/enum.ts","../../../projects/uni-manager/src/lib/http/execute.ts","../../../projects/uni-manager/src/lib/http/ref.ts","../../../projects/uni-manager/src/lib/http/handler.ts","../../../projects/uni-manager/src/lib/http/http.ts","../../../projects/uni-manager/src/lib/http/util.ts","../../../projects/uni-manager/src/lib/http/manager.ts","../../../projects/uni-manager/src/lib/locale/manager.ts","../../../projects/uni-manager/src/public-api.ts","../../../projects/uni-manager/src/uni-manager.ts"],"sourcesContent":["import { BehaviorSubject, type Observable } from 'rxjs';\r\nimport type { IUniFeError, IUniHttpError } from 'uni-error';\r\n\r\nexport class UniErrorManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n private static store = new BehaviorSubject<Map<string, IUniFeError | IUniHttpError>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, IUniFeError | IUniHttpError>> =\r\n UniErrorManager.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, IUniFeError | IUniHttpError> {\r\n return UniErrorManager.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Aggiunge o aggiorna un errore nello store.\r\n * Se l'errore esiste già (stesso ID), incrementa il contatore 'count'.\r\n */\r\n public static add(id: string, error: IUniHttpError | IUniFeError): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Tenta di recuperare l'oggetto corrente\r\n const oldItem = oldMap.get(id);\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: IUniFeError | IUniHttpError = {\r\n ...error,\r\n count: oldItem ? oldItem.count + 1 : 1,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Rimuove un errore tramite ID\r\n */\r\n public static remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Svuota completamente la lista degli errori\r\n */\r\n public static removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n}\r\n","export enum MapOperator {\r\n\t/** Cancella la precedente richiesta, mantiene solo l’ultima */\r\n\tSWITCH_MAP,\r\n\r\n\t/** Ignora nuovi valori finché la corrente non finisce */\r\n\tEXHAUST_MAP,\r\n\r\n\t/** Mette le richieste in coda, le esegue una alla volta */\r\n\tCONCAT_MAP,\r\n\r\n\t/** Esegue tutte le richieste in parallelo, ordine non garantito */\r\n\tMERGE_MAP\r\n}\r\n\r\nexport enum PollingErrorMode {\r\n\t/** Salta questa iterazione emettendo un undefined. Il polling continua al tick successivo. */\r\n\tIGNORE,\r\n\r\n\t/** Salta questa iterazione senza emettere valori. Il polling continua al tick successivo. */\r\n\tSKIP,\r\n\r\n\t/** Interrompe il polling propagando l'errore. */\r\n\tSTOP,\r\n\r\n\t/** Ignora l'errore, lo salva (es. per UI), e continua il polling. Emette `undefined`. */\r\n\tIGNORE_WITH_ERROR\r\n}\r\n\r\nexport enum EmitValueMode {\r\n\t/** Aggiorna lo stato solo se arrivano dati nuovi (distinct) */\r\n\tON_NEW_DATA,\r\n\r\n\t/** Aggiorna lo stato ad ogni chiamata, anche se i dati sono uguali */\r\n\tEVERY_TIME\r\n}\r\n","import { isHttpErrorBody, UniHttpError } from 'uni-error';\r\n\r\nasync function execute(\r\n url: URL,\r\n init?: RequestInit,\r\n): Promise<{ res: Response; type: 'json' | 'image' | null } | undefined> {\r\n try {\r\n /* Esegue chiamata http */\r\n const res = await fetch(url, init);\r\n\r\n /* Nessun contenuto */\r\n if (res.status === 204) {\r\n return undefined;\r\n }\r\n\r\n /* Recupero se è un json */\r\n const contentType = res.headers.get('content-type') ?? '';\r\n const isJson = contentType.startsWith('application/json');\r\n const isImage = contentType.startsWith('image/');\r\n\r\n /* Errore HTTP (quindi risposta ricevuta ma non ok) */\r\n if (!res.ok) {\r\n let errorBody: unknown;\r\n\r\n try {\r\n const resClone = res.clone();\r\n errorBody = isJson ? await resClone.json() : await resClone.text();\r\n } catch {\r\n errorBody = await res.text();\r\n }\r\n\r\n if (isHttpErrorBody(errorBody)) {\r\n const type = errorBody.exceptionType.includes('HttpRequestException') ? 'be' : 'ice';\r\n throw new UniHttpError(type, res.status, url, errorBody);\r\n } else {\r\n const error = new Error(`HTTP ${res.statusText}`);\r\n throw new UniHttpError('base', res.status, url, {\r\n exceptionMessage: error.message,\r\n exceptionType: 'ErrorBase',\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n }\r\n\r\n return { res, type: isJson ? 'json' : isImage ? 'image' : null };\r\n } catch (error: unknown) {\r\n if (error instanceof TypeError) {\r\n throw new UniHttpError('network', -1, url, {\r\n exceptionMessage: `${error.name}: ${error.message}\\n${error.stack}`,\r\n exceptionType: error.name,\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n\r\n // Fallback\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function executeHttp<T>(url: URL, init?: RequestInit): Promise<T | undefined> {\r\n /* Esegue chiamata http e vari controlli */\r\n const executeRes = await execute(url, init);\r\n if (!executeRes) return undefined;\r\n\r\n /* Recupero risposta */\r\n const { res, type } = executeRes;\r\n\r\n /* Successo JSON */\r\n if (type === 'json') {\r\n return (await res.json()) as T;\r\n }\r\n\r\n /* Successo testo */\r\n const text = await res.text();\r\n return text ? (text as unknown as T) : undefined;\r\n}\r\n\r\nexport async function executeImage(url: URL, init?: RequestInit): Promise<string | undefined> {\r\n /* Esegue chiamata http e vari controlli */\r\n const executeRes = await execute(url, init);\r\n if (!executeRes) return undefined;\r\n\r\n /* Recupero risposta */\r\n const { res, type } = executeRes;\r\n\r\n /* Successo immagine */\r\n if (type !== 'image') {\r\n throw new Error(`Not image found`);\r\n }\r\n\r\n /* Successo immagine */\r\n const blob = await res.blob();\r\n return URL.createObjectURL(blob);\r\n}\r\n","import { UniHttpManager } from './manager';\r\nimport type { HttpRef } from './model';\r\n\r\n/**\r\n * Aggiunge una nuova ref nello store solo se non è già presente.\r\n * Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.\r\n */\r\nexport function add(id: string, lineId: null, url: URL, type: HttpRef['type']): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se è presente l'item allora termina\r\n if (oldMap.get(id)) return;\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: HttpRef = {\r\n type,\r\n lineId,\r\n url,\r\n hasError: false,\r\n pendingCount: 0,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Rimuove un http ref tramite ID\r\n */\r\nexport function remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Aggiorna store\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna il contatore delle chiamate pendenti per una specifica ref.\r\n * Incrementa o decrementa 'pendingCount' garantendo che non scenda mai sotto lo zero.\r\n * Se la ref non esiste, l'operazione viene ignorata.\r\n */\r\nexport function updateIsLoading(id: string, delta: -1 | 1): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = {\r\n ...oldItem,\r\n pendingCount: Math.max(0, oldItem.pendingCount + delta),\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna lo stato di errore per una specifica ref.\r\n * Se il valore di 'hasError' è identico a quello attuale o se la ref non esiste,\r\n * l'operazione viene interrotta per evitare aggiornamenti inutili.\r\n */\r\nexport function updateHasError(id: string, hasError: boolean): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Controllo: se con lo stesso valore, salta\r\n if (oldItem.hasError === hasError) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = { ...oldItem, hasError };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Svuota completamente la lista delle refs\r\n */\r\nexport function removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n","import {\r\n concatMap,\r\n EMPTY,\r\n exhaustMap,\r\n mergeMap,\r\n Observable,\r\n of,\r\n type OperatorFunction,\r\n switchMap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { UniHttpError } from 'uni-error';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { MapOperator, PollingErrorMode } from './enum';\r\nimport { updateHasError } from './ref';\r\n\r\nexport function operatorHandler<T>(\r\n operator: MapOperator,\r\n): (\r\n project: (value: number) => Observable<T | undefined>,\r\n) => OperatorFunction<number, T | undefined> {\r\n // Gestione della concorrenza in base al parametro\r\n switch (operator) {\r\n case MapOperator.EXHAUST_MAP:\r\n return (project) => exhaustMap(project);\r\n case MapOperator.CONCAT_MAP:\r\n return (project) => concatMap(project);\r\n case MapOperator.MERGE_MAP:\r\n return (project) => mergeMap(project);\r\n case MapOperator.SWITCH_MAP:\r\n default:\r\n return (project) => switchMap(project);\r\n }\r\n}\r\n\r\nexport function errorHandler(\r\n err: unknown,\r\n errorMode: PollingErrorMode,\r\n ref: string,\r\n): Observable<undefined> {\r\n // Controllo: sia effettivamente un errore di tipo 'UniHttpError'\r\n if (!(err instanceof UniHttpError)) {\r\n return throwError(() => err);\r\n }\r\n\r\n // Aggiorna la ref nella map\r\n updateHasError(ref, true);\r\n\r\n // Gestione dell'errore in base al parametro\r\n switch (errorMode) {\r\n case PollingErrorMode.IGNORE:\r\n return of(undefined);\r\n case PollingErrorMode.SKIP:\r\n return EMPTY;\r\n case PollingErrorMode.IGNORE_WITH_ERROR: {\r\n UniErrorManager.add(ref, err);\r\n return of(undefined);\r\n }\r\n case PollingErrorMode.STOP:\r\n default: {\r\n UniErrorManager.add(ref, err);\r\n return throwError(() => err);\r\n }\r\n }\r\n}\r\n","import { isEqual } from 'lodash-es';\r\nimport {\r\n catchError,\r\n defer,\r\n distinctUntilChanged,\r\n finalize,\r\n from,\r\n Observable,\r\n tap,\r\n timer,\r\n} from 'rxjs';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\nimport { errorHandler, operatorHandler } from './handler';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { add, remove, updateHasError, updateIsLoading } from './ref';\r\n\r\nexport function http$<T>(\r\n url: URL,\r\n refType: HttpRef['type'],\r\n config: HttpConfig<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { ref, hasLoader } = config;\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, refType);\r\n\r\n /* Incrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, PollingErrorMode.STOP, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n}\r\n\r\nexport function httpPolling$<T>(\r\n url: URL,\r\n config: HttpConfigPolling<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const {\r\n interval,\r\n ref,\r\n operator = MapOperator.SWITCH_MAP,\r\n errorMode = PollingErrorMode.STOP,\r\n emitValueMode = EmitValueMode.EVERY_TIME,\r\n firstIteration,\r\n } = config;\r\n\r\n const timer$ = timer(0, interval);\r\n const source$ = timer$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, 'polling');\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n }),\r\n operatorHandler<T>(operator)((index) => {\r\n /* Incrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap(() => {\r\n /* Rimozione popup di errore nel caso di errorMode = 'IGNORE_WITH_ERROR' */\r\n if (errorMode === PollingErrorMode.IGNORE_WITH_ERROR) {\r\n updateHasError(ref, false);\r\n UniErrorManager.remove(ref);\r\n }\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, errorMode, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n }),\r\n );\r\n\r\n return emitValueMode === EmitValueMode.EVERY_TIME\r\n ? source$\r\n : source$.pipe(distinctUntilChanged((prev, cur) => isEqual(prev, cur)));\r\n}\r\n","export function getUrl(hostname: string, port: number, path: string): URL {\r\n const base = `http://${hostname}:${port}`;\r\n return new URL(`/api${path}`, base);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { executeHttp, executeImage } from './execute';\r\nimport { http$, httpPolling$ } from './http';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { updateHasError } from './ref';\r\nimport { getUrl } from './util';\r\n\r\nexport class UniHttpManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Hostname del server (es. 'api.example.com' o 'localhost') */\r\n private static hostname: string;\r\n\r\n /** Porta del server su cui effettuare le chiamate (es. 80, 443 o 3000) */\r\n private static port: number;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Map<string, HttpRef>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, HttpRef>> = this.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, HttpRef> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(hostname: string, port: number): void {\r\n this.hostname = hostname;\r\n this.port = port;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------ Metodi: http one ------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Esegue una singola richiesta HTTP GET.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static get$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Recupera un'immagine tramite una richiesta GET e la trasforma in un formato gestibile (es. Blob o Base64).\r\n * Delega la logica di conversione alla funzione executeImage.\r\n */\r\n public static getImage$(config: HttpConfig<string>): Observable<string | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeImage(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una singola richiesta HTTP PUT per aggiornare una risorsa esistente.\r\n */\r\n public static put$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP POST inviando un payload JSON nel corpo della richiesta.\r\n * Imposta automaticamente l'header 'Content-Type' come 'application/json'.\r\n */\r\n public static post$<T>(\r\n config: HttpConfig<T>,\r\n body: Record<string, any>,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ---------------------------- Metodi: http polling ----------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Avvia un ciclo di polling basato su richieste GET.\r\n * Continua a emettere valori in base alla configurazione di intervallo definita in HttpConfigPolling.\r\n */\r\n public static getHttpPolling$<T>(config: HttpConfigPolling<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste POST.\r\n * Invia il body specificato a ogni iterazione del ciclo.\r\n */\r\n public static postHttpPolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body: Record<any, any>,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Imposta o resetta lo stato di errore per una specifica reference.\r\n */\r\n public static updateHasError(id: string, hasError: boolean): void {\r\n updateHasError(id, hasError);\r\n }\r\n}\r\n","import { BehaviorSubject } from 'rxjs';\r\n\r\nexport class UniLocaleManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */\r\n private static locale = 'en-US';\r\n\r\n /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */\r\n private static prefix = '';\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Record<string, string>>({});\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$ = this.store.asObservable();\r\n\r\n /** Ottiene il dizionario attuale senza sottoscrizione */\r\n public static get currentValue(): Record<string, string> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(locale: string | undefined, prefix: string): void {\r\n this.locale = locale ?? 'en-US';\r\n this.prefix = prefix;\r\n }\r\n\r\n public static addTranslations(translations: Record<string, string> | undefined): void {\r\n this.store.next(translations ?? {});\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------- Metodi: traduzioni ------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Traduce una label in base al dizionario caricato.\r\n * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.\r\n */\r\n public static translate(\r\n label: string,\r\n prefix = 'lbl',\r\n interpolateParams?: Record<string, string | number | Date>,\r\n translations?: Record<string, string>,\r\n ): string {\r\n const translationsObj = translations ?? this.currentValue;\r\n\r\n // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola\r\n const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1);\r\n const finalKey = `${this.prefix}${prefix}${capitalizedLabel}`;\r\n\r\n // Cerca la chiave in minuscolo (standardizzazione)\r\n const finalKeyLower = finalKey.toLowerCase();\r\n let translation = translationsObj?.[finalKeyLower];\r\n\r\n // Log e Fallback se la traduzione manca\r\n if (translation === undefined) {\r\n console.warn(`Translation missing for key: ${finalKeyLower}`);\r\n return `🔑 ${finalKey}`;\r\n }\r\n\r\n // Interpolazione variabili (es: \"Ciao {{name}}\")\r\n if (interpolateParams) {\r\n for (const [key, value] of Object.entries(interpolateParams)) {\r\n const displayValue =\r\n value instanceof Date ? value.toLocaleDateString(this.locale) : String(value);\r\n\r\n translation = translation.replaceAll(`{{${key}}}`, displayValue);\r\n }\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------- Metodi: numeri -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Converte un valore numerico in una stringa formattata secondo il locale impostato.\r\n * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.\r\n */\r\n public static toNumberString(value: number, decimal: number): string {\r\n return new Intl.NumberFormat(this.locale, {\r\n useGrouping: true,\r\n minimumFractionDigits: decimal,\r\n maximumFractionDigits: decimal,\r\n numberingSystem: 'latn',\r\n }).format(value);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: date --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Formatta una data o una stringa in base al locale corrente.\r\n * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.\r\n */\r\n public static toDate(\r\n date: string | Date,\r\n mode: 'date' | 'time' | 'full' = 'full',\r\n force?: { oldLang: string; newLocale: string },\r\n ): string {\r\n const dt = new Date(date);\r\n\r\n // Controllo: validità data\r\n if (isNaN(dt.getTime())) {\r\n console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);\r\n return '';\r\n }\r\n\r\n // Controllo: locale da forzare\r\n const locale = force && this.locale.startsWith(force.oldLang) ? force.newLocale : this.locale;\r\n\r\n switch (mode) {\r\n case 'date':\r\n return dt.toLocaleDateString(locale);\r\n case 'time':\r\n return dt.toLocaleTimeString(locale);\r\n case 'full':\r\n default:\r\n return dt.toLocaleString(locale);\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API Surface of uni-manager\r\n */\r\n\r\nexport * from './lib/error';\r\nexport * from './lib/http';\r\nexport * from './lib/locale';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uni-manager.mjs","sources":["../../../projects/uni-manager/src/lib/error/manager.ts","../../../projects/uni-manager/src/lib/http/enum.ts","../../../projects/uni-manager/src/lib/http/execute.ts","../../../projects/uni-manager/src/lib/locale/manager.ts","../../../projects/uni-manager/src/lib/ui/toast/manager.ts","../../../projects/uni-manager/src/lib/http/ref.ts","../../../projects/uni-manager/src/lib/http/handler.ts","../../../projects/uni-manager/src/lib/http/http.ts","../../../projects/uni-manager/src/lib/http/util.ts","../../../projects/uni-manager/src/lib/http/manager.ts","../../../projects/uni-manager/src/public-api.ts","../../../projects/uni-manager/src/uni-manager.ts"],"sourcesContent":["import { BehaviorSubject, type Observable } from 'rxjs';\r\nimport type { IUniFeError, IUniHttpError } from 'uni-error';\r\n\r\nexport class UniErrorManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n private static store = new BehaviorSubject<Map<string, IUniFeError | IUniHttpError>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, IUniFeError | IUniHttpError>> =\r\n UniErrorManager.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, IUniFeError | IUniHttpError> {\r\n return UniErrorManager.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Aggiunge o aggiorna un errore nello store.\r\n * Se l'errore esiste già (stesso ID), incrementa il contatore 'count'.\r\n */\r\n public static add(id: string, error: IUniHttpError | IUniFeError): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Tenta di recuperare l'oggetto corrente\r\n const oldItem = oldMap.get(id);\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: IUniFeError | IUniHttpError = {\r\n ...error,\r\n count: oldItem ? oldItem.count + 1 : 1,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Rimuove un errore tramite ID\r\n */\r\n public static remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Svuota completamente la lista degli errori\r\n */\r\n public static removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n}\r\n","export enum MapOperator {\r\n\t/** Cancella la precedente richiesta, mantiene solo l’ultima */\r\n\tSWITCH_MAP,\r\n\r\n\t/** Ignora nuovi valori finché la corrente non finisce */\r\n\tEXHAUST_MAP,\r\n\r\n\t/** Mette le richieste in coda, le esegue una alla volta */\r\n\tCONCAT_MAP,\r\n\r\n\t/** Esegue tutte le richieste in parallelo, ordine non garantito */\r\n\tMERGE_MAP\r\n}\r\n\r\nexport enum PollingErrorMode {\r\n\t/** Salta questa iterazione emettendo un undefined. Il polling continua al tick successivo. */\r\n\tIGNORE,\r\n\r\n\t/** Salta questa iterazione senza emettere valori. Il polling continua al tick successivo. */\r\n\tSKIP,\r\n\r\n\t/** Interrompe il polling propagando l'errore. */\r\n\tSTOP,\r\n\r\n\t/** Ignora l'errore, lo salva (es. per UI), e continua il polling. Emette `undefined`. */\r\n\tIGNORE_WITH_ERROR\r\n}\r\n\r\nexport enum EmitValueMode {\r\n\t/** Aggiorna lo stato solo se arrivano dati nuovi (distinct) */\r\n\tON_NEW_DATA,\r\n\r\n\t/** Aggiorna lo stato ad ogni chiamata, anche se i dati sono uguali */\r\n\tEVERY_TIME\r\n}\r\n","import { isHttpErrorBody, UniHttpError } from 'uni-error';\r\n\r\nasync function execute(\r\n url: URL,\r\n init?: RequestInit,\r\n): Promise<{ res: Response; type: 'json' | 'image' | null } | undefined> {\r\n try {\r\n /* Esegue chiamata http */\r\n const res = await fetch(url, init);\r\n\r\n /* Nessun contenuto */\r\n if (res.status === 204) {\r\n return undefined;\r\n }\r\n\r\n /* Recupero se è un json */\r\n const contentType = res.headers.get('content-type') ?? '';\r\n const isJson = contentType.startsWith('application/json');\r\n const isImage = contentType.startsWith('image/');\r\n\r\n /* Errore HTTP (quindi risposta ricevuta ma non ok) */\r\n if (!res.ok) {\r\n let errorBody: unknown;\r\n\r\n try {\r\n const resClone = res.clone();\r\n errorBody = isJson ? await resClone.json() : await resClone.text();\r\n } catch {\r\n errorBody = await res.text();\r\n }\r\n\r\n if (isHttpErrorBody(errorBody)) {\r\n const type = errorBody.exceptionType.includes('HttpRequestException') ? 'be' : 'ice';\r\n throw new UniHttpError(type, res.status, url, errorBody);\r\n } else {\r\n const error = new Error(`HTTP ${res.statusText}`);\r\n throw new UniHttpError('base', res.status, url, {\r\n exceptionMessage: error.message,\r\n exceptionType: 'ErrorBase',\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n }\r\n\r\n return { res, type: isJson ? 'json' : isImage ? 'image' : null };\r\n } catch (error: unknown) {\r\n if (error instanceof TypeError) {\r\n throw new UniHttpError('network', -1, url, {\r\n exceptionMessage: `${error.name}: ${error.message}\\n${error.stack}`,\r\n exceptionType: error.name,\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n\r\n // Fallback\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function executeHttp<T>(url: URL, init?: RequestInit): Promise<T | undefined> {\r\n /* Esegue chiamata http e vari controlli */\r\n const executeRes = await execute(url, init);\r\n if (!executeRes) return undefined;\r\n\r\n /* Recupero risposta */\r\n const { res, type } = executeRes;\r\n\r\n /* Successo JSON */\r\n if (type === 'json') {\r\n return (await res.json()) as T;\r\n }\r\n\r\n /* Successo testo */\r\n const text = await res.text();\r\n return text ? (text as unknown as T) : undefined;\r\n}\r\n\r\nexport async function executeImage(url: URL, init?: RequestInit): Promise<string | undefined> {\r\n /* Esegue chiamata http e vari controlli */\r\n const executeRes = await execute(url, init);\r\n if (!executeRes) return undefined;\r\n\r\n /* Recupero risposta */\r\n const { res, type } = executeRes;\r\n\r\n /* Successo immagine */\r\n if (type !== 'image') {\r\n throw new Error(`Not image found`);\r\n }\r\n\r\n /* Successo immagine */\r\n const blob = await res.blob();\r\n return URL.createObjectURL(blob);\r\n}\r\n","import { BehaviorSubject } from 'rxjs';\r\n\r\nexport class UniLocaleManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */\r\n private static locale = 'en-US';\r\n\r\n /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */\r\n private static prefix = '';\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Record<string, string>>({});\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$ = this.store.asObservable();\r\n\r\n /** Ottiene il dizionario attuale senza sottoscrizione */\r\n public static get currentValue(): Record<string, string> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(locale: string | undefined, prefix: string): void {\r\n this.locale = locale ?? 'en-US';\r\n this.prefix = prefix;\r\n }\r\n\r\n public static addTranslations(translations: Record<string, string> | undefined): void {\r\n this.store.next(translations ?? {});\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------- Metodi: traduzioni ------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Traduce una label in base al dizionario caricato.\r\n * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.\r\n */\r\n public static translate(\r\n label: string,\r\n prefix = 'lbl',\r\n interpolateParams?: Record<string, string | number | Date>,\r\n translations?: Record<string, string>,\r\n ): string {\r\n const translationsObj = translations ?? this.currentValue;\r\n\r\n // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola\r\n const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1);\r\n const finalKey = `${this.prefix}${prefix}${capitalizedLabel}`;\r\n\r\n // Cerca la chiave in minuscolo (standardizzazione)\r\n const finalKeyLower = finalKey.toLowerCase();\r\n let translation = translationsObj?.[finalKeyLower];\r\n\r\n // Log e Fallback se la traduzione manca\r\n if (translation === undefined) {\r\n console.warn(`Translation missing for key: ${finalKeyLower}`);\r\n return `🔑 ${finalKey}`;\r\n }\r\n\r\n // Interpolazione variabili (es: \"Ciao {{name}}\")\r\n if (interpolateParams) {\r\n for (const [key, value] of Object.entries(interpolateParams)) {\r\n const displayValue =\r\n value instanceof Date ? value.toLocaleDateString(this.locale) : String(value);\r\n\r\n translation = translation.replaceAll(`{{${key}}}`, displayValue);\r\n }\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------- Metodi: numeri -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Converte un valore numerico in una stringa formattata secondo il locale impostato.\r\n * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.\r\n */\r\n public static toNumberString(value: number, decimal: number): string {\r\n return new Intl.NumberFormat(this.locale, {\r\n useGrouping: true,\r\n minimumFractionDigits: decimal,\r\n maximumFractionDigits: decimal,\r\n numberingSystem: 'latn',\r\n }).format(value);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: date --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Formatta una data o una stringa in base al locale corrente.\r\n * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.\r\n */\r\n public static toDate(\r\n date: string | Date,\r\n mode: 'date' | 'time' | 'full' = 'full',\r\n force?: { oldLang: string; newLocale: string },\r\n ): string {\r\n const dt = new Date(date);\r\n\r\n // Controllo: validità data\r\n if (isNaN(dt.getTime())) {\r\n console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);\r\n return '';\r\n }\r\n\r\n // Controllo: locale da forzare\r\n const locale = force && this.locale.startsWith(force.oldLang) ? force.newLocale : this.locale;\r\n\r\n switch (mode) {\r\n case 'date':\r\n return dt.toLocaleDateString(locale);\r\n case 'time':\r\n return dt.toLocaleTimeString(locale);\r\n case 'full':\r\n default:\r\n return dt.toLocaleString(locale);\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { UniLocaleManager } from '../../locale';\r\nimport type { ToastHttpConfig, ToastOperation } from './model';\r\n\r\nexport class UniToastManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Riferimento interno all'istanza */\r\n private static manager: ToastOperation;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza il manager con una serie di operazioni\r\n */\r\n public static setup(operations: ToastOperation): void {\r\n this.manager = operations;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: show --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static show(\r\n label: string,\r\n interpolateParams?: Record<string, any>,\r\n operation: keyof ToastOperation = 'success',\r\n ): void {\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', interpolateParams);\r\n this.manager[operation](msg);\r\n }\r\n\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static showHttp<T>(res: T | undefined, config: ToastHttpConfig<T>): void {\r\n const { label, params, resParams, resLengthParams, formatters } = config;\r\n\r\n /* Parametri statici di base */\r\n const allParams: Record<string, any> = { ...params };\r\n\r\n /* Estrazione parametri dalla risposta (se esiste ed è un oggetto) */\r\n if (res && typeof res === 'object') {\r\n resParams?.forEach((key) => {\r\n if (!(key in res)) return;\r\n\r\n const rawValue = res[key];\r\n // Se esiste un formatter per questa chiave lo si usa, altrimenti valore grezzo\r\n allParams[key] = formatters?.[key] ? formatters[key]!(rawValue) : rawValue;\r\n });\r\n }\r\n\r\n /* Conteggio array */\r\n if (resLengthParams && Array.isArray(res)) {\r\n allParams[resLengthParams] = res.length;\r\n }\r\n\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', allParams);\r\n this.manager.success(msg);\r\n }\r\n}\r\n","import { UniHttpManager } from './manager';\r\nimport type { HttpRef } from './model';\r\n\r\n/**\r\n * Aggiunge una nuova ref nello store solo se non è già presente.\r\n * Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.\r\n */\r\nexport function add(id: string, lineId: null, url: URL, type: HttpRef['type']): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se è presente l'item allora termina\r\n if (oldMap.get(id)) return;\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: HttpRef = {\r\n type,\r\n lineId,\r\n url,\r\n hasError: false,\r\n pendingCount: 0,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Rimuove un http ref tramite ID\r\n */\r\nexport function remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Aggiorna store\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna il contatore delle chiamate pendenti per una specifica ref.\r\n * Incrementa o decrementa 'pendingCount' garantendo che non scenda mai sotto lo zero.\r\n * Se la ref non esiste, l'operazione viene ignorata.\r\n */\r\nexport function updateIsLoading(id: string, delta: -1 | 1): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = {\r\n ...oldItem,\r\n pendingCount: Math.max(0, oldItem.pendingCount + delta),\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna lo stato di errore per una specifica ref.\r\n * Se il valore di 'hasError' è identico a quello attuale o se la ref non esiste,\r\n * l'operazione viene interrotta per evitare aggiornamenti inutili.\r\n */\r\nexport function updateHasError(id: string, hasError: boolean): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Controllo: se con lo stesso valore, salta\r\n if (oldItem.hasError === hasError) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = { ...oldItem, hasError };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Svuota completamente la lista delle refs\r\n */\r\nexport function removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n","import {\r\n concatMap,\r\n EMPTY,\r\n exhaustMap,\r\n mergeMap,\r\n Observable,\r\n of,\r\n type OperatorFunction,\r\n switchMap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { UniHttpError } from 'uni-error';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { MapOperator, PollingErrorMode } from './enum';\r\nimport { updateHasError } from './ref';\r\n\r\nexport function operatorHandler<T>(\r\n operator: MapOperator,\r\n): (\r\n project: (value: number) => Observable<T | undefined>,\r\n) => OperatorFunction<number, T | undefined> {\r\n // Gestione della concorrenza in base al parametro\r\n switch (operator) {\r\n case MapOperator.EXHAUST_MAP:\r\n return (project) => exhaustMap(project);\r\n case MapOperator.CONCAT_MAP:\r\n return (project) => concatMap(project);\r\n case MapOperator.MERGE_MAP:\r\n return (project) => mergeMap(project);\r\n case MapOperator.SWITCH_MAP:\r\n default:\r\n return (project) => switchMap(project);\r\n }\r\n}\r\n\r\nexport function errorHandler(\r\n err: unknown,\r\n errorMode: PollingErrorMode,\r\n ref: string,\r\n): Observable<undefined> {\r\n // Controllo: sia effettivamente un errore di tipo 'UniHttpError'\r\n if (!(err instanceof UniHttpError)) {\r\n return throwError(() => err);\r\n }\r\n\r\n // Aggiorna la ref nella map\r\n updateHasError(ref, true);\r\n\r\n // Gestione dell'errore in base al parametro\r\n switch (errorMode) {\r\n case PollingErrorMode.IGNORE:\r\n return of(undefined);\r\n case PollingErrorMode.SKIP:\r\n return EMPTY;\r\n case PollingErrorMode.IGNORE_WITH_ERROR: {\r\n UniErrorManager.add(ref, err);\r\n return of(undefined);\r\n }\r\n case PollingErrorMode.STOP:\r\n default: {\r\n UniErrorManager.add(ref, err);\r\n return throwError(() => err);\r\n }\r\n }\r\n}\r\n","import { isEqual } from 'lodash-es';\r\nimport {\r\n catchError,\r\n defer,\r\n distinctUntilChanged,\r\n finalize,\r\n from,\r\n Observable,\r\n tap,\r\n timer,\r\n} from 'rxjs';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { UniToastManager } from '../ui/toast';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\nimport { errorHandler, operatorHandler } from './handler';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { add, remove, updateHasError, updateIsLoading } from './ref';\r\n\r\nexport function http$<T>(\r\n url: URL,\r\n refType: HttpRef['type'],\r\n config: HttpConfig<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { ref, toast, hasLoader } = config;\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, refType);\r\n\r\n /* Incrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n next: (res) => {\r\n /* Mostra toast (se presente) */\r\n if (toast) {\r\n UniToastManager.showHttp(res, toast);\r\n }\r\n },\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, PollingErrorMode.STOP, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n}\r\n\r\nexport function httpPolling$<T>(\r\n url: URL,\r\n config: HttpConfigPolling<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const {\r\n interval,\r\n ref,\r\n operator = MapOperator.SWITCH_MAP,\r\n errorMode = PollingErrorMode.STOP,\r\n emitValueMode = EmitValueMode.EVERY_TIME,\r\n firstIteration,\r\n } = config;\r\n\r\n const timer$ = timer(0, interval);\r\n const source$ = timer$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, 'polling');\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n }),\r\n operatorHandler<T>(operator)((index) => {\r\n /* Incrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap((res) => {\r\n /* Rimozione popup di errore nel caso di errorMode = 'IGNORE_WITH_ERROR' */\r\n if (errorMode === PollingErrorMode.IGNORE_WITH_ERROR) {\r\n updateHasError(ref, false);\r\n UniErrorManager.remove(ref);\r\n }\r\n\r\n /* Prima risposta */\r\n if (index === 0 && firstIteration) {\r\n UniToastManager.showHttp(res, firstIteration.toast);\r\n }\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, errorMode, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n }),\r\n );\r\n\r\n return emitValueMode === EmitValueMode.EVERY_TIME\r\n ? source$\r\n : source$.pipe(distinctUntilChanged((prev, cur) => isEqual(prev, cur)));\r\n}\r\n","export function getUrl(hostname: string, port: number, path: string): URL {\r\n const base = `http://${hostname}:${port}`;\r\n return new URL(`/api${path}`, base);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nimport { executeHttp, executeImage } from './execute';\r\nimport { http$, httpPolling$ } from './http';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { updateHasError } from './ref';\r\nimport { getUrl } from './util';\r\n\r\nexport class UniHttpManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Hostname del server (es. 'api.example.com' o 'localhost') */\r\n private static hostname: string;\r\n\r\n /** Porta del server su cui effettuare le chiamate (es. 80, 443 o 3000) */\r\n private static port: number;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Map<string, HttpRef>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, HttpRef>> = this.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, HttpRef> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(hostname: string, port: number): void {\r\n this.hostname = hostname;\r\n this.port = port;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------ Metodi: http one ------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Esegue una singola richiesta HTTP GET.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static get$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Recupera un'immagine tramite una richiesta GET e la trasforma in un formato gestibile (es. Blob o Base64).\r\n * Delega la logica di conversione alla funzione executeImage.\r\n */\r\n public static getImage$(config: HttpConfig<string>): Observable<string | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeImage(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una singola richiesta HTTP PUT per aggiornare una risorsa esistente.\r\n */\r\n public static put$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP POST inviando un payload JSON nel corpo della richiesta.\r\n * Imposta automaticamente l'header 'Content-Type' come 'application/json'.\r\n */\r\n public static post$<T>(\r\n config: HttpConfig<T>,\r\n body: Record<string, any>,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ---------------------------- Metodi: http polling ----------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Avvia un ciclo di polling basato su richieste GET.\r\n * Continua a emettere valori in base alla configurazione di intervallo definita in HttpConfigPolling.\r\n */\r\n public static getHttpPolling$<T>(config: HttpConfigPolling<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste POST.\r\n * Invia il body specificato a ogni iterazione del ciclo.\r\n */\r\n public static postHttpPolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body: Record<any, any>,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Imposta o resetta lo stato di errore per una specifica reference.\r\n */\r\n public static updateHasError(id: string, hasError: boolean): void {\r\n updateHasError(id, hasError);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of uni-manager\r\n */\r\n\r\nexport * from './lib/error';\r\nexport * from './lib/http';\r\nexport * from './lib/locale';\r\nexport * from './lib/ui/toast';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { ToastHttpConfig } from '../ui/toast/model';
1
2
  import { EmitValueMode, MapOperator, PollingErrorMode } from './enum';
2
3
  export interface HttpRef {
3
4
  type: 'one' | 'polling' | 'image';
@@ -10,7 +11,7 @@ export interface HttpConfig<T> {
10
11
  path: string;
11
12
  ref: string;
12
13
  init?: RequestInit;
13
- toast?: HttpConfigToast<T>;
14
+ toast?: ToastHttpConfig<T>;
14
15
  hasLoader?: boolean;
15
16
  }
16
17
  export interface HttpConfigPolling<T> {
@@ -22,13 +23,7 @@ export interface HttpConfigPolling<T> {
22
23
  errorMode?: PollingErrorMode;
23
24
  emitValueMode?: EmitValueMode;
24
25
  firstIteration?: {
25
- toast: HttpConfigToast<T>;
26
+ toast: ToastHttpConfig<T>;
26
27
  hasLoader?: boolean;
27
28
  };
28
29
  }
29
- export interface HttpConfigToast<T> {
30
- label: string;
31
- params?: Record<string, string | number | Date>;
32
- paramKeys?: (keyof T)[];
33
- paramCount?: string;
34
- }
@@ -0,0 +1 @@
1
+ export * from './manager';
@@ -0,0 +1,17 @@
1
+ import type { ToastHttpConfig, ToastOperation } from './model';
2
+ export declare class UniToastManager {
3
+ /** Riferimento interno all'istanza */
4
+ private static manager;
5
+ /**
6
+ * Inizializza il manager con una serie di operazioni
7
+ */
8
+ static setup(operations: ToastOperation): void;
9
+ /**
10
+ * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.
11
+ */
12
+ static show(label: string, interpolateParams?: Record<string, any>, operation?: keyof ToastOperation): void;
13
+ /**
14
+ * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.
15
+ */
16
+ static showHttp<T>(res: T | undefined, config: ToastHttpConfig<T>): void;
17
+ }
@@ -0,0 +1,13 @@
1
+ export interface ToastOperation {
2
+ success: (message: string) => void;
3
+ info: (message: string) => void;
4
+ warning: (message: string) => void;
5
+ custom: (message: string) => void;
6
+ }
7
+ export interface ToastHttpConfig<T> {
8
+ label: string;
9
+ params?: Record<string, string | number | Date>;
10
+ resParams?: (keyof T & string)[];
11
+ resLengthParams?: string;
12
+ formatters?: Partial<Record<keyof T & string, (val: any) => any>>;
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uni-manager",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.1.0",
6
6
  "@angular/core": "^19.1.0"
package/public-api.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './lib/error';
2
2
  export * from './lib/http';
3
3
  export * from './lib/locale';
4
+ export * from './lib/ui/toast';