import React from "react"; import { render, unmountComponentAtNode } from "react-dom"; import clsx from "clsx"; import { Popover } from "./Popover"; import { t } from "../i18n"; import "./ContextMenu.scss"; import { getShortcutFromShortcutName, ShortcutName, } from "../actions/shortcuts"; import { Action } from "../actions/types"; import { ActionManager } from "../actions/manager"; import { AppState } from "../types"; export type ContextMenuOption = "separator" | Action; type ContextMenuProps = { options: ContextMenuOption[]; onCloseRequest?(): void; top: number; left: number; actionManager: ActionManager; appState: Readonly; }; const ContextMenu = ({ options, onCloseRequest, top, left, actionManager, appState, }: ContextMenuProps) => { const isDarkTheme = !!document .querySelector(".excalidraw") ?.classList.contains("theme--dark"); return (
    event.preventDefault()} > {options.map((option, idx) => { if (option === "separator") { return
    ; } const actionName = option.name; const label = option.contextItemLabel ? t(option.contextItemLabel) : ""; return (
  • ); })}
); }; let contextMenuNode: HTMLDivElement; const getContextMenuNode = (): HTMLDivElement => { if (contextMenuNode) { return contextMenuNode; } const div = document.createElement("div"); document.body.appendChild(div); return (contextMenuNode = div); }; type ContextMenuParams = { options: (ContextMenuOption | false | null | undefined)[]; top: ContextMenuProps["top"]; left: ContextMenuProps["left"]; actionManager: ContextMenuProps["actionManager"]; appState: Readonly; }; const handleClose = () => { unmountComponentAtNode(getContextMenuNode()); }; export default { push(params: ContextMenuParams) { const options = Array.of(); params.options.forEach((option) => { if (option) { options.push(option); } }); if (options.length) { render( , getContextMenuNode(), ); } }, };