import React, { FC, useState, useRef } from '../../lib/teact/teact'; import Menu from './Menu'; import './DropdownMenu.scss'; type OwnProps = { className?: string; trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>; positionX?: 'left' | 'right'; positionY?: 'top' | 'bottom'; footer?: string; forceOpen?: boolean; onOpen?: NoneToVoidFunction; onClose?: NoneToVoidFunction; children: any; }; const DropdownMenu: FC = ({ trigger, className, children, positionX = 'left', positionY = 'top', footer, forceOpen, onOpen, onClose, }) => { // eslint-disable-next-line no-null/no-null const menuRef = useRef(null); // eslint-disable-next-line no-null/no-null const dropdownRef = useRef(null); const [isOpen, setIsOpen] = useState(false); const toggleIsOpen = () => { setIsOpen(!isOpen); if (isOpen) { if (onClose) onClose(); } else if (onOpen) onOpen(); }; const handleKeyDown = (e: React.KeyboardEvent) => { const menu = menuRef.current; if (!isOpen || e.keyCode !== 40 || !menu) { return; } const focusedElement = document.activeElement; const elementChildren = Array.from(menu.children); if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) { (elementChildren[0] as HTMLElement).focus(); } }; const handleClose = () => { setIsOpen(false); if (onClose) onClose(); }; return (
{trigger({ onTrigger: toggleIsOpen, isOpen })} {children}
); }; export default DropdownMenu;