UseIdle
guarahooks/use-idleFreeHook
Detects if the user is idle.
Live preview
live · rendered by the registry
Rendered by guarahooks on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://guarahooks.com/r/use-idle.jsonSource
1'use client';23import { useCallback, useEffect, useRef, useState } from 'react';45const DEFAULT_EVENTS = [6 'keydown',7 'mousemove',8 'touchmove',9 'click',10 'scroll',11 'wheel',12] as const;1314interface UseIdleOptions {15 events?: ReadonlyArray<(typeof DEFAULT_EVENTS)[number]>;16 initialState?: boolean;17}1819export function useIdle(20 timeout: number = 1000,21 options?: UseIdleOptions,22): [boolean, () => void] {23 const { events = DEFAULT_EVENTS, initialState = true } = options || {};24 const [idle, setIdle] = useState<boolean>(initialState);25 const timer = useRef<ReturnType<typeof setTimeout> | null>(null);2627 const reset = useCallback(() => {28 if (!idle) return; // No need to reset if already idle29 setIdle(false);30 if (timer.current) {31 clearTimeout(timer.current);32 }33 timer.current = setTimeout(() => {34 setIdle(true);35 }, timeout);36 }, [timeout, idle]);3738 useEffect(() => {39 // Stable handler for listeners40 const handleEvents = () => {41 if (!idle) {42 // Only reset the timer, don't setIdle(false) if already active43 if (timer.current) {44 clearTimeout(timer.current);45 }46 timer.current = setTimeout(() => {47 setIdle(true);48 }, timeout);49 return;50 }51 setIdle(false);52 if (timer.current) {53 clearTimeout(timer.current);54 }55 timer.current = setTimeout(() => {56 setIdle(true);57 }, timeout);58 };5960 events.forEach((event) => document.addEventListener(event, handleEvents));6162 // Initialize timer63 if (timer.current) {64 clearTimeout(timer.current);65 }66 timer.current = setTimeout(() => {67 setIdle(true);68 }, timeout);6970 return () => {71 events.forEach((event) =>72 document.removeEventListener(event, handleEvents),73 );74 if (timer.current) {75 clearTimeout(timer.current);76 }77 };78 }, [timeout, events.join(','), idle]);7980 return [idle, reset];81}
Files it writes
More from guarahooks
All 100 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| UseAbortControlleruse-abort-controller | guarahooks | Hooks | Free | no deps | |
| UseArrayStateuse-array-state | guarahooks | Hooks | Free | no deps | |
| UseAxiosuse-axios | guarahooks | Hooks | Free | no deps | |
| UseBatteryStatususe-battery-status | guarahooks | Hooks | Free | no deps | |
| UseBetterAuthuse-better-auth | guarahooks | Hooks | Free | no deps | |
| UseClickOutsideuse-click-outside | guarahooks | Hooks | Free | no deps | |
| UseConfirmuse-confirm | guarahooks | Hooks | Free | no deps | |
| UseCookieuse-cookie | guarahooks | Hooks | Free | no deps |
