{
  "name": "use-battery",
  "author": "Brendan Dash (https://shadcn-hooks.com)",
  "description": "A hook to monitor battery information",
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/hooks/use-battery.ts",
      "content": "import { useEffect, useState } from 'react'\n\ntype BatteryEventName =\n  | 'chargingchange'\n  | 'chargingtimechange'\n  | 'dischargingtimechange'\n  | 'levelchange'\n\nconst BATTERY_EVENTS: BatteryEventName[] = [\n  'chargingchange',\n  'chargingtimechange',\n  'dischargingtimechange',\n  'levelchange',\n]\n\nconst DEFAULT_BATTERY_STATE = {\n  charging: false,\n  chargingTime: 0,\n  dischargingTime: 0,\n  level: 1,\n}\n\ninterface BatteryManagerLike extends EventTarget {\n  charging: boolean\n  chargingTime: number\n  dischargingTime: number\n  level: number\n}\n\ninterface NavigatorWithBattery extends Navigator {\n  getBattery?: () => Promise<BatteryManagerLike>\n}\n\nexport interface UseBatteryState {\n  isSupported: boolean\n  charging: boolean\n  chargingTime: number\n  dischargingTime: number\n  level: number\n}\n\nfunction isBatterySupported(): boolean {\n  if (typeof navigator === 'undefined') {\n    return false\n  }\n\n  const nav = navigator as NavigatorWithBattery\n  return typeof nav.getBattery === 'function'\n}\n\n/**\n * Monitor the current battery information using the Battery Status API.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Battery_Status_API\n * @returns Current battery state and support flag.\n */\nexport function useBattery(): UseBatteryState {\n  const [state, setState] = useState<UseBatteryState>(() => {\n    const isSupported = isBatterySupported()\n\n    return {\n      isSupported,\n      ...DEFAULT_BATTERY_STATE,\n    }\n  })\n\n  useEffect(() => {\n    if (!state.isSupported) {\n      return\n    }\n\n    const nav = navigator as NavigatorWithBattery\n    let battery: BatteryManagerLike | null = null\n    let disposed = false\n\n    const updateBatteryState = () => {\n      if (!battery || disposed) {\n        return\n      }\n\n      setState({\n        isSupported: true,\n        charging: battery.charging,\n        chargingTime: battery.chargingTime,\n        dischargingTime: battery.dischargingTime,\n        level: battery.level,\n      })\n    }\n\n    void nav\n      .getBattery?.()\n      .then((batteryManager) => {\n        if (disposed) {\n          return\n        }\n\n        battery = batteryManager\n        updateBatteryState()\n\n        BATTERY_EVENTS.forEach((eventName) => {\n          batteryManager.addEventListener(eventName, updateBatteryState)\n        })\n      })\n      .catch(() => {\n        // Keep default values when runtime access fails.\n      })\n\n    return () => {\n      disposed = true\n\n      if (!battery) {\n        return\n      }\n\n      BATTERY_EVENTS.forEach((eventName) => {\n        battery?.removeEventListener(eventName, updateBatteryState)\n      })\n    }\n  }, [state.isSupported])\n\n  return state\n}\n",
      "type": "registry:hook"
    }
  ],
  "type": "registry:hook"
}
