import React from "react"; import type { AppClassProperties, AppProps, AppState, Device, ExcalidrawProps, UIAppState, } from "../types"; import type { ActionManager } from "../actions/manager"; import { t } from "../i18n"; import Stack from "./Stack"; import { showSelectedShapeActions } from "../element"; import type { NonDeletedExcalidrawElement } from "../element/types"; import { FixedSideContainer } from "./FixedSideContainer"; import { Island } from "./Island"; import { HintViewer } from "./HintViewer"; import { calculateScrollCenter } from "../scene"; import { SelectedShapeActions, ShapesSwitcher } from "./Actions"; import { Section } from "./Section"; import { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from "../scene/scrollbars"; import { LockButton } from "./LockButton"; import { PenModeButton } from "./PenModeButton"; import { Stats } from "./Stats"; import { actionToggleStats } from "../actions"; import { HandButton } from "./HandButton"; import { isHandToolActive } from "../appState"; import { useTunnels } from "../context/tunnels"; type MobileMenuProps = { appState: UIAppState; actionManager: ActionManager; renderJSONExportDialog: () => React.ReactNode; renderImageExportDialog: () => React.ReactNode; setAppState: React.Component["setState"]; elements: readonly NonDeletedExcalidrawElement[]; onLockToggle: () => void; onHandToolToggle: () => void; onPenModeToggle: AppClassProperties["togglePenMode"]; renderTopRightUI?: ( isMobile: boolean, appState: UIAppState, ) => JSX.Element | null; renderCustomStats?: ExcalidrawProps["renderCustomStats"]; renderSidebars: () => JSX.Element | null; device: Device; renderWelcomeScreen: boolean; UIOptions: AppProps["UIOptions"]; app: AppClassProperties; }; export const MobileMenu = ({ appState, elements, actionManager, setAppState, onLockToggle, onHandToolToggle, onPenModeToggle, renderTopRightUI, renderCustomStats, renderSidebars, device, renderWelcomeScreen, UIOptions, app, }: MobileMenuProps) => { const { WelcomeScreenCenterTunnel, MainMenuTunnel, DefaultSidebarTriggerTunnel, } = useTunnels(); const renderToolbar = () => { return ( {renderWelcomeScreen && }
{(heading: React.ReactNode) => ( {heading} {renderTopRightUI && renderTopRightUI(true, appState)}
{!appState.viewModeEnabled && ( )} onPenModeToggle(null)} title={t("toolBar.penMode")} isMobile penDetected={appState.penDetected} /> onHandToolToggle()} title={t("toolBar.hand")} isMobile />
)}
); }; const renderAppToolbar = () => { if (appState.viewModeEnabled) { return (
); } return (
{actionManager.renderAction("toggleEditMenu")} {actionManager.renderAction("undo")} {actionManager.renderAction("redo")} {actionManager.renderAction( appState.multiElement ? "finalize" : "duplicateSelection", )} {actionManager.renderAction("deleteSelectedElements")}
); }; return ( <> {renderSidebars()} {!appState.viewModeEnabled && renderToolbar()} {!appState.openMenu && appState.showStats && ( { actionManager.executeAction(actionToggleStats); }} renderCustomStats={renderCustomStats} /> )}
{appState.openMenu === "shape" && !appState.viewModeEnabled && showSelectedShapeActions(appState, elements) ? (
) : null}
); };