UNPKG

@coreui/react-pro

Version:

UI Components Library for React.js

97 lines (94 loc) 3.35 kB
import { __assign } from '../node_modules/tslib/tslib.es6.js'; import { useRef, useState, useEffect } from 'react'; import { usePopper } from './usePopper.js'; import isRTL from '../utils/isRTL.js'; var useDropdownWithPopper = function (popperConfig) { var dropdownRefElement = useRef(null); var dropdownMenuElement = useRef(null); var _a = useState(false), isOpen = _a[0], setIsOpen = _a[1]; var _b = usePopper(), popper = _b.popper, initPopper = _b.initPopper, destroyPopper = _b.destroyPopper; var _popperConfig = __assign({ placement: (isRTL(dropdownRefElement.current) ? 'bottom-end' : 'bottom-start'), modifiers: [ { name: 'preventOverflow', options: { boundary: 'clippingParents', }, }, { name: 'offset', options: { offset: [0, 2], }, }, ] }, popperConfig); var closeDropdown = function () { setIsOpen(false); }; var openDropdown = function () { setIsOpen(true); }; var toggleDropdown = function () { setIsOpen(function (prev) { return !prev; }); }; var updatePopper = function () { if (popper) { popper.update(); } }; var handleKeyUp = function (event) { if (event.key === 'Escape') { setIsOpen(false); return; } if (event.key === 'Tab') { if (dropdownRefElement.current && dropdownRefElement.current.contains(document.activeElement)) { return; } if (dropdownMenuElement.current && dropdownMenuElement.current.contains(document.activeElement)) { return; } setIsOpen(false); } }; var handleMouseUp = function (event) { if ((dropdownMenuElement.current && dropdownMenuElement.current.contains(event.target)) || (dropdownRefElement.current && dropdownRefElement.current.contains(event.target))) { return; } setIsOpen(false); }; useEffect(function () { if (isOpen) { window.addEventListener('mouseup', handleMouseUp); window.addEventListener('keyup', handleKeyUp); if (dropdownRefElement.current && dropdownMenuElement.current) { initPopper(dropdownRefElement.current, dropdownMenuElement.current, _popperConfig); } } else { window.removeEventListener('mouseup', handleMouseUp); window.removeEventListener('keyup', handleKeyUp); destroyPopper(); } return function () { window.removeEventListener('mouseup', handleMouseUp); window.removeEventListener('keyup', handleKeyUp); destroyPopper(); }; }, [isOpen]); return { dropdownMenuElement: dropdownMenuElement, dropdownRefElement: dropdownRefElement, isOpen: isOpen, closeDropdown: closeDropdown, openDropdown: openDropdown, toggleDropdown: toggleDropdown, updatePopper: updatePopper, }; }; export { useDropdownWithPopper }; //# sourceMappingURL=useDropdownWithPopper.js.map