The weeb for the next gen discord boat - Wamellow wamellow.com
bot discord
at master 42 lines 1.2 kB view raw
1import { useMemo, useState } from "react"; 2 3const debounce = <T>(fn: (...args: T[]) => void, delay: number) => { 4 let timeout: NodeJS.Timeout | undefined; 5 return (...args: T[]) => { 6 if (timeout !== undefined) { 7 clearTimeout(timeout); 8 } 9 timeout = setTimeout(fn, delay, ...args); 10 }; 11}; 12 13export function useStateDebounced<T>(initialValue: T, delay: number) { 14 const [, _setInputValue] = useState<T>(initialValue); 15 16 const [debouncedInputValue, setDebouncedInputValue] = useState<T>( 17 initialValue 18 ); 19 20 const memoizedDebounce = useMemo( 21 () => 22 debounce((value: T) => { 23 setDebouncedInputValue(value); 24 }, delay), 25 [delay] 26 ); 27 28 const setInputValue = (value: T | ((prevState: T) => T)) => { 29 if (value instanceof Function) { 30 _setInputValue((p) => { 31 const mutated = value(p); 32 memoizedDebounce(mutated); 33 return mutated; 34 }); 35 } else { 36 _setInputValue(value); 37 memoizedDebounce(value); 38 } 39 }; 40 41 return [debouncedInputValue, setInputValue] as const; 42}