import React = require("react"); import { observable, action } from "mobx"; import { observer } from "mobx-react"; import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; export interface OriginalMenuProps { description: string; event: (e: React.MouseEvent) => void; icon?: IconProp; //maybe should be optional (icon?) closeMenu?: () => void; } export interface SubmenuProps { description: string; subitems: ContextMenuProps[]; closeMenu?: () => void; } export interface ContextMenuItemProps { type: ContextMenuProps | SubmenuProps; } export type ContextMenuProps = OriginalMenuProps | SubmenuProps; @observer export class ContextMenuItem extends React.Component { @observable private _items: Array = []; @observable private overItem = false; constructor(props: ContextMenuProps | SubmenuProps) { super(props); if ("subitems" in this.props) { this.props.subitems.forEach(i => this._items.push(i)); } } handleEvent = (e: React.MouseEvent) => { if ("event" in this.props) { this.props.event(e); this.props.closeMenu && this.props.closeMenu(); } } render() { if ("event" in this.props) { return (
{this.props.icon ? : }
{this.props.description}
); } else { let submenu = !this.overItem ? (null) :
{this._items.map(prop => )}
; return (
{ this.overItem = true; })} onMouseLeave={action(() => this.overItem = false)}>
{this.props.description}
{submenu}
); } } }