mentalHealth/01-Web/apps/client/src/hooks/useBattery.ts

93 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 };
}