glass-app-manager
Version:
Informatica's Glass Framework CLI for bootstrapping
67 lines (57 loc) • 1.54 kB
JavaScript
import React from "react";
import Popover from "react-tiny-popover";
export const isSubmenu = e => {
return e.target.classList.contains("menu__submenu");
};
export const isDisabledItem = e => {
return e.target.classList.contains("disabled");
};
export const openMenu = (open, setOpen, onChange) => {
if (open) {
return;
}
setOpen(true);
if (onChange) {
onChange(true);
}
};
export const closeMenu = (open, setOpen, onChange) => {
if (!open) {
return;
}
setOpen(false);
if (onChange) {
onChange(false);
}
};
export const toggleMenu = (open, setOpen, onChange) => {
if (open) {
closeMenu(open, setOpen, onChange);
} else {
openMenu(open, setOpen, onChange);
}
};
export const MenuOpener = ({ children, trigger, open, setOpen, onChange, ...rest }) => {
// Close the menu when an item (not a submenu) is clicked.
const handleClick = React.useCallback(
e => {
if (!isSubmenu(e) && !isDisabledItem(e)) {
closeMenu(open, setOpen, onChange);
}
},
[open, setOpen]
);
return (
<Popover
isOpen={open}
containerClassName="menu__container"
content={
<ul className="menu" onClick={handleClick}>
{children}
</ul>
}
{...rest}>
{trigger}
</Popover>
);
};