import React, { Component } from 'react'; import Icon from 'app/components/icon/icon.jsx'; import Emojione from 'components/emojione/emojione'; import MenusManager from 'app/components/menus/menus-manager.jsx'; import './menu.scss'; /* One menu */ export default class MenuComponent extends React.Component { constructor(props) { super(); this.state = { menus_manager: MenusManager, }; MenusManager.addListener(this); } componentWillUnmount() { MenusManager.removeListener(this); } openSubMenu(dom_element, menu, level) { var elementRect = window.getBoundingClientRect(dom_element); elementRect.x = elementRect.x || elementRect.left; elementRect.y = elementRect.y || elementRect.top; MenusManager.openSubMenu(menu, elementRect, level); } closeSubMenu(level) { MenusManager.closeSubMenu(level); } hoverMenu(dom_element, item) { if (item.submenu && !item.submenu_replace) { this.last_hovered = item; this.openSubMenu(dom_element, item.submenu, this.props.level || 0); } else { this.closeSubMenu(this.props.level || 0); } } clickMenu(dom_element, item, evt) { if(Date.now() - this.props.openAt < 200 ){ // When a menu is open and another one opens above it, you have to block the buttons for a while. Otherwise, the hovered option of the new menu will be clicked return; } if (item.submenu_replace) { MenusManager.openMenu(item.submenu, { x: evt.clientX, y: evt.clientY }, 'center'); return; } if (item.onClick) { var res = item.onClick(evt); if (res !== false) { MenusManager.closeMenu(); } } } render() { return (
(this.original_menu = node)} className={ 'menu-list ' + (this.props.withFrame ? 'as_frame text-black bg-white dark:bg-zinc-800 dark:text-white rounded-lg ' : '') + this.props.animationClass } > {(this.props.menu || []) .filter(item => item && !item.hide) .map((item, index) => { if (item.type == 'separator') { return
; } else if (item.type == 'title') { return (
{item.text}
); } else if (item.type == 'text') { return (
(item.ref = node)} className={'menu-text ' + item.className} onMouseEnter={evt => { this.hoverMenu(item.ref, item); }} > {item.text}
); } else if (item.type == 'react-element') { return (
{typeof item.reactElement == 'function' ? item.reactElement(this.props.level) : item.reactElement}
); } else { return (
(item.ref = node)} className={ 'menu ' + item.className + ' ' + (this.state.menus_manager.max_level > this.props.level && this.last_hovered == item ? 'hovered ' : '') + (item.selected ? 'selected ' : '') } onMouseEnter={evt => { this.hoverMenu(item.ref, item); }} onClick={evt => { this.clickMenu(item.ref, item, evt); }} > {item.icon && (
{typeof item.icon === 'string' ? : item.icon}
)} {item.emoji && (
)}
{item.text}
{item.rightIcon && } {item.submenu && !item.submenu_replace && }
); } })}
); } }