Remove Excalidraw+ integrations
This commit is contained in:
parent
675b60808e
commit
466c9bc796
@ -45,7 +45,6 @@ import {
|
|||||||
} from "../packages/excalidraw/utils";
|
} from "../packages/excalidraw/utils";
|
||||||
import {
|
import {
|
||||||
FIREBASE_STORAGE_PREFIXES,
|
FIREBASE_STORAGE_PREFIXES,
|
||||||
isExcalidrawPlusSignedUser,
|
|
||||||
STORAGE_KEYS,
|
STORAGE_KEYS,
|
||||||
SYNC_BROWSER_TABS_TIMEOUT,
|
SYNC_BROWSER_TABS_TIMEOUT,
|
||||||
} from "./app_constants";
|
} from "./app_constants";
|
||||||
@ -68,10 +67,6 @@ import {
|
|||||||
import CustomStats from "./CustomStats";
|
import CustomStats from "./CustomStats";
|
||||||
import type { RestoredDataState } from "../packages/excalidraw/data/restore";
|
import type { RestoredDataState } from "../packages/excalidraw/data/restore";
|
||||||
import { restore, restoreAppState } from "../packages/excalidraw/data/restore";
|
import { restore, restoreAppState } from "../packages/excalidraw/data/restore";
|
||||||
import {
|
|
||||||
ExportToExcalidrawPlus,
|
|
||||||
exportToExcalidrawPlus,
|
|
||||||
} from "./components/ExportToExcalidrawPlus";
|
|
||||||
import { updateStaleImageStatuses } from "./data/FileManager";
|
import { updateStaleImageStatuses } from "./data/FileManager";
|
||||||
import { newElementWith } from "../packages/excalidraw/element/mutateElement";
|
import { newElementWith } from "../packages/excalidraw/element/mutateElement";
|
||||||
import { isInitializedImageElement } from "../packages/excalidraw/element/typeChecks";
|
import { isInitializedImageElement } from "../packages/excalidraw/element/typeChecks";
|
||||||
@ -111,9 +106,7 @@ import {
|
|||||||
GithubIcon,
|
GithubIcon,
|
||||||
XBrandIcon,
|
XBrandIcon,
|
||||||
DiscordIcon,
|
DiscordIcon,
|
||||||
ExcalLogo,
|
|
||||||
usersIcon,
|
usersIcon,
|
||||||
exportToPlus,
|
|
||||||
share,
|
share,
|
||||||
youtubeIcon,
|
youtubeIcon,
|
||||||
} from "../packages/excalidraw/components/icons";
|
} from "../packages/excalidraw/components/icons";
|
||||||
@ -741,45 +734,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ExcalidrawPlusCommand = {
|
|
||||||
label: "Excalidraw+",
|
|
||||||
category: DEFAULT_CATEGORIES.links,
|
|
||||||
predicate: true,
|
|
||||||
icon: <div style={{ width: 14 }}>{ExcalLogo}</div>,
|
|
||||||
keywords: ["plus", "cloud", "server"],
|
|
||||||
perform: () => {
|
|
||||||
window.open(
|
|
||||||
`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_LP
|
|
||||||
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=command_palette`,
|
|
||||||
"_blank",
|
|
||||||
);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const ExcalidrawPlusAppCommand = {
|
|
||||||
label: "Sign up",
|
|
||||||
category: DEFAULT_CATEGORIES.links,
|
|
||||||
predicate: true,
|
|
||||||
icon: <div style={{ width: 14 }}>{ExcalLogo}</div>,
|
|
||||||
keywords: [
|
|
||||||
"excalidraw",
|
|
||||||
"plus",
|
|
||||||
"cloud",
|
|
||||||
"server",
|
|
||||||
"signin",
|
|
||||||
"login",
|
|
||||||
"signup",
|
|
||||||
],
|
|
||||||
perform: () => {
|
|
||||||
window.open(
|
|
||||||
`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_APP
|
|
||||||
}?utm_source=excalidraw&utm_medium=app&utm_content=command_palette`,
|
|
||||||
"_blank",
|
|
||||||
);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{ height: "100%" }}
|
style={{ height: "100%" }}
|
||||||
@ -798,30 +752,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
toggleTheme: true,
|
toggleTheme: true,
|
||||||
export: {
|
export: {
|
||||||
onExportToBackend,
|
onExportToBackend,
|
||||||
renderCustomUI: excalidrawAPI
|
|
||||||
? (elements, appState, files) => {
|
|
||||||
return (
|
|
||||||
<ExportToExcalidrawPlus
|
|
||||||
elements={elements}
|
|
||||||
appState={appState}
|
|
||||||
files={files}
|
|
||||||
name={excalidrawAPI.getName()}
|
|
||||||
onError={(error) => {
|
|
||||||
excalidrawAPI?.updateScene({
|
|
||||||
appState: {
|
|
||||||
errorMessage: error.message,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
onSuccess={() => {
|
|
||||||
excalidrawAPI.updateScene({
|
|
||||||
appState: { openDialog: null },
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
: undefined,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}}
|
}}
|
||||||
@ -863,22 +793,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
<OverwriteConfirmDialog>
|
<OverwriteConfirmDialog>
|
||||||
<OverwriteConfirmDialog.Actions.ExportToImage />
|
<OverwriteConfirmDialog.Actions.ExportToImage />
|
||||||
<OverwriteConfirmDialog.Actions.SaveToDisk />
|
<OverwriteConfirmDialog.Actions.SaveToDisk />
|
||||||
{excalidrawAPI && (
|
|
||||||
<OverwriteConfirmDialog.Action
|
|
||||||
title={t("overwriteConfirm.action.excalidrawPlus.title")}
|
|
||||||
actionLabel={t("overwriteConfirm.action.excalidrawPlus.button")}
|
|
||||||
onClick={() => {
|
|
||||||
exportToExcalidrawPlus(
|
|
||||||
excalidrawAPI.getSceneElements(),
|
|
||||||
excalidrawAPI.getAppState(),
|
|
||||||
excalidrawAPI.getFiles(),
|
|
||||||
excalidrawAPI.getName(),
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{t("overwriteConfirm.action.excalidrawPlus.description")}
|
|
||||||
</OverwriteConfirmDialog.Action>
|
|
||||||
)}
|
|
||||||
</OverwriteConfirmDialog>
|
</OverwriteConfirmDialog>
|
||||||
<AppFooter onChange={() => excalidrawAPI?.refresh()} />
|
<AppFooter onChange={() => excalidrawAPI?.refresh()} />
|
||||||
{excalidrawAPI && <AIComponents excalidrawAPI={excalidrawAPI} />}
|
{excalidrawAPI && <AIComponents excalidrawAPI={excalidrawAPI} />}
|
||||||
@ -1061,32 +975,6 @@ const ExcalidrawWrapper = () => {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...(isExcalidrawPlusSignedUser
|
|
||||||
? [
|
|
||||||
{
|
|
||||||
...ExcalidrawPlusAppCommand,
|
|
||||||
label: "Sign in / Go to Excalidraw+",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: [ExcalidrawPlusCommand, ExcalidrawPlusAppCommand]),
|
|
||||||
|
|
||||||
{
|
|
||||||
label: t("overwriteConfirm.action.excalidrawPlus.button"),
|
|
||||||
category: DEFAULT_CATEGORIES.export,
|
|
||||||
icon: exportToPlus,
|
|
||||||
predicate: true,
|
|
||||||
keywords: ["plus", "export", "save", "backup"],
|
|
||||||
perform: () => {
|
|
||||||
if (excalidrawAPI) {
|
|
||||||
exportToExcalidrawPlus(
|
|
||||||
excalidrawAPI.getSceneElements(),
|
|
||||||
excalidrawAPI.getAppState(),
|
|
||||||
excalidrawAPI.getFiles(),
|
|
||||||
excalidrawAPI.getName(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
...CommandPalette.defaultItems.toggleTheme,
|
...CommandPalette.defaultItems.toggleTheme,
|
||||||
perform: () => {
|
perform: () => {
|
||||||
|
|||||||
@ -53,7 +53,3 @@ export const STORAGE_KEYS = {
|
|||||||
export const COOKIES = {
|
export const COOKIES = {
|
||||||
AUTH_STATE_COOKIE: "excplus-auth",
|
AUTH_STATE_COOKIE: "excplus-auth",
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const isExcalidrawPlusSignedUser = document.cookie.includes(
|
|
||||||
COOKIES.AUTH_STATE_COOKIE,
|
|
||||||
);
|
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { Footer } from "../../packages/excalidraw/index";
|
import { Footer } from "../../packages/excalidraw/index";
|
||||||
import { EncryptedIcon } from "./EncryptedIcon";
|
import { EncryptedIcon } from "./EncryptedIcon";
|
||||||
import { ExcalidrawPlusAppLink } from "./ExcalidrawPlusAppLink";
|
|
||||||
import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|
||||||
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
|
import { DebugFooter, isVisualDebuggerEnabled } from "./DebugCanvas";
|
||||||
|
|
||||||
export const AppFooter = React.memo(
|
export const AppFooter = React.memo(
|
||||||
@ -17,11 +15,7 @@ export const AppFooter = React.memo(
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
|
{isVisualDebuggerEnabled() && <DebugFooter onChange={onChange} />}
|
||||||
{isExcalidrawPlusSignedUser ? (
|
|
||||||
<ExcalidrawPlusAppLink />
|
|
||||||
) : (
|
|
||||||
<EncryptedIcon />
|
<EncryptedIcon />
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</Footer>
|
</Footer>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,12 +1,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import {
|
import { eyeIcon } from "../../packages/excalidraw/components/icons";
|
||||||
loginIcon,
|
|
||||||
ExcalLogo,
|
|
||||||
eyeIcon,
|
|
||||||
} from "../../packages/excalidraw/components/icons";
|
|
||||||
import type { Theme } from "../../packages/excalidraw/element/types";
|
import type { Theme } from "../../packages/excalidraw/element/types";
|
||||||
import { MainMenu } from "../../packages/excalidraw/index";
|
import { MainMenu } from "../../packages/excalidraw/index";
|
||||||
import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|
||||||
import { LanguageList } from "../app-language/LanguageList";
|
import { LanguageList } from "../app-language/LanguageList";
|
||||||
import { saveDebugState } from "./DebugCanvas";
|
import { saveDebugState } from "./DebugCanvas";
|
||||||
|
|
||||||
@ -35,25 +30,7 @@ export const AppMainMenu: React.FC<{
|
|||||||
<MainMenu.DefaultItems.Help />
|
<MainMenu.DefaultItems.Help />
|
||||||
<MainMenu.DefaultItems.ClearCanvas />
|
<MainMenu.DefaultItems.ClearCanvas />
|
||||||
<MainMenu.Separator />
|
<MainMenu.Separator />
|
||||||
<MainMenu.ItemLink
|
|
||||||
icon={ExcalLogo}
|
|
||||||
href={`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_LP
|
|
||||||
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=hamburger`}
|
|
||||||
className=""
|
|
||||||
>
|
|
||||||
Excalidraw+
|
|
||||||
</MainMenu.ItemLink>
|
|
||||||
<MainMenu.DefaultItems.Socials />
|
<MainMenu.DefaultItems.Socials />
|
||||||
<MainMenu.ItemLink
|
|
||||||
icon={loginIcon}
|
|
||||||
href={`${import.meta.env.VITE_APP_PLUS_APP}${
|
|
||||||
isExcalidrawPlusSignedUser ? "" : "/sign-up"
|
|
||||||
}?utm_source=signin&utm_medium=app&utm_content=hamburger`}
|
|
||||||
className="highlighted"
|
|
||||||
>
|
|
||||||
{isExcalidrawPlusSignedUser ? "Sign in" : "Sign up"}
|
|
||||||
</MainMenu.ItemLink>
|
|
||||||
{import.meta.env.DEV && (
|
{import.meta.env.DEV && (
|
||||||
<MainMenu.Item
|
<MainMenu.Item
|
||||||
icon={eyeIcon}
|
icon={eyeIcon}
|
||||||
|
|||||||
@ -1,39 +1,13 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { loginIcon } from "../../packages/excalidraw/components/icons";
|
|
||||||
import { useI18n } from "../../packages/excalidraw/i18n";
|
import { useI18n } from "../../packages/excalidraw/i18n";
|
||||||
import { WelcomeScreen } from "../../packages/excalidraw/index";
|
import { WelcomeScreen } from "../../packages/excalidraw/index";
|
||||||
import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|
||||||
import { POINTER_EVENTS } from "../../packages/excalidraw/constants";
|
|
||||||
|
|
||||||
export const AppWelcomeScreen: React.FC<{
|
export const AppWelcomeScreen: React.FC<{
|
||||||
onCollabDialogOpen: () => any;
|
onCollabDialogOpen: () => any;
|
||||||
isCollabEnabled: boolean;
|
isCollabEnabled: boolean;
|
||||||
}> = React.memo((props) => {
|
}> = React.memo((props) => {
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
let headingContent;
|
const headingContent = t("welcomeScreen.app.center_heading");
|
||||||
|
|
||||||
if (isExcalidrawPlusSignedUser) {
|
|
||||||
headingContent = t("welcomeScreen.app.center_heading_plus")
|
|
||||||
.split(/(Excalidraw\+)/)
|
|
||||||
.map((bit, idx) => {
|
|
||||||
if (bit === "Excalidraw+") {
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
style={{ pointerEvents: POINTER_EVENTS.inheritFromUI }}
|
|
||||||
href={`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_APP
|
|
||||||
}?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenSignedInUser`}
|
|
||||||
key={idx}
|
|
||||||
>
|
|
||||||
Excalidraw+
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return bit;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
headingContent = t("welcomeScreen.app.center_heading");
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<WelcomeScreen>
|
<WelcomeScreen>
|
||||||
@ -55,17 +29,6 @@ export const AppWelcomeScreen: React.FC<{
|
|||||||
onSelect={() => props.onCollabDialogOpen()}
|
onSelect={() => props.onCollabDialogOpen()}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{!isExcalidrawPlusSignedUser && (
|
|
||||||
<WelcomeScreen.Center.MenuItemLink
|
|
||||||
href={`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_LP
|
|
||||||
}/plus?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenGuest`}
|
|
||||||
shortcut={null}
|
|
||||||
icon={loginIcon}
|
|
||||||
>
|
|
||||||
Sign up
|
|
||||||
</WelcomeScreen.Center.MenuItemLink>
|
|
||||||
)}
|
|
||||||
</WelcomeScreen.Center.Menu>
|
</WelcomeScreen.Center.Menu>
|
||||||
</WelcomeScreen.Center>
|
</WelcomeScreen.Center>
|
||||||
</WelcomeScreen>
|
</WelcomeScreen>
|
||||||
|
|||||||
@ -1,19 +0,0 @@
|
|||||||
import { isExcalidrawPlusSignedUser } from "../app_constants";
|
|
||||||
|
|
||||||
export const ExcalidrawPlusAppLink = () => {
|
|
||||||
if (!isExcalidrawPlusSignedUser) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
href={`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_APP
|
|
||||||
}?utm_source=excalidraw&utm_medium=app&utm_content=signedInUserRedirectButton#excalidraw-redirect`}
|
|
||||||
target="_blank"
|
|
||||||
rel="noreferrer"
|
|
||||||
className="plus-button"
|
|
||||||
>
|
|
||||||
Go to Excalidraw+
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@ -1,134 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import { Card } from "../../packages/excalidraw/components/Card";
|
|
||||||
import { ToolButton } from "../../packages/excalidraw/components/ToolButton";
|
|
||||||
import { serializeAsJSON } from "../../packages/excalidraw/data/json";
|
|
||||||
import { loadFirebaseStorage, saveFilesToFirebase } from "../data/firebase";
|
|
||||||
import type {
|
|
||||||
FileId,
|
|
||||||
NonDeletedExcalidrawElement,
|
|
||||||
} from "../../packages/excalidraw/element/types";
|
|
||||||
import type {
|
|
||||||
AppState,
|
|
||||||
BinaryFileData,
|
|
||||||
BinaryFiles,
|
|
||||||
} from "../../packages/excalidraw/types";
|
|
||||||
import { nanoid } from "nanoid";
|
|
||||||
import { useI18n } from "../../packages/excalidraw/i18n";
|
|
||||||
import {
|
|
||||||
encryptData,
|
|
||||||
generateEncryptionKey,
|
|
||||||
} from "../../packages/excalidraw/data/encryption";
|
|
||||||
import { isInitializedImageElement } from "../../packages/excalidraw/element/typeChecks";
|
|
||||||
import { FILE_UPLOAD_MAX_BYTES } from "../app_constants";
|
|
||||||
import { encodeFilesForUpload } from "../data/FileManager";
|
|
||||||
import { MIME_TYPES } from "../../packages/excalidraw/constants";
|
|
||||||
import { trackEvent } from "../../packages/excalidraw/analytics";
|
|
||||||
import { getFrame } from "../../packages/excalidraw/utils";
|
|
||||||
import { ExcalidrawLogo } from "../../packages/excalidraw/components/ExcalidrawLogo";
|
|
||||||
|
|
||||||
export const exportToExcalidrawPlus = async (
|
|
||||||
elements: readonly NonDeletedExcalidrawElement[],
|
|
||||||
appState: Partial<AppState>,
|
|
||||||
files: BinaryFiles,
|
|
||||||
name: string,
|
|
||||||
) => {
|
|
||||||
const firebase = await loadFirebaseStorage();
|
|
||||||
|
|
||||||
const id = `${nanoid(12)}`;
|
|
||||||
|
|
||||||
const encryptionKey = (await generateEncryptionKey())!;
|
|
||||||
const encryptedData = await encryptData(
|
|
||||||
encryptionKey,
|
|
||||||
serializeAsJSON(elements, appState, files, "database"),
|
|
||||||
);
|
|
||||||
|
|
||||||
const blob = new Blob(
|
|
||||||
[encryptedData.iv, new Uint8Array(encryptedData.encryptedBuffer)],
|
|
||||||
{
|
|
||||||
type: MIME_TYPES.binary,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
await firebase
|
|
||||||
.storage()
|
|
||||||
.ref(`/migrations/scenes/${id}`)
|
|
||||||
.put(blob, {
|
|
||||||
customMetadata: {
|
|
||||||
data: JSON.stringify({ version: 2, name }),
|
|
||||||
created: Date.now().toString(),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const filesMap = new Map<FileId, BinaryFileData>();
|
|
||||||
for (const element of elements) {
|
|
||||||
if (isInitializedImageElement(element) && files[element.fileId]) {
|
|
||||||
filesMap.set(element.fileId, files[element.fileId]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filesMap.size) {
|
|
||||||
const filesToUpload = await encodeFilesForUpload({
|
|
||||||
files: filesMap,
|
|
||||||
encryptionKey,
|
|
||||||
maxBytes: FILE_UPLOAD_MAX_BYTES,
|
|
||||||
});
|
|
||||||
|
|
||||||
await saveFilesToFirebase({
|
|
||||||
prefix: `/migrations/files/scenes/${id}`,
|
|
||||||
files: filesToUpload,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
window.open(
|
|
||||||
`${
|
|
||||||
import.meta.env.VITE_APP_PLUS_APP
|
|
||||||
}/import?excalidraw=${id},${encryptionKey}`,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ExportToExcalidrawPlus: React.FC<{
|
|
||||||
elements: readonly NonDeletedExcalidrawElement[];
|
|
||||||
appState: Partial<AppState>;
|
|
||||||
files: BinaryFiles;
|
|
||||||
name: string;
|
|
||||||
onError: (error: Error) => void;
|
|
||||||
onSuccess: () => void;
|
|
||||||
}> = ({ elements, appState, files, name, onError, onSuccess }) => {
|
|
||||||
const { t } = useI18n();
|
|
||||||
return (
|
|
||||||
<Card color="primary">
|
|
||||||
<div className="Card-icon">
|
|
||||||
<ExcalidrawLogo
|
|
||||||
style={{
|
|
||||||
[`--color-logo-icon` as any]: "#fff",
|
|
||||||
width: "2.8rem",
|
|
||||||
height: "2.8rem",
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<h2>Excalidraw+</h2>
|
|
||||||
<div className="Card-details">
|
|
||||||
{t("exportDialog.excalidrawplus_description")}
|
|
||||||
</div>
|
|
||||||
<ToolButton
|
|
||||||
className="Card-button"
|
|
||||||
type="button"
|
|
||||||
title={t("exportDialog.excalidrawplus_button")}
|
|
||||||
aria-label={t("exportDialog.excalidrawplus_button")}
|
|
||||||
showAriaLabel={true}
|
|
||||||
onClick={async () => {
|
|
||||||
try {
|
|
||||||
trackEvent("export", "eplus", `ui (${getFrame()})`);
|
|
||||||
await exportToExcalidrawPlus(elements, appState, files, name);
|
|
||||||
onSuccess();
|
|
||||||
} catch (error: any) {
|
|
||||||
console.error(error);
|
|
||||||
if (error.name !== "AbortError") {
|
|
||||||
onError(new Error(t("exportDialog.excalidrawplus_exportError")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</Card>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
Loading…
x
Reference in New Issue
Block a user