Footer.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import clsx from "clsx";
  2. import { ActionManager } from "../actions/manager";
  3. import { t } from "../i18n";
  4. import { AppState, ExcalidrawProps } from "../types";
  5. import {
  6. ExitZenModeAction,
  7. FinalizeAction,
  8. UndoRedoActions,
  9. ZoomActions,
  10. } from "./Actions";
  11. import { useDevice } from "./App";
  12. import { WelcomeScreenHelpArrow } from "./icons";
  13. import { Section } from "./Section";
  14. import Stack from "./Stack";
  15. import WelcomeScreenDecor from "./WelcomeScreenDecor";
  16. const Footer = ({
  17. appState,
  18. actionManager,
  19. renderCustomFooter,
  20. showExitZenModeBtn,
  21. renderWelcomeScreen,
  22. }: {
  23. appState: AppState;
  24. actionManager: ActionManager;
  25. renderCustomFooter?: ExcalidrawProps["renderFooter"];
  26. showExitZenModeBtn: boolean;
  27. renderWelcomeScreen: boolean;
  28. }) => {
  29. const device = useDevice();
  30. const showFinalize =
  31. !appState.viewModeEnabled && appState.multiElement && device.isTouchScreen;
  32. return (
  33. <footer
  34. role="contentinfo"
  35. className="layer-ui__wrapper__footer App-menu App-menu_bottom"
  36. >
  37. <div
  38. className={clsx("layer-ui__wrapper__footer-left zen-mode-transition", {
  39. "layer-ui__wrapper__footer-left--transition-left":
  40. appState.zenModeEnabled,
  41. })}
  42. >
  43. <Stack.Col gap={2}>
  44. <Section heading="canvasActions">
  45. <ZoomActions
  46. renderAction={actionManager.renderAction}
  47. zoom={appState.zoom}
  48. />
  49. {!appState.viewModeEnabled && (
  50. <UndoRedoActions
  51. renderAction={actionManager.renderAction}
  52. className={clsx("zen-mode-transition", {
  53. "layer-ui__wrapper__footer-left--transition-bottom":
  54. appState.zenModeEnabled,
  55. })}
  56. />
  57. )}
  58. {showFinalize && (
  59. <FinalizeAction
  60. renderAction={actionManager.renderAction}
  61. className={clsx("zen-mode-transition", {
  62. "layer-ui__wrapper__footer-left--transition-left":
  63. appState.zenModeEnabled,
  64. })}
  65. />
  66. )}
  67. </Section>
  68. </Stack.Col>
  69. </div>
  70. <div
  71. className={clsx(
  72. "layer-ui__wrapper__footer-center zen-mode-transition",
  73. {
  74. "layer-ui__wrapper__footer-left--transition-bottom":
  75. appState.zenModeEnabled,
  76. },
  77. )}
  78. >
  79. {renderCustomFooter?.(false, appState)}
  80. </div>
  81. <div
  82. className={clsx("layer-ui__wrapper__footer-right zen-mode-transition", {
  83. "transition-right disable-pointerEvents": appState.zenModeEnabled,
  84. })}
  85. >
  86. <div style={{ position: "relative" }}>
  87. <WelcomeScreenDecor
  88. shouldRender={renderWelcomeScreen && !appState.isLoading}
  89. >
  90. <div className="virgil WelcomeScreen-decor WelcomeScreen-decor--help-pointer">
  91. <div>{t("welcomeScreen.helpHints")}</div>
  92. {WelcomeScreenHelpArrow}
  93. </div>
  94. </WelcomeScreenDecor>
  95. {actionManager.renderAction("toggleShortcuts")}
  96. </div>
  97. </div>
  98. <ExitZenModeAction
  99. actionManager={actionManager}
  100. showExitZenModeBtn={showExitZenModeBtn}
  101. />
  102. </footer>
  103. );
  104. };
  105. export default Footer;