import clsx from "clsx"; import { Popover } from "./Popover"; import type { TranslationKeys } from "../i18n"; import { t } from "../i18n"; import "./ContextMenu.scss"; import type { ShortcutName } from "../actions/shortcuts"; import { getShortcutFromShortcutName } from "../actions/shortcuts"; import type { Action } from "../actions/types"; import type { ActionManager } from "../actions/manager"; import { useExcalidrawAppState, useExcalidrawElements } from "./App"; import React from "react"; export type ContextMenuItem = typeof CONTEXT_MENU_SEPARATOR | Action; export type ContextMenuItems = (ContextMenuItem | false | null | undefined)[]; type ContextMenuProps = { actionManager: ActionManager; items: ContextMenuItems; top: number; left: number; onClose: (callback?: () => void) => void; }; export const CONTEXT_MENU_SEPARATOR = "separator"; export const ContextMenu = React.memo( ({ actionManager, items, top, left, onClose }: ContextMenuProps) => { const appState = useExcalidrawAppState(); const elements = useExcalidrawElements(); const filteredItems = items.reduce((acc: ContextMenuItem[], item) => { if ( item && (item === CONTEXT_MENU_SEPARATOR || !item.predicate || item.predicate( elements, appState, actionManager.app.props, actionManager.app, )) ) { acc.push(item); } return acc; }, []); return ( { onClose(); }} top={top} left={left} fitInViewport={true} offsetLeft={appState.offsetLeft} offsetTop={appState.offsetTop} viewportWidth={appState.width} viewportHeight={appState.height} > ); }, );