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,
restoreFromLocalStorage,
saveToLocalStorage,
restoreFromURL,
saveToURL,
hasBackground,
hasStroke,
getElementAtPosition,
@ -109,7 +111,8 @@ class App extends React.Component<{}, AppState> {
document.addEventListener("keydown", this.onKeyDown, false);
window.addEventListener("resize", this.onResize, false);
const savedState = restoreFromLocalStorage(elements);
const savedState =
restoreFromURL(elements) || restoreFromLocalStorage(elements);
if (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() {
renderScene(elements, rc, canvas, {
scrollX: this.state.scrollX,
scrollY: this.state.scrollY,
viewBackgroundColor: this.state.viewBackgroundColor
});
saveToLocalStorage(elements, this.state);
this.saveDebounced();
if (history.isRecording()) {
history.pushEntry(history.generateCurrentEntry(elements));
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");
ReactDOM.render(<App />, rootElement);
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_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,
saveAsJSON,
restoreFromLocalStorage,
saveToLocalStorage
saveToLocalStorage,
restoreFromURL,
saveToURL
} from "./data";
export { hasBackground, hasStroke, getElementAtPosition } from "./comparisons";
export { createScene } from "./createScene";