{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-idle",
  "title": "Idle",
  "description": "Detect inactivity after the last mouse, keyboard, touch, scroll, or resize event.",
  "files": [
    {
      "path": "registry/familis/ui/hooks/use-idle.ts",
      "content": "\"use client\"\n\nimport { useEffect, useState } from \"react\"\n\nconst ACTIVITY_EVENTS = [\n  \"mousemove\",\n  \"mousedown\",\n  \"resize\",\n  \"keydown\",\n  \"touchstart\",\n  \"wheel\",\n] as const\n\nexport function useIdle(ms: number = 60_000): boolean {\n  const [idle, setIdle] = useState(false)\n\n  useEffect(() => {\n    let lastActivity = Date.now()\n    let timeoutId: number | undefined\n    const handleTimeout = () => {\n      timeoutId = undefined\n      const remaining = ms - (Date.now() - lastActivity)\n      if (remaining > 0) {\n        timeoutId = window.setTimeout(handleTimeout, remaining)\n      } else {\n        setIdle(true)\n      }\n    }\n\n    const handleEvent = () => {\n      lastActivity = Date.now()\n      setIdle(false)\n      // Frequent events update the deadline without creating a timer for every event.\n      if (timeoutId === undefined) {\n        timeoutId = window.setTimeout(handleTimeout, ms)\n      }\n    }\n\n    const handleVisibilityChange = () => {\n      if (!document.hidden) handleEvent()\n    }\n\n    timeoutId = window.setTimeout(handleTimeout, ms)\n    for (const event of ACTIVITY_EVENTS) {\n      window.addEventListener(event, handleEvent, { passive: true })\n    }\n    document.addEventListener(\"visibilitychange\", handleVisibilityChange)\n\n    return () => {\n      for (const event of ACTIVITY_EVENTS) {\n        window.removeEventListener(event, handleEvent)\n      }\n      document.removeEventListener(\"visibilitychange\", handleVisibilityChange)\n      window.clearTimeout(timeoutId)\n    }\n  }, [ms])\n\n  return idle\n}\n",
      "type": "registry:hook"
    }
  ],
  "meta": {
    "storybookId": "ui-hooks-idle--default"
  },
  "type": "registry:hook"
}