Spaces:
Running on Zero
Running on Zero
| /** | |
| * Creates a reactive throttle key that increments when `getValue()` changes | |
| * and the throttle window has elapsed since the last increment. | |
| * | |
| * Useful for throttling animations that should not fire on every rapid update. | |
| * | |
| * @param getValue - A reactive getter for the value to watch | |
| * @param ms - Throttle window in milliseconds | |
| * @returns A reactive number that increments when the throttled value changes | |
| */ | |
| export function useThrottle(getValue: () => string | undefined, ms: number) { | |
| let key = $state(0); | |
| let throttleEnd = $state(0); | |
| let lastValue: string | undefined = getValue(); | |
| $effect(() => { | |
| const value = getValue(); | |
| if (value === lastValue) return; | |
| const now = Date.now(); | |
| if (now >= throttleEnd) { | |
| lastValue = value; | |
| key++; | |
| throttleEnd = now + ms; | |
| } | |
| }); | |
| return { | |
| get key() { | |
| return key; | |
| } | |
| }; | |
| } | |