UNPKG

flowbite-svelte

Version:

Flowbite components for Svelte

42 lines (41 loc) 1.44 kB
/** * 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]; }