UNPKG

monday-ui-react-core

Version:

Official monday.com UI resources for application development in React.js

91 lines (76 loc) 1.95 kB
import { useCallback } from "react"; import useKeyEvent from "../../../../hooks/useKeyEvent"; const KEYS = ["Enter", "ArrowRight"]; export default function useMenuItemKeyboardEvents( onClick, disabled, isActive, index, setActiveItemIndex, hasChildren, shouldShowSubMenu, setSubMenuIsOpenByIndex, menuRef, isMouseEnter, closeMenu ) { const onClickCallback = useCallback( event => { event.preventDefault(); event.stopPropagation(); if (!isActive && !isMouseEnter) return; if (!setActiveItemIndex || !setSubMenuIsOpenByIndex) { console.error("MenuItem must be a first level child of a menu"); return; } if (isActive && hasChildren) { setActiveItemIndex(index); setSubMenuIsOpenByIndex(index, true); return; } if (shouldShowSubMenu) return; const isKeyEvent = !!event.key; const clickCallback = () => { onClick(event); closeMenu({ propagate: true }); }; if (isKeyEvent && onClick && !disabled && isActive) { clickCallback(); } if (!isKeyEvent && onClick && !disabled && isMouseEnter) { if (!isActive) { setActiveItemIndex(index); if (hasChildren) { setSubMenuIsOpenByIndex(index, true); } } if (!hasChildren) { // wait for background of menu item to change before trigger click requestAnimationFrame(() => { requestAnimationFrame(() => { clickCallback(); }); }); } } }, [ onClick, disabled, isActive, index, setActiveItemIndex, hasChildren, shouldShowSubMenu, setSubMenuIsOpenByIndex, isMouseEnter ] ); useKeyEvent({ keys: KEYS, callback: onClickCallback, ref: menuRef, preventDefault: true }); return { onClickCallback }; }