{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-battery-status",
  "title": "UseBatteryStatus",
  "description": "Access system Battery Status via the Battery Status API.",
  "files": [
    {
      "path": "registry/hooks/use-battery-status.tsx",
      "content": "'use client';\n\nimport { useEffect, useState } from 'react';\n\nexport interface BatteryStatus {\n  supported: boolean;\n  level: number;\n  charging: boolean;\n  chargingTime: number;\n  dischargingTime: number;\n}\n\ninterface BatteryManager extends EventTarget {\n  level: number;\n  charging: boolean;\n  chargingTime: number;\n  dischargingTime: number;\n}\n\ntype NavigatorWithBattery = Navigator & {\n  getBattery?: () => Promise<BatteryManager>;\n};\n\nexport function useBatteryStatus(): BatteryStatus {\n  const navigatorWithBattery =\n    typeof navigator !== 'undefined'\n      ? (navigator as NavigatorWithBattery)\n      : undefined;\n  const supported = typeof navigatorWithBattery?.getBattery === 'function';\n\n  const [status, setStatus] = useState<BatteryStatus>({\n    supported,\n    level: 1,\n    charging: false,\n    chargingTime: 0,\n    dischargingTime: 0,\n  });\n\n  useEffect(() => {\n    if (!supported) {\n      return;\n    }\n\n    let battery: BatteryManager | null = null;\n    let isMounted = true;\n\n    const updateStatus = () => {\n      if (!isMounted || !battery) return;\n      // Clamp times: use chargingTime only when charging, dischargingTime only when discharging\n      const chargingTimeValue = battery.charging ? battery.chargingTime : 0;\n      const dischargingTimeValue = battery.charging\n        ? 0\n        : battery.dischargingTime;\n      setStatus({\n        supported: true,\n        level: battery.level,\n        charging: battery.charging,\n        chargingTime: chargingTimeValue === Infinity ? 0 : chargingTimeValue,\n        dischargingTime:\n          dischargingTimeValue === Infinity ? 0 : dischargingTimeValue,\n      });\n    };\n\n    navigatorWithBattery\n      ?.getBattery?.()\n      .then((bat) => {\n        battery = bat;\n        updateStatus();\n        battery.addEventListener('levelchange', updateStatus);\n        battery.addEventListener('chargingchange', updateStatus);\n        battery.addEventListener('chargingtimechange', updateStatus);\n        battery.addEventListener('dischargingtimechange', updateStatus);\n      })\n      .catch(() => {\n        // ignore if getBattery fails\n      });\n\n    return () => {\n      isMounted = false;\n      if (battery) {\n        battery.removeEventListener('levelchange', updateStatus);\n        battery.removeEventListener('chargingchange', updateStatus);\n        battery.removeEventListener('chargingtimechange', updateStatus);\n        battery.removeEventListener('dischargingtimechange', updateStatus);\n      }\n    };\n  }, [supported]);\n\n  return status;\n}\n",
      "type": "registry:hook",
      "target": "hooks/guarahooks/use-battery-status.tsx"
    }
  ],
  "categories": [
    "utilities"
  ],
  "type": "registry:hook"
}