{"version":3,"sources":["../src/components/Toast/ToastContainer/useToastContainer.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n  getIntrinsicElementProps,\n  isHTMLElement,\n  slot,\n  useEventCallback,\n  useId,\n  useIsomorphicLayoutEffect,\n  useMergedRefs,\n} 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 [isFocusWithinStack, setIsFocusWithinStack] = React.useState(false);\n  const imperativePauseRef = React.useRef(false);\n  const hoverPauseRef = React.useRef(false);\n  const windowBlurPauseRef = 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 || hoverPauseRef.current || windowBlurPauseRef.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?.parentElement?.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  const onWindowFocus = useEventCallback(() => {\n    windowBlurPauseRef.current = false;\n    play();\n  });\n  const onWindowBlur = useEventCallback(() => {\n    windowBlurPauseRef.current = true;\n    pause();\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', onWindowFocus);\n    targetDocument.defaultView?.addEventListener('blur', onWindowBlur);\n    return () => {\n      targetDocument.defaultView?.removeEventListener('focus', onWindowFocus);\n      targetDocument.defaultView?.removeEventListener('blur', onWindowBlur);\n    };\n  }, [targetDocument, onWindowBlur, onWindowFocus, pauseOnWindowBlur]);\n\n  React.useEffect(() => {\n    if (isFocusWithinStack) {\n      pause();\n    } else {\n      play();\n    }\n  }, [isFocusWithinStack, pause, play]);\n\n  useIsomorphicLayoutEffect(() => {\n    const stack = toastRef.current?.parentElement;\n    if (!stack) {\n      return;\n    }\n\n    if (isHTMLElement(targetDocument?.activeElement) && stack.contains(targetDocument.activeElement)) {\n      setIsFocusWithinStack(true);\n      pause();\n    }\n\n    const onFocusIn = () => {\n      setIsFocusWithinStack(true);\n      pause();\n    };\n    const onFocusOut = (e: FocusEvent) => {\n      if (!stack.contains(isHTMLElement(e.relatedTarget) ? e.relatedTarget : null)) {\n        setIsFocusWithinStack(false);\n      }\n    };\n\n    stack.addEventListener('focusin', onFocusIn);\n    stack.addEventListener('focusout', onFocusOut);\n    return () => {\n      stack.removeEventListener('focusin', onFocusIn);\n      stack.removeEventListener('focusout', onFocusOut);\n    };\n  }, [pause, targetDocument]);\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      hoverPauseRef.current = true;\n      pause();\n    }\n    userRootSlot?.onMouseEnter?.(e);\n  });\n\n  const onMouseLeave = useEventCallback((e: React.MouseEvent<HTMLDivElement>) => {\n    if (pauseOnHover) {\n      hoverPauseRef.current = false;\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","isFocusWithinStack","setIsFocusWithinStack","imperativePauseRef","hoverPauseRef","windowBlurPauseRef","focusedToastBeforeClose","useEventCallback","activeElement","current","contains","reportStatus","status","pause","play","containsActive","parentElement","useImperativeHandle","focus","onWindowFocus","onWindowBlur","useEffect","defaultView","addEventListener","removeEventListener","useIsomorphicLayoutEffect","stack","isHTMLElement","onFocusIn","onFocusOut","e","relatedTarget","usePausableTimer","onTimeout","resetKey","resolvedPoliteness","textContent","userRootSlot","root","onMouseEnter","onMouseLeave","onKeyDown","key","Delete","preventDefault","components","slot","always","getIntrinsicElementProps","useMergedRefs","tabIndex","role","elementType","nodeRef"],"mappings":"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"}