Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

JSONExportDialog.tsx 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import React, { useState } from "react";
  2. import { ActionsManagerInterface } from "../actions/types";
  3. import { NonDeletedExcalidrawElement } from "../element/types";
  4. import { t } from "../i18n";
  5. import { useIsMobile } from "./App";
  6. import { AppState, ExportOpts, BinaryFiles } from "../types";
  7. import { Dialog } from "./Dialog";
  8. import { exportFile, exportToFileIcon, link } from "./icons";
  9. import { ToolButton } from "./ToolButton";
  10. import { actionSaveFileToDisk } from "../actions/actionExport";
  11. import { Card } from "./Card";
  12. import "./ExportDialog.scss";
  13. import { nativeFileSystemSupported } from "../data/filesystem";
  14. export type ExportCB = (
  15. elements: readonly NonDeletedExcalidrawElement[],
  16. scale?: number,
  17. ) => void;
  18. const JSONExportModal = ({
  19. elements,
  20. appState,
  21. files,
  22. actionManager,
  23. exportOpts,
  24. canvas,
  25. }: {
  26. appState: AppState;
  27. files: BinaryFiles;
  28. elements: readonly NonDeletedExcalidrawElement[];
  29. actionManager: ActionsManagerInterface;
  30. onCloseRequest: () => void;
  31. exportOpts: ExportOpts;
  32. canvas: HTMLCanvasElement | null;
  33. }) => {
  34. const { onExportToBackend } = exportOpts;
  35. return (
  36. <div className="ExportDialog ExportDialog--json">
  37. <div className="ExportDialog-cards">
  38. {exportOpts.saveFileToDisk && (
  39. <Card color="lime">
  40. <div className="Card-icon">{exportToFileIcon}</div>
  41. <h2>{t("exportDialog.disk_title")}</h2>
  42. <div className="Card-details">
  43. {t("exportDialog.disk_details")}
  44. {!nativeFileSystemSupported &&
  45. actionManager.renderAction("changeProjectName")}
  46. </div>
  47. <ToolButton
  48. className="Card-button"
  49. type="button"
  50. title={t("exportDialog.disk_button")}
  51. aria-label={t("exportDialog.disk_button")}
  52. showAriaLabel={true}
  53. onClick={() => {
  54. actionManager.executeAction(actionSaveFileToDisk);
  55. }}
  56. />
  57. </Card>
  58. )}
  59. {onExportToBackend && (
  60. <Card color="pink">
  61. <div className="Card-icon">{link}</div>
  62. <h2>{t("exportDialog.link_title")}</h2>
  63. <div className="Card-details">{t("exportDialog.link_details")}</div>
  64. <ToolButton
  65. className="Card-button"
  66. type="button"
  67. title={t("exportDialog.link_button")}
  68. aria-label={t("exportDialog.link_button")}
  69. showAriaLabel={true}
  70. onClick={() =>
  71. onExportToBackend(elements, appState, files, canvas)
  72. }
  73. />
  74. </Card>
  75. )}
  76. {exportOpts.renderCustomUI &&
  77. exportOpts.renderCustomUI(elements, appState, files, canvas)}
  78. </div>
  79. </div>
  80. );
  81. };
  82. export const JSONExportDialog = ({
  83. elements,
  84. appState,
  85. files,
  86. actionManager,
  87. exportOpts,
  88. canvas,
  89. }: {
  90. elements: readonly NonDeletedExcalidrawElement[];
  91. appState: AppState;
  92. files: BinaryFiles;
  93. actionManager: ActionsManagerInterface;
  94. exportOpts: ExportOpts;
  95. canvas: HTMLCanvasElement | null;
  96. }) => {
  97. const [modalIsShown, setModalIsShown] = useState(false);
  98. const handleClose = React.useCallback(() => {
  99. setModalIsShown(false);
  100. }, []);
  101. return (
  102. <>
  103. <ToolButton
  104. onClick={() => {
  105. setModalIsShown(true);
  106. }}
  107. data-testid="json-export-button"
  108. icon={exportFile}
  109. type="button"
  110. aria-label={t("buttons.export")}
  111. showAriaLabel={useIsMobile()}
  112. title={t("buttons.export")}
  113. />
  114. {modalIsShown && (
  115. <Dialog onCloseRequest={handleClose} title={t("buttons.export")}>
  116. <JSONExportModal
  117. elements={elements}
  118. appState={appState}
  119. files={files}
  120. actionManager={actionManager}
  121. onCloseRequest={handleClose}
  122. exportOpts={exportOpts}
  123. canvas={canvas}
  124. />
  125. </Dialog>
  126. )}
  127. </>
  128. );
  129. };