MobileMenu.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React from "react";
  2. import { AppState } from "../types";
  3. import { ActionManager } from "../actions/manager";
  4. import { t, setLanguage } from "../i18n";
  5. import Stack from "./Stack";
  6. import { LanguageList } from "./LanguageList";
  7. import { showSelectedShapeActions } from "../element";
  8. import { ExcalidrawElement } from "../element/types";
  9. import { FixedSideContainer } from "./FixedSideContainer";
  10. import { Island } from "./Island";
  11. import { HintViewer } from "./HintViewer";
  12. import { calculateScrollCenter, getTargetElement } from "../scene";
  13. import { SelectedShapeActions, ShapesSwitcher } from "./Actions";
  14. import { Section } from "./Section";
  15. import { RoomDialog } from "./RoomDialog";
  16. type MobileMenuProps = {
  17. appState: AppState;
  18. actionManager: ActionManager;
  19. exportButton: React.ReactNode;
  20. setAppState: any;
  21. elements: readonly ExcalidrawElement[];
  22. setElements: any;
  23. onRoomCreate: () => void;
  24. onRoomDestroy: () => void;
  25. };
  26. export function MobileMenu({
  27. appState,
  28. elements,
  29. setElements,
  30. actionManager,
  31. exportButton,
  32. setAppState,
  33. onRoomCreate,
  34. onRoomDestroy,
  35. }: MobileMenuProps) {
  36. return (
  37. <>
  38. {appState.openMenu === "canvas" ? (
  39. <Section className="App-mobile-menu" heading="canvasActions">
  40. <div className="App-mobile-menu-scroller panelColumn">
  41. <Stack.Col gap={4}>
  42. {actionManager.renderAction("loadScene")}
  43. {actionManager.renderAction("saveScene")}
  44. {exportButton}
  45. {actionManager.renderAction("clearCanvas")}
  46. <RoomDialog
  47. isCollaborating={appState.isCollaborating}
  48. collaboratorCount={appState.collaborators.size}
  49. onRoomCreate={onRoomCreate}
  50. onRoomDestroy={onRoomDestroy}
  51. />
  52. {actionManager.renderAction("changeViewBackgroundColor")}
  53. <fieldset>
  54. <legend>{t("labels.language")}</legend>
  55. <LanguageList
  56. onChange={lng => {
  57. setLanguage(lng);
  58. setAppState({});
  59. }}
  60. />
  61. </fieldset>
  62. </Stack.Col>
  63. </div>
  64. </Section>
  65. ) : appState.openMenu === "shape" &&
  66. showSelectedShapeActions(appState, elements) ? (
  67. <Section className="App-mobile-menu" heading="selectedShapeActions">
  68. <div className="App-mobile-menu-scroller">
  69. <SelectedShapeActions
  70. targetElements={getTargetElement(elements, appState)}
  71. renderAction={actionManager.renderAction}
  72. elementType={appState.elementType}
  73. />
  74. </div>
  75. </Section>
  76. ) : null}
  77. <FixedSideContainer side="top">
  78. <Section heading="shapes">
  79. {heading => (
  80. <Stack.Col gap={4} align="center">
  81. <Stack.Row gap={1}>
  82. <Island padding={1}>
  83. {heading}
  84. <Stack.Row gap={1}>
  85. <ShapesSwitcher
  86. elementType={appState.elementType}
  87. setAppState={setAppState}
  88. setElements={setElements}
  89. elements={elements}
  90. />
  91. </Stack.Row>
  92. </Island>
  93. </Stack.Row>
  94. </Stack.Col>
  95. )}
  96. </Section>
  97. <HintViewer appState={appState} elements={elements} />
  98. </FixedSideContainer>
  99. <footer className="App-toolbar">
  100. <div className="App-toolbar-content">
  101. {actionManager.renderAction("toggleCanvasMenu")}
  102. {actionManager.renderAction("toggleEditMenu")}
  103. {actionManager.renderAction("undo")}
  104. {actionManager.renderAction("redo")}
  105. {actionManager.renderAction("finalize")}
  106. {actionManager.renderAction("deleteSelectedElements")}
  107. </div>
  108. {appState.scrolledOutside && (
  109. <button
  110. className="scroll-back-to-content"
  111. onClick={() => {
  112. setAppState({ ...calculateScrollCenter(elements) });
  113. }}
  114. >
  115. {t("buttons.scrollBackToContent")}
  116. </button>
  117. )}
  118. </footer>
  119. </>
  120. );
  121. }