MainMenu.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React from "react";
  2. import {
  3. useDevice,
  4. useExcalidrawAppState,
  5. useExcalidrawSetAppState,
  6. } from "../App";
  7. import DropdownMenu from "../dropdownMenu/DropdownMenu";
  8. import * as DefaultItems from "./DefaultItems";
  9. import { UserList } from "../UserList";
  10. import { t } from "../../i18n";
  11. import { HamburgerMenuIcon } from "../icons";
  12. import { withInternalFallback } from "../hoc/withInternalFallback";
  13. import { composeEventHandlers } from "../../utils";
  14. import { mainMenuTunnel } from "../tunnels";
  15. const MainMenu = Object.assign(
  16. withInternalFallback(
  17. "MainMenu",
  18. ({
  19. children,
  20. onSelect,
  21. }: {
  22. children?: React.ReactNode;
  23. /**
  24. * Called when any menu item is selected (clicked on).
  25. */
  26. onSelect?: (event: Event) => void;
  27. }) => {
  28. const device = useDevice();
  29. const appState = useExcalidrawAppState();
  30. const setAppState = useExcalidrawSetAppState();
  31. const onClickOutside = device.isMobile
  32. ? undefined
  33. : () => setAppState({ openMenu: null });
  34. return (
  35. <mainMenuTunnel.In>
  36. <DropdownMenu open={appState.openMenu === "canvas"}>
  37. <DropdownMenu.Trigger
  38. onToggle={() => {
  39. setAppState({
  40. openMenu: appState.openMenu === "canvas" ? null : "canvas",
  41. });
  42. }}
  43. >
  44. {HamburgerMenuIcon}
  45. </DropdownMenu.Trigger>
  46. <DropdownMenu.Content
  47. onClickOutside={onClickOutside}
  48. onSelect={composeEventHandlers(onSelect, () => {
  49. setAppState({ openMenu: null });
  50. })}
  51. >
  52. {children}
  53. {device.isMobile && appState.collaborators.size > 0 && (
  54. <fieldset className="UserList-Wrapper">
  55. <legend>{t("labels.collaborators")}</legend>
  56. <UserList
  57. mobile={true}
  58. collaborators={appState.collaborators}
  59. />
  60. </fieldset>
  61. )}
  62. </DropdownMenu.Content>
  63. </DropdownMenu>
  64. </mainMenuTunnel.In>
  65. );
  66. },
  67. ),
  68. {
  69. Trigger: DropdownMenu.Trigger,
  70. Item: DropdownMenu.Item,
  71. ItemLink: DropdownMenu.ItemLink,
  72. ItemCustom: DropdownMenu.ItemCustom,
  73. Group: DropdownMenu.Group,
  74. Separator: DropdownMenu.Separator,
  75. DefaultItems,
  76. },
  77. );
  78. export default MainMenu;