{"version":3,"file":"uni-manager-error.mjs","sources":["../../../projects/uni-manager/error/manager.ts","../../../projects/uni-manager/error/uni-manager-error.ts"],"sourcesContent":["import { BehaviorSubject, distinctUntilChanged, map, Observable } from 'rxjs';\r\nimport type { ErrorStore, IUniFeError, IUniHttpError } from 'uni-model-type/type';\r\n\r\nexport class UniErrorManager {\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* --------------------------------- Metodi: get --------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Restituisce la lista degli errori visibili */\r\n  public static get errorStoreItems$(): Observable<({ id: string } & ErrorStore)[]> {\r\n    return this.store$.pipe(\r\n      distinctUntilChanged((prev, curr) => {\r\n        // Se la dimensione differisce, le mappe sono strutturalmente diverse\r\n        if (prev.size !== curr.size) return false;\r\n\r\n        // Verifica puntuale dello stato di ciascun elemento per evitare la conversione in array\r\n        for (const [id, prevItem] of prev) {\r\n          const currItem = curr.get(id);\r\n\r\n          // Se l'elemento non esiste nella nuova mappa, viene rilevato un cambiamento\r\n          if (!currItem) return false;\r\n\r\n          // Se varia lo stato di visibilità o il numero di eventi in cronologia, viene rilevato un cambiamento\r\n          if (prevItem.isVisible !== currItem.isVisible) return false;\r\n          if (prevItem.historyItems.length !== currItem.historyItems.length) return false;\r\n        }\r\n\r\n        // Nessuna variazione rilevata tra le due mappe\r\n        return true;\r\n      }),\r\n      map((storeMap) => {\r\n        const visibleErrors: ({ id: string } & ErrorStore)[] = [];\r\n        for (const [id, item] of storeMap) {\r\n          visibleErrors.push({ ...item, id });\r\n        }\r\n        return visibleErrors.toSorted((a, b) => {\r\n          const lastTimestampA = a.historyItems.at(-1)?.timestamp ?? 0;\r\n          const lastTimestampB = b.historyItems.at(-1)?.timestamp ?? 0;\r\n          return lastTimestampB - lastTimestampA;\r\n        });\r\n      }),\r\n    );\r\n  }\r\n\r\n  /** Restituisce se lo store ha errori visibili o meno */\r\n  public static get hasErrors$(): Observable<boolean> {\r\n    return this.errorStoreItems$.pipe(\r\n      map((errorsList) => errorsList.length > 0),\r\n      distinctUntilChanged(),\r\n    );\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* ------------------------------------ Store ------------------------------------ */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Store privato (Subject) */\r\n  private static store = new BehaviorSubject<Map<string, ErrorStore>>(new Map());\r\n\r\n  /** Store pubblico (Observable) */\r\n  public static store$: Observable<Map<string, ErrorStore>> = 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, ErrorStore> {\r\n    return this.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 (lo rende automaticamente visibile).\r\n   */\r\n  public static add(id: string, error: IUniHttpError | IUniFeError): void {\r\n    // Recupera l'ultimo stato (Map)\r\n    const oldMap = this.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 message =\r\n      error.type === 'be' && error.innerException\r\n        ? error.innerException.message\r\n        : error.exception.message;\r\n    const newItem: ErrorStore = {\r\n      uniError: error,\r\n      historyItems: [...(oldItem?.historyItems ?? []), { message, timestamp: Date.now() }],\r\n      isVisible: true,\r\n      isOpen: false,\r\n      isCopied: false,\r\n      isSaved: false,\r\n    };\r\n\r\n    // Crea una nuova istanza della Map\r\n    const newMap = new Map(oldMap);\r\n    newMap.set(id, newItem);\r\n\r\n    // Aggiorna il nuovo stato notificando l'observer\r\n    this.store.next(newMap);\r\n  }\r\n\r\n  /**\r\n   * Nasconde un errore tramite ID senza eliminarlo dallo store (soft-delete)\r\n   */\r\n  public static hide(id: string): void {\r\n    // Recupera l'ultimo stato (Map)\r\n    const oldMap = this.currentValue;\r\n\r\n    // Tenta di recuperare l'oggetto corrente\r\n    const oldItem = oldMap.get(id);\r\n\r\n    // Controllo: se non è presente l'item allora termina\r\n    if (!oldItem) return;\r\n\r\n    // Crea una nuova istanza della Map\r\n    const newMap = new Map(oldMap);\r\n    newMap.set(id, { ...oldItem, isVisible: false });\r\n\r\n    // Aggiorna il nuovo stato notificando l'observer\r\n    this.store.next(newMap);\r\n  }\r\n\r\n  /**\r\n   * Nasconde tutti gli errori attualmente presenti nello store\r\n   */\r\n  public static hideAll(): void {\r\n    // Recupera l'ultimo stato (Map)\r\n    const oldMap = this.currentValue;\r\n\r\n    // Controllo: se lo store è vuoto allora termina\r\n    if (oldMap.size === 0) return;\r\n\r\n    // Crea una nuova istanza della Map\r\n    const newMap = new Map<string, ErrorStore>();\r\n    for (const [key, value] of oldMap) {\r\n      newMap.set(key, { ...value, isVisible: false });\r\n    }\r\n\r\n    // Aggiorna il nuovo stato notificando l'observer\r\n    this.store.next(newMap);\r\n  }\r\n\r\n  /**\r\n   * Rimuove definitivamente un errore tramite ID dallo store\r\n   */\r\n  public static remove(id: string): void {\r\n    // Recupera l'ultimo stato (Map)\r\n    const oldMap = this.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    this.store.next(newMap);\r\n  }\r\n\r\n  /**\r\n   * Svuota completamente il map degli errori (hard-delete)\r\n   */\r\n  public static removeAll(): void {\r\n    // Crea una nuova istanza della Map\r\n    const newMap = new Map<string, ErrorStore>();\r\n\r\n    // Aggiorna il nuovo stato notificando l'observer\r\n    this.store.next(newMap);\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}