flowbite-svelte
Version:
Flowbite components for Svelte
42 lines (41 loc) • 1.44 kB
JavaScript
/**
* Create a mutual debounce for two opposing actions.
* Calling one action cancels any pending execution of the other.
*
* @param actionA - First action (e.g., openDialog)
* @param actionB - Second action (e.g., closeDialog)
* @param delayFunc - Function returning delay in milliseconds (default: 300ms)
* @returns Object with mutual debounce control methods
*
* @example
* const [openDialogDeb, closeDialogDeb] = createMutualDebounce(openDialog, closeDialog, () => 300);
* openDialogDeb(); // Schedule open
* closeDialogDeb(); // Cancel open, schedule close
*/
export function createMutualDebounce(actionA, actionB, delayFunc) {
let rafId = null;
function scheduleExecution(func, args, startTime) {
rafId = requestAnimationFrame((currentTime) => {
const elapsed = currentTime - (startTime || 0);
if (elapsed < delayFunc())
return scheduleExecution(func, args, startTime);
rafId = null;
func(...args);
});
}
function cancel() {
if (rafId !== null) {
cancelAnimationFrame(rafId);
rafId = null;
}
}
const debouncedA = (...args) => {
cancel();
scheduleExecution(actionA, args, performance.now());
};
const debouncedB = (...args) => {
cancel();
scheduleExecution(actionB, args, performance.now());
};
return [debouncedA, debouncedB];
}