93 lines
3.2 KiB
TypeScript
93 lines
3.2 KiB
TypeScript
declare global {
|
||
interface Navigator {
|
||
getBattery: () => Promise<BatteryManager>;
|
||
}
|
||
}
|
||
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<BatteryManager, 'charging' | 'chargingTime' | 'dischargingTime' | 'level'> {
|
||
apiSupport: boolean;
|
||
}
|
||
|
||
/** 电池管理 */
|
||
export function useBattery() {
|
||
const [battery, setBattery] = useSetState<Battery>({
|
||
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 };
|
||
}
|