23008670f3
CI / Build & Quality Checks (push) Successful in 10m13s
- i18next 23->26 + react-i18next 15->17 - prettier 2->3, reformat all files - replace @fontsource/inter with @fontsource-variable/inter 5, update import path - domhandler 5->6 (aligns with transitive deps) - lint-staged 16->17
38 lines
914 B
TypeScript
38 lines
914 B
TypeScript
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
|
/**
|
|
* Temporarily sets a boolean state.
|
|
*
|
|
* @param duration - Duration in milliseconds before resetting (default: 1500)
|
|
* @param initial - Initial value (default: false)
|
|
*/
|
|
export function useTimeoutToggle(duration = 1500, initial = false): [boolean, () => void] {
|
|
const [active, setActive] = useState(initial);
|
|
const timeoutRef = useRef<number | null>(null);
|
|
|
|
const clear = () => {
|
|
if (timeoutRef.current !== null) {
|
|
clearTimeout(timeoutRef.current);
|
|
timeoutRef.current = null;
|
|
}
|
|
};
|
|
|
|
const trigger = useCallback(() => {
|
|
setActive(!initial);
|
|
clear();
|
|
timeoutRef.current = window.setTimeout(() => {
|
|
setActive(initial);
|
|
timeoutRef.current = null;
|
|
}, duration);
|
|
}, [duration, initial]);
|
|
|
|
useEffect(
|
|
() => () => {
|
|
clear();
|
|
},
|
|
[],
|
|
);
|
|
|
|
return [active, trigger];
|
|
}
|