The weeb for the next gen discord boat - Wamellow
wamellow.com
bot
discord
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}