this should also fix the issue where the cursor position sometimes ends up at the wrong position after you stop moving
79 lines
2 KiB
JavaScript
79 lines
2 KiB
JavaScript
export function listen(...listenerSpecs) {
|
|
return new Promise((resolve) => {
|
|
let removeAllEventListeners;
|
|
|
|
let listeners = listenerSpecs.map(([element, eventName]) => {
|
|
let listener = (event) => {
|
|
removeAllEventListeners();
|
|
resolve(event);
|
|
};
|
|
element.addEventListener(eventName, listener);
|
|
return { element, eventName, func: listener };
|
|
});
|
|
|
|
removeAllEventListeners = () => {
|
|
for (let listener of listeners) {
|
|
listener.element.removeEventListener(listener.eventName, listener.func);
|
|
}
|
|
};
|
|
});
|
|
}
|
|
|
|
export function debounce(time, fn) {
|
|
let timeout = null;
|
|
let queued = null;
|
|
return (...args) => {
|
|
if (timeout == null) {
|
|
fn(...args);
|
|
timeout = setTimeout(() => {
|
|
timeout = null;
|
|
if (queued != null) {
|
|
fn(...queued);
|
|
queued = null;
|
|
}
|
|
}, time);
|
|
} else {
|
|
queued = args;
|
|
}
|
|
};
|
|
}
|
|
|
|
export class SaveData {
|
|
constructor(prefix) {
|
|
this.prefix = `rkgk.${prefix}`;
|
|
this.elementId = "<global>";
|
|
}
|
|
|
|
#localStorageKey(key) {
|
|
return `${this.prefix}.${this.elementId}.${key}`;
|
|
}
|
|
|
|
attachToElement(element) {
|
|
this.elementId = element.dataset.storageId;
|
|
}
|
|
|
|
getRaw(key) {
|
|
return localStorage.getItem(this.#localStorageKey(key));
|
|
}
|
|
|
|
setRaw(key, value) {
|
|
localStorage.setItem(this.#localStorageKey(key), value);
|
|
}
|
|
|
|
get(key, defaultValue) {
|
|
let value = this.getRaw(key);
|
|
if (value == null) {
|
|
return defaultValue;
|
|
} else {
|
|
try {
|
|
return JSON.parse(value);
|
|
} catch (e) {
|
|
throw new Error(`${this.#localStorageKey(key)}`, { cause: e });
|
|
}
|
|
}
|
|
}
|
|
|
|
set(key, value) {
|
|
this.setRaw(key, JSON.stringify(value));
|
|
}
|
|
}
|