{"version":3,"file":"hooks.mjs","sources":["../../../../src/components/Menu/hooks.ts"],"sourcesContent":["import { RefObject, useEffect, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nconst modulo = (a: number, n: number) => ((a % n) + n) % n;\nconst UNFOCUSED = -1;\n\n/** @internal */\nexport interface UseMenuFocusProps {\n  localRef: RefObject<HTMLDivElement>;\n  isMenuOpen?: boolean;\n  close?: () => void;\n  onOpen?: (focusOnItem: (itemId: number) => void) => void;\n  onClose?: () => void;\n  onKeyDown?: React.KeyboardEventHandler;\n}\n\n/** @internal */\nexport type UseMenuFocusReturn = [(event: React.KeyboardEvent) => void];\n\n/** @internal */\nexport const useMenuFocus = ({\n  localRef,\n  isMenuOpen,\n  close,\n  onOpen,\n  onClose,\n  onKeyDown,\n}: UseMenuFocusProps): UseMenuFocusReturn => {\n  const [focusedItem, setFocusedItem] = useState(UNFOCUSED);\n\n  useEffect(() => {\n    if (isMenuOpen) {\n      setFocusedItem(0);\n    }\n  }, [isMenuOpen]);\n\n  useEffect(() => {\n    const menuItems = localRef?.current?.querySelectorAll<HTMLElement | HTMLButtonElement | HTMLAnchorElement>(\n      '[data-role=\"menuitem\"]:not([data-disabled])'\n    );\n    menuItems?.[focusedItem]?.focus();\n    menuItems?.forEach((menuItem, i) => {\n      menuItem.tabIndex = i === focusedItem ? 0 : -1;\n    });\n  }, [localRef, focusedItem]);\n\n  useEffectOnce(() => {\n    onOpen?.(setFocusedItem);\n  });\n\n  const handleKeys = (event: React.KeyboardEvent) => {\n    const menuItems = localRef?.current?.querySelectorAll<HTMLElement | HTMLButtonElement | HTMLAnchorElement>(\n      '[data-role=\"menuitem\"]:not([data-disabled])'\n    );\n    const menuItemsCount = menuItems?.length ?? 0;\n\n    switch (event.key) {\n      case 'ArrowUp':\n        event.preventDefault();\n        event.stopPropagation();\n        setFocusedItem(modulo(focusedItem - 1, menuItemsCount));\n        break;\n      case 'ArrowDown':\n        event.preventDefault();\n        event.stopPropagation();\n        setFocusedItem(modulo(focusedItem + 1, menuItemsCount));\n        break;\n      case 'ArrowLeft':\n        event.preventDefault();\n        event.stopPropagation();\n        setFocusedItem(UNFOCUSED);\n        close?.();\n        break;\n      case 'Home':\n        event.preventDefault();\n        event.stopPropagation();\n        setFocusedItem(0);\n        break;\n      case 'End':\n        event.preventDefault();\n        event.stopPropagation();\n        setFocusedItem(menuItemsCount - 1);\n        break;\n      case 'Enter':\n        event.preventDefault();\n        event.stopPropagation();\n        menuItems?.[focusedItem]?.click();\n        break;\n      case 'Escape':\n        onClose?.();\n        break;\n      case 'Tab':\n        event.preventDefault();\n        onClose?.();\n        break;\n      default:\n        break;\n    }\n\n    // Forward event to parent\n    onKeyDown?.(event);\n  };\n\n  return [handleKeys];\n};\n"],"names":[],"mappings":"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"}