{"version":3,"file":"Toaster.cjs","sourceRoot":"","sources":["../../../src/components/Toast/Toaster.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from 'react';\n\nimport { twMerge } from '../../utils/tw-merge';\n\nimport { Toast } from './Toast';\nimport {\n  TOAST_ANIMATION_DURATION,\n  TOAST_VISIBILITY_DURATION,\n} from './Toast.constants';\nimport type {\n  ToastOptions,\n  ToastProps,\n  ToasterProps,\n  ToasterRef,\n} from './Toast.types';\n\ntype ToastStoreListener = (options: ToastOptions | undefined) => void;\n\nlet storeToastOptions: ToastOptions | undefined;\nconst toastStoreListeners = new Set<ToastStoreListener>();\n\nconst normalizeToastOptions = (options: ToastOptions): ToastOptions => ({\n  hasNoTimeout: false,\n  ...options,\n});\n\nconst emitToastStoreChange = () => {\n  toastStoreListeners.forEach((listener) => listener(storeToastOptions));\n};\n\nconst setStoreToastOptions = (options: ToastOptions) => {\n  storeToastOptions = normalizeToastOptions(options);\n  emitToastStoreChange();\n};\n\nconst clearStoreToastOptions = () => {\n  storeToastOptions = undefined;\n  emitToastStoreChange();\n};\n\nconst subscribeToToastStore = (listener: ToastStoreListener) => {\n  toastStoreListeners.add(listener);\n  listener(storeToastOptions);\n\n  return () => {\n    toastStoreListeners.delete(listener);\n  };\n};\n\nconst getToastProps = ({\n  hasNoTimeout: _hasNoTimeout,\n  showCloseButton: _showCloseButton,\n  ...toastProps\n}: ToastOptions): ToastProps => toastProps;\n\nconst ToasterComponent = forwardRef<ToasterRef, ToasterProps>(\n  ({ className, ...props }, ref) => {\n    const [toastOptions, setToastOptions] = useState<ToastOptions | undefined>(\n      undefined,\n    );\n    const toastOptionsRef = useRef<ToastOptions | undefined>(undefined);\n    const [isVisible, setIsVisible] = useState(false);\n    const isVisibleRef = useRef(false);\n    const replacementTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n      null,\n    );\n    const autoDismissTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n      null,\n    );\n    const exitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n    const enterAnimationFrameRef = useRef<number | null>(null);\n    const pendingToastRef = useRef<ToastOptions | undefined>(undefined);\n\n    const setCurrentToastOptions = useCallback(\n      (options: ToastOptions | undefined) => {\n        toastOptionsRef.current = options;\n        setToastOptions(options);\n      },\n      [],\n    );\n\n    const setCurrentIsVisible = useCallback((nextIsVisible: boolean) => {\n      isVisibleRef.current = nextIsVisible;\n      setIsVisible(nextIsVisible);\n    }, []);\n\n    const clearPendingTimers = useCallback(() => {\n      if (replacementTimerRef.current !== null) {\n        clearTimeout(replacementTimerRef.current);\n        replacementTimerRef.current = null;\n      }\n      if (autoDismissTimerRef.current !== null) {\n        clearTimeout(autoDismissTimerRef.current);\n        autoDismissTimerRef.current = null;\n      }\n      if (exitTimerRef.current !== null) {\n        clearTimeout(exitTimerRef.current);\n        exitTimerRef.current = null;\n      }\n      if (enterAnimationFrameRef.current !== null) {\n        cancelAnimationFrame(enterAnimationFrameRef.current);\n        enterAnimationFrameRef.current = null;\n      }\n    }, []);\n\n    const closeRenderedToast = useCallback(() => {\n      if (!toastOptionsRef.current && !isVisibleRef.current) {\n        clearPendingTimers();\n        pendingToastRef.current = undefined;\n        return;\n      }\n\n      clearPendingTimers();\n      pendingToastRef.current = undefined;\n      setCurrentIsVisible(false);\n      exitTimerRef.current = setTimeout(() => {\n        exitTimerRef.current = null;\n        setCurrentToastOptions(undefined);\n      }, TOAST_ANIMATION_DURATION);\n    }, [clearPendingTimers, setCurrentIsVisible, setCurrentToastOptions]);\n\n    // Replace the currently mounted toast rather than queueing multiple toasts.\n    // This mirrors the old app-level toast service behavior while keeping the\n    // imperative API centered in the shared single-toast store.\n    const showRenderedToast = useCallback(\n      (options: ToastOptions) => {\n        const normalizedOptions = normalizeToastOptions(options);\n        const timeoutDuration = 0;\n\n        if (toastOptionsRef.current) {\n          pendingToastRef.current = normalizedOptions;\n          setCurrentIsVisible(false);\n          if (exitTimerRef.current !== null) {\n            clearTimeout(exitTimerRef.current);\n            exitTimerRef.current = null;\n          }\n          exitTimerRef.current = setTimeout(() => {\n            exitTimerRef.current = null;\n            setCurrentToastOptions(pendingToastRef.current);\n            pendingToastRef.current = undefined;\n          }, TOAST_ANIMATION_DURATION);\n          return;\n        }\n\n        if (replacementTimerRef.current !== null) {\n          clearTimeout(replacementTimerRef.current);\n        }\n\n        replacementTimerRef.current = setTimeout(() => {\n          replacementTimerRef.current = null;\n          setCurrentToastOptions(normalizedOptions);\n        }, timeoutDuration);\n      },\n      [setCurrentIsVisible, setCurrentToastOptions],\n    );\n\n    useImperativeHandle(\n      ref,\n      () => ({\n        closeToast: clearStoreToastOptions,\n        showToast: setStoreToastOptions,\n      }),\n      [],\n    );\n\n    // Subscribe before sibling passive effects run so toast() can be called\n    // from anywhere once the app root has rendered <Toaster />.\n    useLayoutEffect(() => {\n      return subscribeToToastStore((options) => {\n        if (options) {\n          showRenderedToast(options);\n          return;\n        }\n\n        closeRenderedToast();\n      });\n    }, [closeRenderedToast, showRenderedToast]);\n\n    // Delay the enter transition until after mount so the DOM can paint the\n    // offscreen starting position before we slide the toast into view.\n    useEffect(() => {\n      if (toastOptions && !isVisible) {\n        enterAnimationFrameRef.current = requestAnimationFrame(() => {\n          enterAnimationFrameRef.current = requestAnimationFrame(() => {\n            setCurrentIsVisible(true);\n            enterAnimationFrameRef.current = null;\n          });\n        });\n      }\n      return () => {\n        clearPendingTimers();\n      };\n    }, [clearPendingTimers, setCurrentIsVisible, toastOptions]); // intentionally omit isVisible — only react to new toast options\n\n    // Auto-dismiss once the toast is visible, unless the caller requested a\n    // persistent toast.\n    useEffect(() => {\n      if (isVisible && toastOptions && !toastOptions.hasNoTimeout) {\n        autoDismissTimerRef.current = setTimeout(() => {\n          autoDismissTimerRef.current = null;\n          clearStoreToastOptions();\n        }, TOAST_VISIBILITY_DURATION);\n        return () => {\n          clearPendingTimers();\n        };\n      }\n      return undefined;\n    }, [clearPendingTimers, isVisible, toastOptions]);\n\n    useEffect(() => {\n      return () => {\n        clearPendingTimers();\n        pendingToastRef.current = undefined;\n        toastOptionsRef.current = undefined;\n        isVisibleRef.current = false;\n      };\n    }, [clearPendingTimers]);\n\n    if (!toastOptions) {\n      return null;\n    }\n\n    const { showCloseButton = true } = toastOptions;\n    const {\n      onClose: toastOnClose,\n      className: toastClassName,\n      ...toastProps\n    } = getToastProps(toastOptions);\n    const handleClose = showCloseButton\n      ? () => {\n          clearStoreToastOptions();\n          toastOnClose?.();\n        }\n      : undefined;\n\n    return (\n      <div\n        role=\"status\"\n        aria-live=\"polite\"\n        aria-atomic=\"true\"\n        className={twMerge(\n          'pointer-events-none fixed inset-x-4 bottom-4 z-[1000] flex justify-center',\n          className,\n        )}\n        {...props}\n      >\n        <div\n          className=\"pointer-events-auto w-full transition-transform ease-in-out\"\n          style={{\n            transitionDuration: `${TOAST_ANIMATION_DURATION}ms`,\n            transform: isVisible\n              ? 'translateY(0)'\n              : 'translateY(calc(100% + 16px))',\n          }}\n        >\n          <Toast\n            {...toastProps}\n            className={toastClassName}\n            onClose={handleClose}\n          />\n        </div>\n      </div>\n    );\n  },\n);\n\nToasterComponent.displayName = 'Toaster';\n\ntype ToastFunction = ((options: ToastOptions) => void) & {\n  dismiss: () => void;\n};\n\nexport const Toaster = ToasterComponent;\n\nexport const toast = ((options: ToastOptions) => {\n  setStoreToastOptions(options);\n}) as ToastFunction;\n\ntoast.dismiss = () => {\n  clearStoreToastOptions();\n};\n"]}