UseBatteryStatus
guarahooks/use-battery-statusFreeHook
Access system Battery Status via the Battery Status API.
Install it
npx shadcn@latest add https://guarahooks.com/r/use-battery-status.jsonSource
1'use client';23import { useEffect, useState } from 'react';45export interface BatteryStatus {6 supported: boolean;7 level: number;8 charging: boolean;9 chargingTime: number;10 dischargingTime: number;11}1213interface BatteryManager extends EventTarget {14 level: number;15 charging: boolean;16 chargingTime: number;17 dischargingTime: number;18}1920type NavigatorWithBattery = Navigator & {21 getBattery?: () => Promise<BatteryManager>;22};2324export function useBatteryStatus(): BatteryStatus {25 const navigatorWithBattery =26 typeof navigator !== 'undefined'27 ? (navigator as NavigatorWithBattery)28 : undefined;29 const supported = typeof navigatorWithBattery?.getBattery === 'function';3031 const [status, setStatus] = useState<BatteryStatus>({32 supported,33 level: 1,34 charging: false,35 chargingTime: 0,36 dischargingTime: 0,37 });3839 useEffect(() => {40 if (!supported) {41 return;42 }4344 let battery: BatteryManager | null = null;45 let isMounted = true;4647 const updateStatus = () => {48 if (!isMounted || !battery) return;49 // Clamp times: use chargingTime only when charging, dischargingTime only when discharging50 const chargingTimeValue = battery.charging ? battery.chargingTime : 0;51 const dischargingTimeValue = battery.charging52 ? 053 : battery.dischargingTime;54 setStatus({55 supported: true,56 level: battery.level,57 charging: battery.charging,58 chargingTime: chargingTimeValue === Infinity ? 0 : chargingTimeValue,59 dischargingTime:60 dischargingTimeValue === Infinity ? 0 : dischargingTimeValue,61 });62 };6364 navigatorWithBattery65 ?.getBattery?.()66 .then((bat) => {67 battery = bat;68 updateStatus();69 battery.addEventListener('levelchange', updateStatus);70 battery.addEventListener('chargingchange', updateStatus);71 battery.addEventListener('chargingtimechange', updateStatus);72 battery.addEventListener('dischargingtimechange', updateStatus);73 })74 .catch(() => {75 // ignore if getBattery fails76 });7778 return () => {79 isMounted = false;80 if (battery) {81 battery.removeEventListener('levelchange', updateStatus);82 battery.removeEventListener('chargingchange', updateStatus);83 battery.removeEventListener('chargingtimechange', updateStatus);84 battery.removeEventListener('dischargingtimechange', updateStatus);85 }86 };87 }, [supported]);8889// … truncated
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 | |
| 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 | |
| UseCopyToClipboarduse-copy-to-clipboard | guarahooks | Hooks | Free | no deps |
