{"version":3,"file":"Toast.mjs","sources":["../../../../src/components/Toast/Toast.tsx"],"sourcesContent":["'use client'\n\nimport { Fragment, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport {\n  CancelIcon,\n  CheckCircleFilledIcon,\n  ErrorTriangleFilledIcon,\n  InfoFilledIcon,\n  WifiIcon,\n  WifiOffIcon,\n} from '@channel.io/bezier-icons'\nimport classNames from 'classnames'\n\nimport useIsMounted from '~/src/hooks/useIsMounted'\nimport { getZIndexClassName } from '~/src/types/props-helpers'\nimport { ariaAttr } from '~/src/utils/aria'\nimport { noop } from '~/src/utils/function'\nimport { createContext } from '~/src/utils/react'\nimport { px } from '~/src/utils/style'\nimport { isString } from '~/src/utils/type'\n\nimport { BaseButton } from '~/src/components/BaseButton'\nimport { Icon } from '~/src/components/Icon'\nimport { Text } from '~/src/components/Text'\nimport { InvertedThemeProvider } from '~/src/components/ThemeProvider'\nimport { useRootElement, useWindow } from '~/src/components/WindowProvider'\n\nimport {\n  type ToastContextValue,\n  type ToastPlacement,\n  type ToastPreset,\n  type ToastProps,\n  type ToastProviderProps,\n  type ToastType,\n} from './Toast.types'\nimport useToastProviderValues from './useToastContextValues'\n\nimport styles from './Toast.module.scss'\n\nfunction getToastPreset(preset: ToastPreset) {\n  return (\n    {\n      success: {\n        icon: CheckCircleFilledIcon,\n        appearance: 'success',\n      },\n      error: {\n        icon: ErrorTriangleFilledIcon,\n        appearance: 'error',\n      },\n      offline: {\n        icon: WifiOffIcon,\n        appearance: 'warning',\n      },\n      online: {\n        icon: WifiIcon,\n        appearance: 'success',\n      },\n      default: {\n        icon: InfoFilledIcon,\n        appearance: 'info',\n      },\n    } as const\n  )[preset]\n}\n\nexport function Toast({\n  placement,\n  appearance: appearanceProp,\n  preset = 'default',\n  icon: iconProp,\n  content,\n  zIndex = 'toast',\n  autoDismiss = true,\n  autoDismissTimeout,\n  version = 0,\n  onDismiss,\n}: ToastProps) {\n  const { window } = useWindow()\n\n  const dismissTimer = useRef<ReturnType<Window['setTimeout']>>(undefined)\n\n  const [isSlidingOut, setIsSlidingOut] = useState(false)\n\n  const className = classNames(\n    styles.ToastElement,\n    getZIndexClassName(zIndex),\n    placement && styles[`placement-${placement}`],\n    isSlidingOut && styles['slide-out']\n  )\n\n  const runSlideOutAnimation = useCallback(() => {\n    setIsSlidingOut(true)\n  }, [])\n\n  const handleAnimationEnd = useCallback<React.AnimationEventHandler>(\n    (event) => {\n      if (\n        event.animationName === styles['slide-out-left'] ||\n        event.animationName === styles['slide-out-right']\n      ) {\n        onDismiss?.()\n      }\n    },\n    [onDismiss]\n  )\n\n  useEffect(\n    function startDismissTimer() {\n      if (autoDismiss) {\n        dismissTimer.current = window.setTimeout(\n          runSlideOutAnimation,\n          autoDismissTimeout\n        )\n      }\n\n      return function cleanup() {\n        if (dismissTimer.current != null) {\n          clearTimeout(dismissTimer.current)\n        }\n      }\n    },\n    [autoDismiss, autoDismissTimeout, runSlideOutAnimation, window, version]\n  )\n\n  const { appearance, icon } = getToastPreset(preset)\n\n  return (\n    <div\n      role=\"status\"\n      className={className}\n      onAnimationEnd={handleAnimationEnd}\n      aria-hidden={ariaAttr(isSlidingOut)}\n    >\n      <div\n        className={classNames(\n          styles.IconWrapper,\n          styles[`appearance-${appearanceProp ?? appearance}`]\n        )}\n      >\n        <Icon\n          source={iconProp ?? icon}\n          size=\"s\"\n        />\n      </div>\n\n      <div className={styles.Content}>\n        <Text\n          className={styles.EllipsisableContent}\n          typo=\"14\"\n          color=\"text-neutral\"\n          truncated={5}\n        >\n          {isString(content)\n            ? content.split('\\n').map((str, index) => (\n                // eslint-disable-next-line react/no-array-index-key\n                <Fragment key={index}>\n                  {index !== 0 && <br />}\n                  {str}\n                </Fragment>\n              ))\n            : content}\n        </Text>\n      </div>\n\n      <BaseButton\n        className={styles.Close}\n        onClick={runSlideOutAnimation}\n      >\n        <Icon\n          source={CancelIcon}\n          size=\"xs\"\n        />\n      </BaseButton>\n    </div>\n  )\n}\n\nconst [ToastContextProvider, useToastContext] =\n  createContext<ToastContextValue>({\n    add: () => '',\n    update: () => '',\n    remove: noop,\n    removeAll: noop,\n    leftToasts: [],\n    rightToasts: [],\n  })\n\nconst DEFAULT_OFFSET = {\n  left: 0,\n  right: 0,\n  bottom: 0,\n}\n\nexport function ToastProvider({\n  autoDismissTimeout = 3000,\n  container: givenContainer,\n  zIndex = 'toast',\n  offset = DEFAULT_OFFSET,\n  children = [],\n}: ToastProviderProps) {\n  const rootElement = useRootElement()\n  const isMounted = useIsMounted()\n\n  const toastContextValue = useToastProviderValues()\n  const { leftToasts, rightToasts, dismiss } = toastContextValue\n  const container = givenContainer ?? rootElement\n\n  const createContainer = useCallback(\n    (placement: ToastPlacement, toasts: ToastType[]) => (\n      <InvertedThemeProvider key={placement}>\n        <div\n          style={{\n            bottom: px(offset?.bottom ?? DEFAULT_OFFSET.bottom),\n            ...(placement === 'bottom-right'\n              ? { right: px(offset?.right ?? DEFAULT_OFFSET.right) }\n              : { left: px(offset?.left ?? DEFAULT_OFFSET.left) }),\n          }}\n          className={classNames(\n            styles.ToastContainer,\n            getZIndexClassName(zIndex)\n          )}\n        >\n          {toasts.map(({ id, onDismiss, ...rest }) => (\n            <Toast\n              {...rest}\n              key={id}\n              placement={placement}\n              autoDismissTimeout={autoDismissTimeout}\n              onDismiss={() => dismiss(id, onDismiss)}\n            />\n          ))}\n        </div>\n      </InvertedThemeProvider>\n    ),\n    [autoDismissTimeout, dismiss, offset, zIndex]\n  )\n\n  return (\n    <ToastContextProvider value={toastContextValue}>\n      {children}\n      {isMounted &&\n        createPortal(\n          [\n            createContainer('bottom-left', leftToasts),\n            createContainer('bottom-right', rightToasts),\n          ],\n          container\n        )}\n    </ToastContextProvider>\n  )\n}\n\nexport function useToast() {\n  const context = useToastContext()\n\n  if (!context) {\n    throw Error(\"'useToast' must be used within 'ToastProvider'\")\n  }\n\n  return {\n    addToast: context.add,\n    updateToast: context.update,\n    removeToast: context.remove,\n    removeAllToasts: context.removeAll,\n    leftToasts: context.leftToasts,\n    rightToasts: context.rightToasts,\n  }\n}\n"],"names":["getToastPreset","preset","success","icon","CheckCircleFilledIcon","appearance","error","ErrorTriangleFilledIcon","offline","WifiOffIcon","online","WifiIcon","default","InfoFilledIcon","Toast","placement","appearanceProp","iconProp","content","zIndex","autoDismiss","autoDismissTimeout","version","onDismiss","window","useWindow","dismissTimer","useRef","undefined","isSlidingOut","setIsSlidingOut","useState","className","classNames","styles","ToastElement","getZIndexClassName","runSlideOutAnimation","useCallback","handleAnimationEnd","event","animationName","useEffect","startDismissTimer","current","setTimeout","cleanup","clearTimeout","_jsxs","role","onAnimationEnd","ariaAttr","children","_jsx","IconWrapper","Icon","source","size","Content","Text","EllipsisableContent","typo","color","truncated","isString","split","map","str","index","Fragment","BaseButton","Close","onClick","CancelIcon","ToastContextProvider","useToastContext","createContext","add","update","remove","noop","removeAll","leftToasts","rightToasts","DEFAULT_OFFSET","left","right","bottom","ToastProvider","container","givenContainer","offset","rootElement","useRootElement","isMounted","useIsMounted","toastContextValue","useToastProviderValues","dismiss","createContainer","toasts","_offset$bottom","_offset$right","_offset$left","InvertedThemeProvider","style","px","ToastContainer","id","rest","_createElement","key","value","createPortal","useToast","context","Error","addToast","updateToast","removeToast","removeAllToasts"],"mappings":"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"}