import type { FC } from '../../lib/teact/teact'; import React, { useState, useRef, useCallback } 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; onHide?: NoneToVoidFunction; onTransitionEnd?: NoneToVoidFunction; children: React.ReactNode; }; const DropdownMenu: FC = ({ trigger, className, children, positionX = 'left', positionY = 'top', footer, forceOpen, onOpen, onClose, onTransitionEnd, onHide, }) => { // 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) { onClose?.(); } else { 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 = useCallback(() => { setIsOpen(false); onClose?.(); }, [onClose]); return (
{trigger({ onTrigger: toggleIsOpen, isOpen })} {children}
); }; export default DropdownMenu;