{
  "version": 3,
  "sources": ["../../../src/managers/ToastManager/ToastManager.ts"],
  "sourcesContent": ["import isEqual from 'lodash.isequal';\nimport { DEFAULT_TOAST_LIFETIME } from 'constants/transactions.constants';\nimport {\n  customToastCloseHandlersDictionary,\n  customToastComponentDictionary,\n  removeAllCustomToasts,\n  removeCustomToast,\n  removeTransactionToast,\n  addTransactionToast,\n  createCustomToast\n} from 'store/actions/toasts/toastsActions';\nimport {\n  getIsTransactionFailed,\n  getIsTransactionSuccessful,\n  getIsTransactionTimedOut\n} from 'store/actions/transactions/transactionStateByStatus';\n\nimport { CustomToastType } from 'store/slices/toast/toastSlice.types';\nimport { getStore } from 'store/store';\nimport { createToastsFromTransactions } from './helpers/createToastsFromTransactions';\nimport { LifetimeManager } from './helpers/LifetimeManager';\nimport { ToastUICoordinator } from './ToastUICoordinator';\nimport { ITransactionToast } from './types';\n\ninterface IToastManager {\n  successfulToastLifetime?: number;\n}\n\nexport class ToastManager {\n  private readonly lifetimeManager: LifetimeManager;\n  private store: ReturnType<typeof getStore>;\n  private static instance: ToastManager;\n  private transactionToasts: ITransactionToast[] = [];\n  private customToasts: CustomToastType[] = [];\n  private successfulToastLifetime?: number;\n  private unsubscribeFromStore: () => void = () => null;\n  private uiCoordinator: ToastUICoordinator | null = null;\n\n  constructor(props?: {\n    store?: ReturnType<typeof getStore>;\n    lifetimeManager?: LifetimeManager;\n    uiCoordinator?: ToastUICoordinator;\n  }) {\n    this.destroy();\n    this.store = props?.store || getStore();\n    this.lifetimeManager = props?.lifetimeManager ?? new LifetimeManager();\n    this.uiCoordinator =\n      props?.uiCoordinator ??\n      new ToastUICoordinator({\n        onCloseToast: this.closeToast.bind(this)\n      });\n  }\n\n  public async init({\n    successfulToastLifetime = DEFAULT_TOAST_LIFETIME\n  }: IToastManager = {}) {\n    this.successfulToastLifetime = successfulToastLifetime;\n\n    this.lifetimeManager.init({ successfulToastLifetime });\n\n    await this.updateTransactionToastsList();\n    await this.updateCustomToastList();\n\n    await this.uiCoordinator?.init();\n\n    this.unsubscribeFromStore = this.store.subscribe(\n      async (\n        { toasts, transactions },\n        { toasts: prevToasts, transactions: prevTransactions }\n      ) => {\n        const newToastsWereCreated = !isEqual(\n          prevToasts.transactionToasts,\n          toasts.transactionToasts\n        );\n        const checkBatchHasNewData = !isEqual(prevTransactions, transactions);\n\n        if (newToastsWereCreated || checkBatchHasNewData) {\n          await this.updateTransactionToastsList();\n        }\n\n        const newCustomToastsWereCreated = !isEqual(\n          prevToasts.customToasts,\n          toasts.customToasts\n        );\n\n        if (newCustomToastsWereCreated) {\n          await this.updateCustomToastList();\n        }\n      }\n    );\n  }\n\n  public static getInstance(): ToastManager {\n    if (!ToastManager.instance) {\n      ToastManager.instance = new ToastManager();\n    }\n    return ToastManager.instance;\n  }\n\n  private handleCompletedTransaction(toastId: string): boolean {\n    const { transactions } = this.store.getState();\n    const transaction = transactions[toastId];\n\n    if (!transaction) {\n      return false;\n    }\n\n    const { status } = transaction;\n    const isTimedOut = getIsTransactionTimedOut(status);\n    const isFailed = getIsTransactionFailed(status);\n    const isSuccessful = getIsTransactionSuccessful(status);\n    const isCompleted = isFailed || isSuccessful || isTimedOut;\n\n    if (isCompleted) {\n      if (this.successfulToastLifetime) {\n        this.lifetimeManager.start(toastId);\n      }\n      return isCompleted;\n    }\n\n    this.lifetimeManager.stop(toastId);\n    return isCompleted;\n  }\n\n  public async createTransactionToast(\n    toastId: string,\n    totalDuration: number\n  ): Promise<string> {\n    const newToastId = addTransactionToast({\n      toastId,\n      totalDuration\n    });\n\n    this.handleCompletedTransaction(toastId);\n    await this.updateTransactionToastsList();\n    return newToastId;\n  }\n\n  public async createCustomToast(toast: CustomToastType): Promise<string> {\n    const toastId = createCustomToast(toast);\n    await this.updateCustomToastList();\n    return toastId;\n  }\n\n  private async updateTransactionToastsList() {\n    const store = this.store.getState();\n    const { toasts: toastList } = store;\n\n    const { pendingTransactionToasts, completedTransactionToasts } =\n      await createToastsFromTransactions({\n        store\n      });\n\n    this.transactionToasts = [\n      ...pendingTransactionToasts,\n      ...completedTransactionToasts\n    ];\n\n    for (const toast of toastList.transactionToasts) {\n      this.handleCompletedTransaction(toast.toastId);\n    }\n\n    await this.publishTransactionToasts();\n  }\n\n  private async updateCustomToastList() {\n    const { toasts: toastList } = this.store.getState();\n    this.customToasts = [];\n\n    for (const toast of toastList.customToasts) {\n      const isSimpleToast = 'message' in toast;\n\n      const newToast: CustomToastType = isSimpleToast\n        ? { ...toast }\n        : {\n            ...toast,\n            instantiateToastElement:\n              customToastComponentDictionary[toast.toastId]\n          };\n      this.customToasts.push(newToast);\n\n      if (toast.duration) {\n        this.lifetimeManager.startWithCustomDuration(\n          toast.toastId,\n          toast.duration\n        );\n      }\n    }\n    await this.uiCoordinator?.publishCustomToasts(this.customToasts);\n  }\n\n  private handleTransactionToastClose(toastId: string): boolean {\n    const isCompleted = this.handleCompletedTransaction(toastId);\n\n    if (isCompleted) {\n      removeTransactionToast(toastId);\n      return true;\n    }\n\n    return false;\n  }\n\n  public async showToasts() {\n    this.uiCoordinator?.showToasts();\n    await this.updateCustomToastList();\n    await this.updateTransactionToastsList();\n  }\n\n  public hideToasts() {\n    this.uiCoordinator?.hideToasts();\n  }\n\n  public closeToast(toastId: string): boolean {\n    const customToast = this.customToasts.find(\n      (toast) => toast.toastId === toastId\n    );\n\n    if (customToast) {\n      this.lifetimeManager.stop(toastId);\n      const handleClose = customToastCloseHandlersDictionary[toastId];\n      handleClose?.();\n      removeCustomToast(toastId);\n      return true;\n    }\n\n    return this.handleTransactionToastClose(toastId);\n  }\n\n  private async publishTransactionToasts() {\n    await this.uiCoordinator?.publishTransactionToasts(this.transactionToasts);\n  }\n\n  public destroy() {\n    this.unsubscribeFromStore();\n    this.lifetimeManager?.destroy();\n    this.uiCoordinator?.destroy();\n    removeAllCustomToasts();\n  }\n}\n"],
  "mappings": "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",
  "names": ["ToastManager_exports", "__export", "ToastManager", "__toCommonJS", "import_lodash", "import_transactions", "import_toastsActions", "import_transactionStateByStatus", "import_store", "import_createToastsFromTransactions", "import_LifetimeManager", "import_ToastUICoordinator", "props", "successfulToastLifetime", "toasts", "transactions", "prevToasts", "prevTransactions", "newToastsWereCreated", "isEqual", "checkBatchHasNewData", "toastId", "transaction", "status", "isTimedOut", "isFailed", "isSuccessful", "isCompleted", "totalDuration", "newToastId", "toast", "store", "toastList", "pendingTransactionToasts", "completedTransactionToasts", "newToast", "handleClose"]
}
