use-battery
shadcn-hooks/use-batteryFreeHook
A hook to monitor battery information
Install it
npx shadcn@latest add https://shadcn-hooks.com/r/use-battery.jsonSource
1import { useEffect, useState } from 'react'23type BatteryEventName =4 | 'chargingchange'5 | 'chargingtimechange'6 | 'dischargingtimechange'7 | 'levelchange'89const BATTERY_EVENTS: BatteryEventName[] = [10 'chargingchange',11 'chargingtimechange',12 'dischargingtimechange',13 'levelchange',14]1516const DEFAULT_BATTERY_STATE = {17 charging: false,18 chargingTime: 0,19 dischargingTime: 0,20 level: 1,21}2223interface BatteryManagerLike extends EventTarget {24 charging: boolean25 chargingTime: number26 dischargingTime: number27 level: number28}2930interface NavigatorWithBattery extends Navigator {31 getBattery?: () => Promise<BatteryManagerLike>32}3334export interface UseBatteryState {35 isSupported: boolean36 charging: boolean37 chargingTime: number38 dischargingTime: number39 level: number40}4142function isBatterySupported(): boolean {43 if (typeof navigator === 'undefined') {44 return false45 }4647 const nav = navigator as NavigatorWithBattery48 return typeof nav.getBattery === 'function'49}5051/**52 * Monitor the current battery information using the Battery Status API.53 *54 * @see https://developer.mozilla.org/en-US/docs/Web/API/Battery_Status_API55 * @returns Current battery state and support flag.56 */57export function useBattery(): UseBatteryState {58 const [state, setState] = useState<UseBatteryState>(() => {59 const isSupported = isBatterySupported()6061 return {62 isSupported,63 ...DEFAULT_BATTERY_STATE,64 }65 })6667 useEffect(() => {68 if (!state.isSupported) {69 return70 }7172 const nav = navigator as NavigatorWithBattery73 let battery: BatteryManagerLike | null = null74 let disposed = false7576 const updateBatteryState = () => {77 if (!battery || disposed) {78 return79 }8081 setState({82 isSupported: true,83 charging: battery.charging,84 chargingTime: battery.chargingTime,85 dischargingTime: battery.dischargingTime,86 level: battery.level,87 })88 }8990 void nav91 .getBattery?.()92 .then((batteryManager) => {93 if (disposed) {94 return95 }9697 battery = batteryManager98 updateBatteryState()99100 BATTERY_EVENTS.forEach((eventName) => {101 batteryManager.addEventListener(eventName, updateBatteryState)102 })103 })104 .catch(() => {105 // Keep default values when runtime access fails.106 })107108 return () => {109 disposed = true110111 if (!battery) {112 return113 }114115 BATTERY_EVENTS.forEach((eventName) => {116// … truncated
Files it writes
More from shadcn-hooks
All 58 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| use-active-elementuse-active-element | shadcn-hooks | Hooks | Free | no deps | |
| use-booleanuse-boolean | shadcn-hooks | Hooks | Free | no deps | |
| use-click-any-whereuse-click-any-where | shadcn-hooks | Hooks | Free | no deps | |
| use-click-awayuse-click-away | shadcn-hooks | Hooks | Free | no deps | |
| use-clipboarduse-clipboard | shadcn-hooks | Hooks | Free | no deps | |
| use-controllable-valueuse-controllable-value | shadcn-hooks | Hooks | Free | 1 dep | |
| use-counteruse-counter | shadcn-hooks | Hooks | Free | no deps | |
| use-creationuse-creation | shadcn-hooks | Hooks | Free | 1 dep |
