Преглед на файлове

fix: file save timing out with big file sizes (#7649)

David Luzar преди 1 година
родител
ревизия
d67eaa8710
променени са 2 файла, в които са добавени 21 реда и са изтрити 13 реда
  1. 1 1
      packages/excalidraw/data/filesystem.ts
  2. 20 12
      packages/excalidraw/data/index.ts

+ 1 - 1
packages/excalidraw/data/filesystem.ts

@@ -76,7 +76,7 @@ export const fileOpen = <M extends boolean | undefined = false>(opts: {
 };
 
 export const fileSave = (
-  blob: Blob,
+  blob: Blob | Promise<Blob>,
   opts: {
     /** supply without the extension */
     name: string;

+ 20 - 12
packages/excalidraw/data/index.ts

@@ -100,7 +100,7 @@ export const exportCanvas = async (
     throw new Error(t("alerts.cannotExportEmptyCanvas"));
   }
   if (type === "svg" || type === "clipboard-svg") {
-    const tempSvg = await exportToSvg(
+    const svgPromise = exportToSvg(
       elements,
       {
         exportBackground,
@@ -113,9 +113,12 @@ export const exportCanvas = async (
       files,
       { exportingFrame },
     );
+
     if (type === "svg") {
-      return await fileSave(
-        new Blob([tempSvg.outerHTML], { type: MIME_TYPES.svg }),
+      return fileSave(
+        svgPromise.then((svg) => {
+          return new Blob([svg.outerHTML], { type: MIME_TYPES.svg });
+        }),
         {
           description: "Export to SVG",
           name,
@@ -124,7 +127,9 @@ export const exportCanvas = async (
         },
       );
     } else if (type === "clipboard-svg") {
-      await copyTextToSystemClipboard(tempSvg.outerHTML);
+      await copyTextToSystemClipboard(
+        await svgPromise.then((svg) => svg.outerHTML),
+      );
       return;
     }
   }
@@ -137,17 +142,20 @@ export const exportCanvas = async (
   });
 
   if (type === "png") {
-    let blob = await canvasToBlob(tempCanvas);
+    let blob = canvasToBlob(tempCanvas);
+
     if (appState.exportEmbedScene) {
-      blob = await (
-        await import("./image")
-      ).encodePngMetadata({
-        blob,
-        metadata: serializeAsJSON(elements, appState, files, "local"),
-      });
+      blob = blob.then((blob) =>
+        import("./image").then(({ encodePngMetadata }) =>
+          encodePngMetadata({
+            blob,
+            metadata: serializeAsJSON(elements, appState, files, "local"),
+          }),
+        ),
+      );
     }
 
-    return await fileSave(blob, {
+    return fileSave(blob, {
       description: "Export to PNG",
       name,
       // FIXME reintroduce `excalidraw.png` when most people upgrade away