import { createRoot, Root } from "react-dom/client"; 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"; import { NonDeletedExcalidrawElement } from "../element/types"; export type ContextMenuOption = "separator" | Action; type ContextMenuProps = { options: ContextMenuOption[]; onCloseRequest?(): void; top: number; left: number; actionManager: ActionManager; appState: Readonly; elements: readonly NonDeletedExcalidrawElement[]; }; const ContextMenu = ({ options, onCloseRequest, top, left, actionManager, appState, elements, }: ContextMenuProps) => { return ( ); }; const contextMenuRoots = new WeakMap(); const getContextMenuRoot = (container: HTMLElement): Root => { let contextMenuRoot = contextMenuRoots.get(container); if (contextMenuRoot) { return contextMenuRoot; } contextMenuRoot = createRoot( container.querySelector(".excalidraw-contextMenuContainer")!, ); contextMenuRoots.set(container, contextMenuRoot); return contextMenuRoot; }; const handleClose = (container: HTMLElement) => { const contextMenuRoot = contextMenuRoots.get(container); if (contextMenuRoot) { contextMenuRoot.unmount(); contextMenuRoots.delete(container); } }; export default { push(params: { options: (ContextMenuOption | false | null | undefined)[]; top: ContextMenuProps["top"]; left: ContextMenuProps["left"]; actionManager: ContextMenuProps["actionManager"]; appState: Readonly; container: HTMLElement; elements: readonly NonDeletedExcalidrawElement[]; }) { const options = Array.of(); params.options.forEach((option) => { if (option) { options.push(option); } }); if (options.length) { getContextMenuRoot(params.container).render( handleClose(params.container)} actionManager={params.actionManager} appState={params.appState} elements={params.elements} />, ); } }, };