{"version":3,"sources":["../src/components/Toast/ToastContainer/useToastContainer.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { getIntrinsicElementProps, slot, useEventCallback, useId, useMergedRefs } from '@fluentui/react-utilities';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { Delete } from '@fluentui/keyboard-keys';\nimport type { ToastPoliteness, ToastStatus } from '@fluentui/react-toast';\nimport type { ToastContainerProps, ToastContainerState } from './ToastContainer.types';\nimport { usePausableTimer } from './usePausableTimer';\n\nconst intentPolitenessMap: Record<NonNullable<ToastContainerProps['intent']>, ToastPoliteness> = {\n  success: 'assertive',\n  warning: 'assertive',\n  error: 'assertive',\n  info: 'polite',\n};\n\n/**\n * The `useToastContainer` hook processes the props sent to `ToastContainer` and returns state and slot props.\n */\nexport const useToastContainer = (props: ToastContainerProps, ref: React.Ref<HTMLElement>): ToastContainerState => {\n  const {\n    visible,\n    children,\n    close: closeProp,\n    remove,\n    updateId,\n    onStatusChange,\n    data,\n    timeout = -1,\n    intent = 'info',\n    politeness,\n    pauseOnHover,\n    pauseOnWindowBlur,\n    imperativeRef,\n    tryRestoreFocus,\n    announce,\n    content: _content,\n    ...rest\n  } = props;\n\n  const titleId = useId('toast-title');\n  const bodyId = useId('toast-body');\n  const toastRef = React.useRef<HTMLDivElement | null>(null);\n  const { targetDocument } = useFluent_unstable();\n  const [running, setRunning] = React.useState(false);\n  const imperativePauseRef = React.useRef(false);\n  const focusedToastBeforeClose = React.useRef(false);\n\n  const close = useEventCallback(() => {\n    const activeElement = targetDocument?.activeElement;\n    if (activeElement && toastRef.current?.contains(activeElement)) {\n      focusedToastBeforeClose.current = true;\n    }\n\n    closeProp();\n  });\n\n  const reportStatus = useEventCallback((status: ToastStatus) => onStatusChange?.(null, { status, ...props }));\n  const pause = useEventCallback(() => setRunning(false));\n  const play = useEventCallback(() => {\n    if (imperativePauseRef.current) {\n      return;\n    }\n\n    if (timeout < 0) {\n      setRunning(true);\n      return;\n    }\n\n    const activeElement = targetDocument?.activeElement;\n    const containsActive = !!(activeElement && toastRef.current?.contains(activeElement));\n    if (!containsActive) {\n      setRunning(true);\n    }\n  });\n\n  React.useImperativeHandle(imperativeRef, () => ({\n    focus: () => {\n      toastRef.current?.focus();\n    },\n    play: () => {\n      imperativePauseRef.current = false;\n      play();\n    },\n    pause: () => {\n      imperativePauseRef.current = true;\n      pause();\n    },\n  }));\n\n  React.useEffect(() => {\n    return () => reportStatus('unmounted');\n  }, [reportStatus]);\n\n  React.useEffect(() => {\n    if (!targetDocument || !pauseOnWindowBlur) {\n      return;\n    }\n\n    targetDocument.defaultView?.addEventListener('focus', play);\n    targetDocument.defaultView?.addEventListener('blur', pause);\n    return () => {\n      targetDocument.defaultView?.removeEventListener('focus', play);\n      targetDocument.defaultView?.removeEventListener('blur', pause);\n    };\n  }, [targetDocument, pause, play, pauseOnWindowBlur]);\n\n  React.useEffect(() => {\n    if (!visible) {\n      return;\n    }\n\n    play();\n    reportStatus('visible');\n  }, [visible, play, reportStatus, updateId]);\n\n  usePausableTimer({ timeout, running, onTimeout: close, resetKey: updateId });\n\n  React.useEffect(() => {\n    if (!visible) {\n      reportStatus('dismissed');\n      remove();\n    }\n  }, [visible, remove, reportStatus]);\n\n  React.useEffect(() => {\n    return () => {\n      if (focusedToastBeforeClose.current) {\n        focusedToastBeforeClose.current = false;\n        tryRestoreFocus();\n      }\n    };\n  }, [tryRestoreFocus]);\n\n  React.useEffect(() => {\n    if (!visible || !announce) {\n      return;\n    }\n    const resolvedPoliteness = politeness ?? intentPolitenessMap[intent];\n    announce(toastRef.current?.textContent ?? '', { politeness: resolvedPoliteness });\n  }, [announce, politeness, intent, visible, updateId]);\n\n  const userRootSlot = (data as { root?: React.HTMLAttributes<HTMLDivElement> } | undefined)?.root;\n\n  const onMouseEnter = useEventCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    if (pauseOnHover) {\n      pause();\n    }\n    userRootSlot?.onMouseEnter?.(e);\n  });\n\n  const onMouseLeave = useEventCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    if (pauseOnHover) {\n      play();\n    }\n    userRootSlot?.onMouseLeave?.(e);\n  });\n\n  const onKeyDown = useEventCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n    if (e.key === Delete) {\n      e.preventDefault();\n      close();\n    }\n\n    userRootSlot?.onKeyDown?.(e);\n  });\n\n  return {\n    components: {\n      root: 'div',\n    },\n    root: slot.always(\n      getIntrinsicElementProps('div', {\n        ref: useMergedRefs(ref, toastRef),\n        children,\n        tabIndex: 0,\n        role: 'listitem',\n        'aria-labelledby': titleId,\n        'aria-describedby': bodyId,\n        ...rest,\n        ...userRootSlot,\n        onMouseEnter,\n        onMouseLeave,\n        onKeyDown,\n      }),\n      { elementType: 'div' },\n    ),\n    running,\n    visible,\n    remove,\n    close,\n    updateId,\n    nodeRef: toastRef,\n    intent,\n    titleId,\n    bodyId,\n  };\n};\n"],"names":["useToastContainer","intentPolitenessMap","success","warning","error","info","props","ref","visible","children","close","closeProp","remove","updateId","onStatusChange","data","timeout","intent","politeness","pauseOnHover","pauseOnWindowBlur","imperativeRef","tryRestoreFocus","announce","content","_content","rest","titleId","useId","bodyId","toastRef","React","useRef","targetDocument","useFluent_unstable","running","setRunning","useState","imperativePauseRef","focusedToastBeforeClose","useEventCallback","activeElement","current","contains","reportStatus","status","pause","play","containsActive","useImperativeHandle","focus","useEffect","defaultView","addEventListener","removeEventListener","usePausableTimer","onTimeout","resetKey","resolvedPoliteness","textContent","userRootSlot","root","onMouseEnter","e","onMouseLeave","onKeyDown","key","Delete","preventDefault","components","slot","always","getIntrinsicElementProps","useMergedRefs","tabIndex","role","elementType","nodeRef"],"mappings":"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"}