rsuite
Version:
A suite of react components
37 lines (36 loc) • 905 B
JavaScript
'use client';
import { useEffect, useRef, useCallback } from 'react';
/**
* A timer hook
* @param fn Timer callback function
* @param ms Milliseconds of the timer
* @param enabled Whether to open the timer
*/
export function useTimeout(fn, ms = 0, enabled = true) {
const timeout = useRef(null);
const callback = useRef(fn);
const clear = useCallback(() => {
timeout.current && clearTimeout(timeout.current);
}, []);
const set = useCallback(() => {
timeout.current && clearTimeout(timeout.current);
if (enabled) {
timeout.current = setTimeout(() => {
callback.current?.();
}, ms);
}
}, [ms, enabled]);
// update ref when function changes
useEffect(() => {
callback.current = fn;
}, [fn]);
useEffect(() => {
set();
return clear;
}, [ms, enabled, set, clear]);
return {
clear,
reset: set
};
}
export default useTimeout;