49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
|
import { ExcalidrawElement } from "../element/types";
|
||
|
import { AppState } from "../types";
|
||
|
import { cleanAppStateForExport } from "../appState";
|
||
|
|
||
|
import { fileOpen, fileSave } from "browser-nativefs";
|
||
|
import { loadFromBlob } from "./blob";
|
||
|
|
||
|
export function serializeAsJSON(
|
||
|
elements: readonly ExcalidrawElement[],
|
||
|
appState: AppState,
|
||
|
): string {
|
||
|
return JSON.stringify(
|
||
|
{
|
||
|
type: "excalidraw",
|
||
|
version: 1,
|
||
|
source: window.location.origin,
|
||
|
elements: elements.map(({ shape, canvas, isSelected, ...el }) => el),
|
||
|
appState: cleanAppStateForExport(appState),
|
||
|
},
|
||
|
null,
|
||
|
2,
|
||
|
);
|
||
|
}
|
||
|
|
||
|
export async function saveAsJSON(
|
||
|
elements: readonly ExcalidrawElement[],
|
||
|
appState: AppState,
|
||
|
) {
|
||
|
const serialized = serializeAsJSON(elements, appState);
|
||
|
|
||
|
const name = `${appState.name}.excalidraw`;
|
||
|
await fileSave(
|
||
|
new Blob([serialized], { type: "application/json" }),
|
||
|
{
|
||
|
fileName: name,
|
||
|
description: "Excalidraw file",
|
||
|
},
|
||
|
(window as any).handle,
|
||
|
);
|
||
|
}
|
||
|
export async function loadFromJSON() {
|
||
|
const blob = await fileOpen({
|
||
|
description: "Excalidraw files",
|
||
|
extensions: ["json", "excalidraw"],
|
||
|
mimeTypes: ["application/json"],
|
||
|
});
|
||
|
return loadFromBlob(blob);
|
||
|
}
|