import * as React from 'react' import { ExitIcon, GitHubLogoIcon, HamburgerMenuIcon, HeartFilledIcon, TwitterLogoIcon, } from '@radix-ui/react-icons' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { useTldrawApp } from '~hooks' import { PreferencesMenu } from '../PreferencesMenu' import { DMItem, DMContent, DMDivider, DMSubMenu, DMTriggerIcon, } from '~components/Primitives/DropdownMenu' import { SmallIcon } from '~components/Primitives/SmallIcon' import { useFileSystemHandlers } from '~hooks' import { HeartIcon } from '~components/Primitives/icons/HeartIcon' import { preventEvent } from '~components/preventEvent' import { DiscordIcon } from '~components/Primitives/icons' import { TDExportType, TDSnapshot } from '~types' import { Divider } from '~components/Primitives/Divider' import { FormattedMessage, useIntl } from 'react-intl' import { LanguageMenu } from '../LanguageMenu/LanguageMenu' interface MenuProps { sponsor: boolean | undefined readOnly: boolean } const numberOfSelectedIdsSelector = (s: TDSnapshot) => { return s.document.pageStates[s.appState.currentPageId].selectedIds.length } const disableAssetsSelector = (s: TDSnapshot) => { return s.appState.disableAssets } export const Menu = React.memo(function Menu({ sponsor, readOnly }: MenuProps) { const app = useTldrawApp() const intl = useIntl() const numberOfSelectedIds = app.useStore(numberOfSelectedIdsSelector) const disableAssets = app.useStore(disableAssetsSelector) const [_, setForce] = React.useState(0) React.useEffect(() => setForce(1), []) const { onNewProject, onOpenProject, onSaveProject, onSaveProjectAs } = useFileSystemHandlers() const handleDelete = React.useCallback(() => { app.delete() }, [app]) const handleCopySVG = React.useCallback(() => { app.copyImage(TDExportType.SVG, { scale: 1, quality: 1, transparentBackground: false }) }, [app]) const handleCopyPNG = React.useCallback(() => { app.copyImage(TDExportType.PNG, { scale: 2, quality: 1, transparentBackground: true }) }, [app]) const handleExportPNG = React.useCallback(async () => { app.exportImage(TDExportType.PNG, { scale: 2, quality: 1, transparentBackground: true }) }, [app]) const handleExportJPG = React.useCallback(async () => { app.exportImage(TDExportType.JPG, { scale: 2, quality: 1, transparentBackground: false }) }, [app]) const handleExportWEBP = React.useCallback(async () => { app.exportImage(TDExportType.WEBP, { scale: 2, quality: 1, transparentBackground: false }) }, [app]) const handleExportSVG = React.useCallback(async () => { app.exportImage(TDExportType.SVG, { scale: 2, quality: 1, transparentBackground: false }) }, [app]) const handleCopyJSON = React.useCallback(async () => { app.copyJson() }, [app]) const handleExportJSON = React.useCallback(async () => { app.exportJson() }, [app]) const handleSignIn = React.useCallback(() => { app.callbacks.onSignIn?.(app) }, [app]) const handleSignOut = React.useCallback(() => { app.callbacks.onSignOut?.(app) }, [app]) const handleCut = React.useCallback(() => { app.cut() }, [app]) const handleCopy = React.useCallback(() => { app.copy() }, [app]) const handlePaste = React.useCallback(() => { app.paste() }, [app]) const handleSelectAll = React.useCallback(() => { app.selectAll() }, [app]) const handleSelectNone = React.useCallback(() => { app.selectNone() }, [app]) const handleUploadMedia = React.useCallback(() => { app.openAsset() }, [app]) const handleZoomTo100 = React.useCallback(() => { app.zoomTo(1) }, [app]) const showFileMenu = app.callbacks.onNewProject || app.callbacks.onOpenProject || app.callbacks.onSaveProject || app.callbacks.onSaveProjectAs || app.callbacks.onExport const showSignInOutMenu = app.callbacks.onSignIn || app.callbacks.onSignOut const hasSelection = numberOfSelectedIds > 0 return ( {showFileMenu && ( {app.callbacks.onNewProject && ( )} {app.callbacks.onOpenProject && ( ... )} {app.callbacks.onSaveProject && ( )} {app.callbacks.onSaveProjectAs && ( ... )} {!disableAssets && ( <> )} )} SVG PNG JSON SVG PNG JPG WEBP JSON 100% GitHub Twitter Discord {sponsor === false && ( {' '} )} {sponsor === true && ( )} {showSignInOutMenu && ( <> {' '} {app.callbacks.onSignIn && ( )} {app.callbacks.onSignOut && ( )} )} ) })