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

93 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-02-18 06:52:01 +00:00
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 };
}