UNPKG

@supunlakmal/hooks

Version:

A collection of reusable React hooks

75 lines 3.16 kB
import { useState, useEffect } from 'react'; const isBrowser = typeof window !== 'undefined'; const nav = isBrowser ? navigator : undefined; /** * Tracks the device's battery status using the Battery Status API. * * @returns {BatteryState} An object containing the battery status details. */ export function useBatteryStatus() { const [state, setState] = useState({ isSupported: !!(isBrowser && (nav === null || nav === void 0 ? void 0 : nav.getBattery)), loading: true, charging: null, level: null, chargingTime: null, dischargingTime: null, error: null, }); useEffect(() => { if (!(nav === null || nav === void 0 ? void 0 : nav.getBattery)) { setState((s) => (Object.assign(Object.assign({}, s), { loading: false, isSupported: false, error: new Error('Battery Status API not supported by this browser.') }))); return; } let batteryManager = null; const updateBatteryState = () => { if (batteryManager) { setState({ isSupported: true, loading: false, charging: batteryManager.charging, level: batteryManager.level, chargingTime: batteryManager.chargingTime === Infinity ? null : batteryManager.chargingTime, dischargingTime: batteryManager.dischargingTime === Infinity ? null : batteryManager.dischargingTime, error: null, }); } }; const setupListeners = (manager) => { manager.addEventListener('chargingchange', updateBatteryState); manager.addEventListener('levelchange', updateBatteryState); manager.addEventListener('chargingtimechange', updateBatteryState); manager.addEventListener('dischargingtimechange', updateBatteryState); }; const removeListeners = (manager) => { if (manager) { manager.removeEventListener('chargingchange', updateBatteryState); manager.removeEventListener('levelchange', updateBatteryState); manager.removeEventListener('chargingtimechange', updateBatteryState); manager.removeEventListener('dischargingtimechange', updateBatteryState); } }; nav .getBattery() .then((manager) => { batteryManager = manager; updateBatteryState(); setupListeners(manager); }) .catch((err) => { setState((s) => (Object.assign(Object.assign({}, s), { loading: false, error: err instanceof Error ? err : new Error('Failed to get battery status') }))); }); return () => { // Pass the manager instance captured at the time of effect setup removeListeners(batteryManager); }; }, []); // Run only on mount return state; } //# sourceMappingURL=useBatteryStatus.js.map