import { getDefaultAppState } from "../appState"; import { DataState } from "./types"; import { restore } from "./restore"; export async function loadFromBlob(blob: any) { const updateAppState = (contents: string) => { const defaultAppState = getDefaultAppState(); let elements = []; let appState = defaultAppState; try { const data = JSON.parse(contents); if (data.type !== "excalidraw") { throw new Error("Cannot load invalid json"); } elements = data.elements || []; appState = { ...defaultAppState, ...data.appState }; } catch { // Do nothing because elements array is already empty } return { elements, appState }; }; if (blob.handle) { (window as any).handle = blob.handle; } let contents; if ("text" in Blob) { contents = await blob.text(); } else { contents = await new Promise(resolve => { const reader = new FileReader(); reader.readAsText(blob, "utf8"); reader.onloadend = () => { if (reader.readyState === FileReader.DONE) { resolve(reader.result as string); } }; }); } const { elements, appState } = updateAppState(contents); if (!elements.length) { return Promise.reject("Cannot load invalid json"); } return new Promise(resolve => { resolve(restore(elements, appState, { scrollToContent: true })); }); }