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