-
Notifications
You must be signed in to change notification settings - Fork 87
/
Copy pathuse-temporary-state.ts
39 lines (32 loc) · 1.33 KB
/
use-temporary-state.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { useCallback, useEffect, useRef, useState } from "react";
type UseTemporaryStateReturnType<ValueType> = [value: ValueType, set: (value: ValueType) => void];
/**
* @description Hook to have state that reverts to a default value after a timeout when you update it. Useful for temporarily showing messages or disabling buttons.
*
* @param defaultValue Default value
* @param timeout Milliseconds to revert to default value after setting a temporary value
* @returns [value, setTemporaryValue]
*/
export const useTemporaryState = <ValueType>(
defaultValue: ValueType,
timeout: number,
): UseTemporaryStateReturnType<ValueType> => {
const [value, setValue] = useState<ValueType>(defaultValue);
const timeoutRef = useRef<ReturnType<typeof setTimeout>>();
const setTemporaryValue = useCallback(
(tempValue: ValueType, revertValue?: ValueType) => {
timeoutRef.current && clearTimeout(timeoutRef.current);
setValue(tempValue);
timeoutRef.current = setTimeout(() => {
setValue(revertValue !== undefined ? revertValue : defaultValue);
}, timeout);
},
[defaultValue, timeout],
);
useEffect(() => {
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
}, []);
return [value, setTemporaryValue];
};