* Initial factoring out of parts of the LayerUI component

2360 → 2224 LOC

* Create a Section component

* Break up src/index.tsx

* Refactor actions to reduce duplication, fix CSS

Also consolidate icons

* Move scene/data.ts to its own directory

* Fix accidental reverts, banish further single-character variables

* ACTIVE_ELEM_COLOR → ACTIVE_ELEMENT_COLOR

* Further refactoring the icons file

* Log all errors

* Pointer Event polyfill to make the tests work

* add test hooks & fix tests

Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
Jed Fox 2020-03-07 10:20:38 -05:00 committed by GitHub
parent 1a6431a04a
commit c6a0cfc2b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
49 changed files with 3498 additions and 3372 deletions

47
src/data/blob.ts Normal file
View file

@ -0,0 +1,47 @@
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<DataState>(resolve => {
resolve(restore(elements, appState, { scrollToContent: true }));
});
}