mirror of
https://github.com/notion-enhancer/notion-enhancer.git
synced 2025-04-10 15:39:01 +00:00
fix: use leading edge debounce to sync up transitions
This commit is contained in:
parent
26c9638013
commit
ff002044aa
@ -6,19 +6,28 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// convenient util: batch event handling
|
// batch event callbacks to avoid over-handling
|
||||||
// every ___ ms to avoid over-handling &
|
// and any conflicts / perf.issues that may
|
||||||
// any conflicts / perf.issues that may
|
// otherwise result. initial call is immediate,
|
||||||
// otherwise result. a wait time of ~200ms
|
// following calls are delayed. a wait time of
|
||||||
// is recommended (the avg. human visual
|
// ~200ms is recommended (the avg. human visual
|
||||||
// reaction time is ~180-200ms)
|
// reaction time is ~180-200ms)
|
||||||
const debounce = (callback, wait = 200) => {
|
const sleep = async (ms) => {
|
||||||
let timeoutId;
|
return new Promise((res, rej) => setTimeout(res, ms));
|
||||||
return (...args) => {
|
},
|
||||||
clearTimeout(timeoutId);
|
debounce = (callback, ms = 200) => {
|
||||||
timeoutId = setTimeout(() => callback(...args), wait);
|
let delay, update;
|
||||||
|
const next = () =>
|
||||||
|
sleep(ms).then(() => {
|
||||||
|
if (!update) return (delay = undefined);
|
||||||
|
update(), (update = undefined);
|
||||||
|
delay = next();
|
||||||
|
});
|
||||||
|
return (...args) => {
|
||||||
|
if (delay) update = callback.bind(this, ...args);
|
||||||
|
return delay || ((delay = next()), callback(...args));
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
// provides basic key/value reactivity:
|
// provides basic key/value reactivity:
|
||||||
// this is shared between all active mods,
|
// this is shared between all active mods,
|
||||||
@ -156,6 +165,7 @@ document.addEventListener("keydown", (event) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
Object.assign((globalThis.__enhancerApi ??= {}), {
|
Object.assign((globalThis.__enhancerApi ??= {}), {
|
||||||
|
sleep,
|
||||||
debounce,
|
debounce,
|
||||||
setState,
|
setState,
|
||||||
useState,
|
useState,
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import { Button } from "./Button.mjs";
|
import { Button } from "./Button.mjs";
|
||||||
|
|
||||||
function Footer({ categories }) {
|
function Footer({ categories, transitionDuration = 150 }) {
|
||||||
const { html, setState, useState, reloadApp } = globalThis.__enhancerApi,
|
const { html, setState, useState, reloadApp } = globalThis.__enhancerApi,
|
||||||
$reload = html`<${Button}
|
$reload = html`<${Button}
|
||||||
class="ml-auto"
|
class="ml-auto"
|
||||||
@ -33,12 +33,16 @@ function Footer({ categories }) {
|
|||||||
|
|
||||||
useState(["view"], ([view]) => {
|
useState(["view"], ([view]) => {
|
||||||
let [footerOpen] = useState(["databaseUpdated"]);
|
let [footerOpen] = useState(["databaseUpdated"]);
|
||||||
for (const [ids, $btn] of $categories) {
|
footerOpen ||= $categories.some(([ids]) => ids.some((id) => id === view));
|
||||||
const modInCategory = ids.some((id) => id === view);
|
|
||||||
if (modInCategory) footerOpen = true;
|
|
||||||
$btn.style.display = modInCategory ? "" : "none";
|
|
||||||
}
|
|
||||||
setState({ footerOpen });
|
setState({ footerOpen });
|
||||||
|
if (!footerOpen) return;
|
||||||
|
|
||||||
|
// only toggle buttons if footer is open,
|
||||||
|
// otherwise leave as is during transition
|
||||||
|
for (const [ids, $btn] of $categories) {
|
||||||
|
const viewInCategory = ids.some((id) => id === view);
|
||||||
|
$btn.style.display = viewInCategory ? "" : "none";
|
||||||
|
}
|
||||||
});
|
});
|
||||||
useState(["databaseUpdated"], ([databaseUpdated]) => {
|
useState(["databaseUpdated"], ([databaseUpdated]) => {
|
||||||
$reload.style.display = databaseUpdated ? "" : "none";
|
$reload.style.display = databaseUpdated ? "" : "none";
|
||||||
|
Loading…
Reference in New Issue
Block a user