excalidraw/src/data/json.ts

97 lines
2.3 KiB
TypeScript
Raw Normal View History

import { ExcalidrawElement } from "../element/types";
import { AppState } from "../types";
import { cleanAppStateForExport } from "../appState";
import { fileOpen, fileSave } from "browser-nativefs";
import { loadFromBlob } from "./blob";
import { Library } from "./library";
import { MIME_TYPES } from "../constants";
import { clearElementsForExport } from "../element";
export const serializeAsJSON = (
elements: readonly ExcalidrawElement[],
appState: AppState,
): string =>
JSON.stringify(
{
type: "excalidraw",
version: 2,
source: window.location.origin,
elements: clearElementsForExport(elements),
appState: cleanAppStateForExport(appState),
},
null,
2,
);
export const saveAsJSON = async (
elements: readonly ExcalidrawElement[],
appState: AppState,
) => {
const serialized = serializeAsJSON(elements, appState);
const blob = new Blob([serialized], {
type: "application/json",
});
2020-10-19 10:53:37 +02:00
const fileHandle = await fileSave(
blob,
{
fileName: appState.name,
description: "Excalidraw file",
extensions: [".excalidraw"],
},
2020-10-19 10:53:37 +02:00
appState.fileHandle,
);
2020-10-19 10:53:37 +02:00
return { fileHandle };
};
export const loadFromJSON = async (localAppState: AppState) => {
const blob = await fileOpen({
description: "Excalidraw files",
extensions: [".json", ".excalidraw", ".png", ".svg"],
mimeTypes: ["application/json", "image/png", "image/svg+xml"],
});
return loadFromBlob(blob, localAppState);
};
export const isValidLibrary = (json: any) => {
return (
typeof json === "object" &&
json &&
json.type === "excalidrawlib" &&
json.version === 1
);
};
export const saveLibraryAsJSON = async () => {
2020-10-30 21:01:41 +01:00
const library = await Library.loadLibrary();
const serialized = JSON.stringify(
{
type: "excalidrawlib",
version: 1,
library,
},
null,
2,
);
2020-09-03 22:46:42 +03:00
const fileName = "library.excalidrawlib";
const blob = new Blob([serialized], {
type: MIME_TYPES.excalidrawlib,
});
await fileSave(blob, {
fileName,
description: "Excalidraw library file",
extensions: [".excalidrawlib"],
});
};
export const importLibraryFromJSON = async () => {
const blob = await fileOpen({
description: "Excalidraw library files",
extensions: [".json", ".excalidrawlib"],
mimeTypes: ["application/json"],
});
Library.importLibrary(blob);
};