import classNames from "classnames"; import React from "react"; import { createPortal } from "react-dom"; import { usePopper } from "react-popper"; import Menu, { MenuItems } from "./Menu"; import "./PopupMenu.css"; export interface PopupMenuProps { items: MenuItems; children?: React.ReactNode; containerClassName?: string; containerStyle?: React.CSSProperties; } const PopupMenu: React.FC = ({ items, children, containerClassName, containerStyle, }) => { const [show, setShow] = React.useState(false); const [referenceElement, setReferenceElement] = React.useState(null); const [popperElement, setPopperElement] = React.useState(null); const { styles, attributes } = usePopper(referenceElement, popperElement); React.useEffect(() => { const handler = (event: MouseEvent): void => { let element: HTMLElement | null = event.target as HTMLElement; while (element) { if (element == referenceElement || element == popperElement) { return; } element = element.parentElement; } setShow(false); }; document.addEventListener("click", handler); return () => { document.removeEventListener("click", handler); }; }, [referenceElement, popperElement]); return ( <>
setShow(true)} > {children}
{show ? createPortal(
{ setShow(false); }} />
, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion document.getElementById("portal")! ) : null} ); }; export default PopupMenu;