blob.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { getDefaultAppState } from "../appState";
  2. import { DataState } from "./types";
  3. import { restore } from "./restore";
  4. import { t } from "../i18n";
  5. export async function loadFromBlob(blob: any) {
  6. const updateAppState = (contents: string) => {
  7. const defaultAppState = getDefaultAppState();
  8. let elements = [];
  9. let appState = defaultAppState;
  10. try {
  11. const data = JSON.parse(contents);
  12. if (data.type !== "excalidraw") {
  13. throw new Error(t("alerts.couldNotLoadInvalidFile"));
  14. }
  15. elements = data.elements || [];
  16. appState = { ...defaultAppState, ...data.appState };
  17. } catch {
  18. // Do nothing because elements array is already empty
  19. }
  20. return { elements, appState };
  21. };
  22. if (blob.handle) {
  23. (window as any).handle = blob.handle;
  24. }
  25. let contents;
  26. if ("text" in Blob) {
  27. contents = await blob.text();
  28. } else {
  29. contents = await new Promise((resolve) => {
  30. const reader = new FileReader();
  31. reader.readAsText(blob, "utf8");
  32. reader.onloadend = () => {
  33. if (reader.readyState === FileReader.DONE) {
  34. resolve(reader.result as string);
  35. }
  36. };
  37. });
  38. }
  39. const { elements, appState } = updateAppState(contents);
  40. if (!elements.length) {
  41. return Promise.reject(t("alerts.couldNotLoadInvalidFile"));
  42. }
  43. return new Promise<DataState>((resolve) => {
  44. resolve(restore(elements, appState, { scrollToContent: true }));
  45. });
  46. }