Save scene in URL

This commit is contained in:
hazam 2020-01-07 02:52:21 +05:00
parent 1443cf1cd5
commit eef2d32234
3 changed files with 40 additions and 3 deletions

View file

@ -19,6 +19,8 @@ import {
exportAsPNG, exportAsPNG,
restoreFromLocalStorage, restoreFromLocalStorage,
saveToLocalStorage, saveToLocalStorage,
restoreFromURL,
saveToURL,
hasBackground, hasBackground,
hasStroke, hasStroke,
getElementAtPosition, getElementAtPosition,
@ -109,7 +111,8 @@ class App extends React.Component<{}, AppState> {
document.addEventListener("keydown", this.onKeyDown, false); document.addEventListener("keydown", this.onKeyDown, false);
window.addEventListener("resize", this.onResize, false); window.addEventListener("resize", this.onResize, false);
const savedState = restoreFromLocalStorage(elements); const savedState =
restoreFromURL(elements) || restoreFromLocalStorage(elements);
if (savedState) { if (savedState) {
this.setState(savedState); this.setState(savedState);
} }
@ -918,13 +921,18 @@ class App extends React.Component<{}, AppState> {
})); }));
}; };
private saveDebounced = debounce(() => {
saveToLocalStorage(elements, this.state);
saveToURL(elements, this.state);
}, 300);
componentDidUpdate() { componentDidUpdate() {
renderScene(elements, rc, canvas, { renderScene(elements, rc, canvas, {
scrollX: this.state.scrollX, scrollX: this.state.scrollX,
scrollY: this.state.scrollY, scrollY: this.state.scrollY,
viewBackgroundColor: this.state.viewBackgroundColor viewBackgroundColor: this.state.viewBackgroundColor
}); });
saveToLocalStorage(elements, this.state); this.saveDebounced();
if (history.isRecording()) { if (history.isRecording()) {
history.pushEntry(history.generateCurrentEntry(elements)); history.pushEntry(history.generateCurrentEntry(elements));
history.clearRedoStack(); history.clearRedoStack();
@ -933,6 +941,14 @@ class App extends React.Component<{}, AppState> {
} }
} }
function debounce<T extends any[]>(fn: (...args: T) => void, timeout: number) {
let handle = 0;
return (...args: T) => {
clearTimeout(handle);
handle = window.setTimeout(() => fn(...args), timeout);
};
}
const rootElement = document.getElementById("root"); const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement); ReactDOM.render(<App />, rootElement);
const canvas = document.getElementById("canvas") as HTMLCanvasElement; const canvas = document.getElementById("canvas") as HTMLCanvasElement;

View file

@ -181,3 +181,22 @@ export function saveToLocalStorage(
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(elements)); localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(elements));
localStorage.setItem(LOCAL_STORAGE_KEY_STATE, JSON.stringify(state)); localStorage.setItem(LOCAL_STORAGE_KEY_STATE, JSON.stringify(state));
} }
export function restoreFromURL(elements: ExcalidrawElement[]) {
try {
const [savedElements, savedState] = document.location.hash
.slice(1)
.split(":")
.map(atob);
return restore(elements, savedElements, savedState);
} catch (ex) {
return null;
}
}
export function saveToURL(elements: ExcalidrawElement[], state: AppState) {
const hash = [JSON.stringify(elements), JSON.stringify(state)]
.map(btoa)
.join(":");
document.location.replace("#" + hash);
}

View file

@ -13,7 +13,9 @@ export {
loadFromJSON, loadFromJSON,
saveAsJSON, saveAsJSON,
restoreFromLocalStorage, restoreFromLocalStorage,
saveToLocalStorage saveToLocalStorage,
restoreFromURL,
saveToURL
} from "./data"; } from "./data";
export { hasBackground, hasStroke, getElementAtPosition } from "./comparisons"; export { hasBackground, hasStroke, getElementAtPosition } from "./comparisons";
export { createScene } from "./createScene"; export { createScene } from "./createScene";