You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.4 KiB
84 lines
2.4 KiB
import React from "react"; |
|
import { |
|
useDevice, |
|
useExcalidrawAppState, |
|
useExcalidrawSetAppState, |
|
} from "../App"; |
|
import DropdownMenu from "../dropdownMenu/DropdownMenu"; |
|
|
|
import * as DefaultItems from "./DefaultItems"; |
|
|
|
import { UserList } from "../UserList"; |
|
import { t } from "../../i18n"; |
|
import { HamburgerMenuIcon } from "../icons"; |
|
import { withInternalFallback } from "../hoc/withInternalFallback"; |
|
import { composeEventHandlers } from "../../utils"; |
|
import { useTunnels } from "../context/tunnels"; |
|
|
|
const MainMenu = Object.assign( |
|
withInternalFallback( |
|
"MainMenu", |
|
({ |
|
children, |
|
onSelect, |
|
}: { |
|
children?: React.ReactNode; |
|
/** |
|
* Called when any menu item is selected (clicked on). |
|
*/ |
|
onSelect?: (event: Event) => void; |
|
}) => { |
|
const { mainMenuTunnel } = useTunnels(); |
|
const device = useDevice(); |
|
const appState = useExcalidrawAppState(); |
|
const setAppState = useExcalidrawSetAppState(); |
|
const onClickOutside = device.isMobile |
|
? undefined |
|
: () => setAppState({ openMenu: null }); |
|
|
|
return ( |
|
<mainMenuTunnel.In> |
|
<DropdownMenu open={appState.openMenu === "canvas"}> |
|
<DropdownMenu.Trigger |
|
onToggle={() => { |
|
setAppState({ |
|
openMenu: appState.openMenu === "canvas" ? null : "canvas", |
|
}); |
|
}} |
|
> |
|
{HamburgerMenuIcon} |
|
</DropdownMenu.Trigger> |
|
<DropdownMenu.Content |
|
onClickOutside={onClickOutside} |
|
onSelect={composeEventHandlers(onSelect, () => { |
|
setAppState({ openMenu: null }); |
|
})} |
|
> |
|
{children} |
|
{device.isMobile && appState.collaborators.size > 0 && ( |
|
<fieldset className="UserList-Wrapper"> |
|
<legend>{t("labels.collaborators")}</legend> |
|
<UserList |
|
mobile={true} |
|
collaborators={appState.collaborators} |
|
/> |
|
</fieldset> |
|
)} |
|
</DropdownMenu.Content> |
|
</DropdownMenu> |
|
</mainMenuTunnel.In> |
|
); |
|
}, |
|
), |
|
{ |
|
Trigger: DropdownMenu.Trigger, |
|
Item: DropdownMenu.Item, |
|
ItemLink: DropdownMenu.ItemLink, |
|
ItemCustom: DropdownMenu.ItemCustom, |
|
Group: DropdownMenu.Group, |
|
Separator: DropdownMenu.Separator, |
|
DefaultItems, |
|
}, |
|
); |
|
|
|
export default MainMenu;
|
|
|