declare global { interface Navigator { getBattery: () => Promise; } } interface BatteryManager { /** 电池是否充电中 */ readonly charging: boolean; /** 电池充满所需时间(秒),为 0 则充电完毕 */ readonly chargingTime: number; /** 电池剩余可用时间(秒) */ readonly dischargingTime: number; /** 剩余电量,0.0-1.0 */ readonly level: number; /** 电池充电状态改变时触发该监听函数 */ onchargingchange: null | ((event: { target: BatteryManager }) => void); /** 电池充满所需时间改变时触发该监听函数 */ onchargingtimechange: null | ((event: { target: BatteryManager }) => void); /** 电池剩余可用时间改变时触发该监听函数 */ ondischargingtimechange: null | ((event: { target: BatteryManager }) => void); /** 电池电量改变时触发该监听函数 */ onlevelchange: null | ((event: { target: BatteryManager }) => void); } /** 电池状态 */ interface Battery extends Pick { apiSupport: boolean; } /** 电池管理 */ export function useBattery() { const [battery, setBattery] = useSetState({ apiSupport: false, charging: true, chargingTime: Infinity, dischargingTime: Infinity, level: 1, }); /** 更新电池使用状态 */ const updateBattery = ({ charging, chargingTime, dischargingTime, level }: BatteryManager) => { setBattery({ apiSupport: true, charging, chargingTime, dischargingTime, level }); }; /** 计算电池充电状态 */ const calcBatteryStatus = () => { if (battery.charging && battery.level >= 1) return '已充满'; else if (battery.charging) return '充电中'; else return '已断开电源'; }; /** 计算电池剩余可用时间 */ const calcDischargingTime = () => { const hour = battery.dischargingTime / 3600; const minute = (battery.dischargingTime / 60) % 60; return battery.charging ? '电源已接通' : battery.dischargingTime === Infinity ? '计算中...' : `${~~hour}小时${~~minute}分钟`; }; /** 计算电池充满剩余时间 */ const calcChargingTime = () => { const hour = battery.chargingTime / 3600; const minute = (battery.chargingTime / 60) % 60; return `${~~hour}小时${~~minute}分钟`; }; useAsyncEffect(async () => { const BatteryManager = await globalThis.navigator?.getBattery?.(); if (BatteryManager) { updateBattery(BatteryManager); // 电池充电状态改变时触发该监听函数 BatteryManager.onchargingchange = ({ target }) => { updateBattery(target); }; // 电池充满所需时间改变时触发该监听函数 BatteryManager.onchargingtimechange = ({ target }) => { updateBattery(target); }; // 电池剩余可用时间改变时触发该监听函数 BatteryManager.ondischargingtimechange = ({ target }) => { updateBattery(target); }; // 电池电量改变时触发该监听函数 BatteryManager.onlevelchange = ({ target }) => { updateBattery(target); }; } }, []); return { battery, calcDischargingTime, calcChargingTime, calcBatteryStatus }; }