/** * @file * @copyright 2022 Aleksej Komarov * @license MIT */ import { classes } from 'common/react'; import { Component, createRef, InfernoNode, RefObject } from 'inferno'; import { Box } from './Box'; import { logger } from '../logging'; import { Icon } from './Icon'; type MenuProps = { children: any; width: string; menuRef: RefObject; onOutsideClick: () => void; }; class Menu extends Component { private readonly handleClick: (event) => void; constructor(props) { super(props); this.handleClick = (event) => { if (!this.props.menuRef.current) { logger.log(`Menu.handleClick(): No ref`); return; } if (this.props.menuRef.current.contains(event.target)) { logger.log(`Menu.handleClick(): Inside`); } else { logger.log(`Menu.handleClick(): Outside`); this.props.onOutsideClick(); } }; } // eslint-disable-next-line react/no-deprecated componentWillMount() { window.addEventListener('click', this.handleClick); } componentWillUnmount() { window.removeEventListener('click', this.handleClick); } render() { const { width, children } = this.props; return (
{children}
); } } type MenuBarDropdownProps = { open: boolean; openWidth: string; children: any; disabled?: boolean; display: any; onMouseOver: () => void; onClick: () => void; onOutsideClick: () => void; className?: string; }; class MenuBarButton extends Component { private readonly menuRef: RefObject; constructor(props) { super(props); this.menuRef = createRef(); } render() { const { props } = this; const { open, openWidth, children, disabled, display, onMouseOver, onClick, onOutsideClick, ...boxProps } = props; const { className, ...rest } = boxProps; return (
{display} {open && ( {children} )}
); } } type MenuBarItemProps = { entry: string; children: any; openWidth: string; display: InfernoNode; setOpenMenuBar: (entry: string | null) => void; openMenuBar: string | null; setOpenOnHover: (flag: boolean) => void; openOnHover: boolean; disabled?: boolean; className?: string; }; export const Dropdown = (props: MenuBarItemProps) => { const { entry, children, openWidth, display, setOpenMenuBar, openMenuBar, setOpenOnHover, openOnHover, disabled, className, } = props; return ( { const open = openMenuBar === entry ? null : entry; setOpenMenuBar(open); setOpenOnHover(!openOnHover); }} onOutsideClick={() => { setOpenMenuBar(null); setOpenOnHover(false); }} onMouseOver={() => { if (openOnHover) { setOpenMenuBar(entry); } }}> {children} ); }; const MenuItemToggle = (props) => { const { value, displayText, onClick, checked } = props; return ( onClick(value)}>
{checked && }
{displayText}
); }; Dropdown.MenuItemToggle = MenuItemToggle; const MenuItem = (props) => { const { value, displayText, onClick } = props; return ( onClick(value)}> {displayText} ); }; Dropdown.MenuItem = MenuItem; const Separator = () => { return
; }; Dropdown.Separator = Separator; type MenuBarProps = { children: any; }; export const MenuBar = (props: MenuBarProps) => { const { children } = props; return {children}; }; MenuBar.Dropdown = Dropdown;