flush autosave on unload (#473)

This commit is contained in:
David Luzar 2020-01-20 18:37:42 +01:00 committed by Christopher Chedeau
parent 37e082fcdc
commit d44c4ca2d8
2 changed files with 15 additions and 1 deletions

View File

@ -211,6 +211,11 @@ export class App extends React.Component<{}, AppState> {
e.preventDefault(); e.preventDefault();
}; };
private onUnload = () => {
this.saveDebounced();
this.saveDebounced.flush();
};
public async componentDidMount() { public async componentDidMount() {
document.addEventListener("copy", this.onCopy); document.addEventListener("copy", this.onCopy);
document.addEventListener("paste", this.onPaste); document.addEventListener("paste", this.onPaste);
@ -219,6 +224,7 @@ export class App extends React.Component<{}, AppState> {
document.addEventListener("keydown", this.onKeyDown, false); document.addEventListener("keydown", this.onKeyDown, false);
document.addEventListener("mousemove", this.getCurrentCursorPosition); document.addEventListener("mousemove", this.getCurrentCursorPosition);
window.addEventListener("resize", this.onResize, false); window.addEventListener("resize", this.onResize, false);
window.addEventListener("unload", this.onUnload, false);
let data; let data;
const searchParams = new URLSearchParams(window.location.search); const searchParams = new URLSearchParams(window.location.search);
@ -253,6 +259,7 @@ export class App extends React.Component<{}, AppState> {
false false
); );
window.removeEventListener("resize", this.onResize, false); window.removeEventListener("resize", this.onResize, false);
window.removeEventListener("unload", this.onUnload, false);
} }
public state: AppState = getDefaultAppState(); public state: AppState = getDefaultAppState();

View File

@ -57,10 +57,17 @@ export function debounce<T extends any[]>(
timeout: number timeout: number
) { ) {
let handle = 0; let handle = 0;
return (...args: T) => { let lastArgs: T;
const ret = (...args: T) => {
lastArgs = args;
clearTimeout(handle); clearTimeout(handle);
handle = window.setTimeout(() => fn(...args), timeout); handle = window.setTimeout(() => fn(...args), timeout);
}; };
ret.flush = () => {
clearTimeout(handle);
fn(...lastArgs);
};
return ret;
} }
export function selectNode(node: Element) { export function selectNode(node: Element) {