@supunlakmal/hooks
Version:
A collection of reusable React hooks
75 lines • 3.16 kB
JavaScript
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