|
@@ -1,9 +1,7 @@
|
|
import React, { useEffect, useRef, useState } from "react";
|
|
import React, { useEffect, useRef, useState } from "react";
|
|
-import { render, unmountComponentAtNode } from "react-dom";
|
|
|
|
import { probablySupportsClipboardBlob } from "../clipboard";
|
|
import { probablySupportsClipboardBlob } from "../clipboard";
|
|
import { canvasToBlob } from "../data/blob";
|
|
import { canvasToBlob } from "../data/blob";
|
|
import { NonDeletedExcalidrawElement } from "../element/types";
|
|
import { NonDeletedExcalidrawElement } from "../element/types";
|
|
-import { CanvasError } from "../errors";
|
|
|
|
import { t } from "../i18n";
|
|
import { t } from "../i18n";
|
|
import { getSelectedElements, isSomeElementSelected } from "../scene";
|
|
import { getSelectedElements, isSomeElementSelected } from "../scene";
|
|
import { exportToCanvas } from "../scene/export";
|
|
import { exportToCanvas } from "../scene/export";
|
|
@@ -33,19 +31,6 @@ export const ErrorCanvasPreview = () => {
|
|
);
|
|
);
|
|
};
|
|
};
|
|
|
|
|
|
-const renderPreview = (
|
|
|
|
- content: HTMLCanvasElement | Error,
|
|
|
|
- previewNode: HTMLDivElement,
|
|
|
|
-) => {
|
|
|
|
- unmountComponentAtNode(previewNode);
|
|
|
|
- previewNode.innerHTML = "";
|
|
|
|
- if (content instanceof HTMLCanvasElement) {
|
|
|
|
- previewNode.appendChild(content);
|
|
|
|
- } else {
|
|
|
|
- render(<ErrorCanvasPreview />, previewNode);
|
|
|
|
- }
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
export type ExportCB = (
|
|
export type ExportCB = (
|
|
elements: readonly NonDeletedExcalidrawElement[],
|
|
elements: readonly NonDeletedExcalidrawElement[],
|
|
scale?: number,
|
|
scale?: number,
|
|
@@ -99,6 +84,7 @@ const ImageExportModal = ({
|
|
const [exportSelected, setExportSelected] = useState(someElementIsSelected);
|
|
const [exportSelected, setExportSelected] = useState(someElementIsSelected);
|
|
const previewRef = useRef<HTMLDivElement>(null);
|
|
const previewRef = useRef<HTMLDivElement>(null);
|
|
const { exportBackground, viewBackgroundColor } = appState;
|
|
const { exportBackground, viewBackgroundColor } = appState;
|
|
|
|
+ const [renderError, setRenderError] = useState<Error | null>(null);
|
|
|
|
|
|
const exportedElements = exportSelected
|
|
const exportedElements = exportSelected
|
|
? getSelectedElements(elements, appState, true)
|
|
? getSelectedElements(elements, appState, true)
|
|
@@ -119,15 +105,16 @@ const ImageExportModal = ({
|
|
exportPadding,
|
|
exportPadding,
|
|
})
|
|
})
|
|
.then((canvas) => {
|
|
.then((canvas) => {
|
|
|
|
+ setRenderError(null);
|
|
// if converting to blob fails, there's some problem that will
|
|
// if converting to blob fails, there's some problem that will
|
|
// likely prevent preview and export (e.g. canvas too big)
|
|
// likely prevent preview and export (e.g. canvas too big)
|
|
return canvasToBlob(canvas).then(() => {
|
|
return canvasToBlob(canvas).then(() => {
|
|
- renderPreview(canvas, previewNode);
|
|
|
|
|
|
+ previewNode.replaceChildren(canvas);
|
|
});
|
|
});
|
|
})
|
|
})
|
|
.catch((error) => {
|
|
.catch((error) => {
|
|
console.error(error);
|
|
console.error(error);
|
|
- renderPreview(new CanvasError(), previewNode);
|
|
|
|
|
|
+ setRenderError(error);
|
|
});
|
|
});
|
|
}, [
|
|
}, [
|
|
appState,
|
|
appState,
|
|
@@ -140,7 +127,9 @@ const ImageExportModal = ({
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className="ExportDialog">
|
|
<div className="ExportDialog">
|
|
- <div className="ExportDialog__preview" ref={previewRef} />
|
|
|
|
|
|
+ <div className="ExportDialog__preview" ref={previewRef}>
|
|
|
|
+ {renderError && <ErrorCanvasPreview />}
|
|
|
|
+ </div>
|
|
{supportsContextFilters &&
|
|
{supportsContextFilters &&
|
|
actionManager.renderAction("exportWithDarkMode")}
|
|
actionManager.renderAction("exportWithDarkMode")}
|
|
<div style={{ display: "grid", gridTemplateColumns: "1fr" }}>
|
|
<div style={{ display: "grid", gridTemplateColumns: "1fr" }}>
|