const DEFAULT_EVENTS = [
'mousemove',
'mousedown',
'click',
'mouseover',
'resize',
'keydown',
'touchstart',
'wheel',
];
import {useState, useEffect, useRef} from 'react';
export default function useIdle(
ms = 60_000,
initialState = false,
events = DEFAULT_EVENTS,
) {
const [isIdle, setIsIdle] = useState(initialState);
const timerRef = useRef(null);
useEffect(() => {
const clearTimer = () => {
if (timerRef.current !== null) {
clearTimeout(timerRef.current);
timerRef.current = null;
}
};
const resetTimer = () => {
clearTimer();
setIsIdle(false);
timerRef.current = setTimeout(() => {
setIsIdle(true);
}, ms);
};
const handleVisibilityChange = () => {
if (document.hidden) {
clearTimer();
setIsIdle(true);
} else {
resetTimer();
}
};
for (const event of events) {
window.addEventListener(event, resetTimer);
}
document.addEventListener('visibilitychange', handleVisibilityChange);
resetTimer();
return () => {
clearTimer();
for (const event of events) {
window.removeEventListener(event, resetTimer);
}
document.removeEventListener('visibilitychange', handleVisibilityChange);
};
}, [ms, events]);
return isIdle;
}