react-use/src/useBattery.ts
2018-12-16 11:02:52 +01:00

57 lines
1.2 KiB
TypeScript

import {useState, useEffect} from 'react';
import {on, off} from './util';
export interface BatterySensorState {
charging: boolean;
level: number;
chargingTime: number;
dischargingTime: number;
}
const useBattery = () => {
const [state, setState] = useState({});
let mounted = true;
let battery: any = null;
const onChange = () => {
const {charging, level, chargingTime, dischargingTime} = battery;
setState({
charging,
level,
chargingTime,
dischargingTime
});
};
const onBattery = () => {
onChange();
on(battery, 'chargingchange', onChange);
on(battery, 'levelchange', onChange);
on(battery, 'chargingtimechange', onChange);
on(battery, 'dischargingtimechange', onChange);
};
useEffect(() => {
(navigator as any).getBattery().then((bat: any) => {
if (mounted) {
battery = bat;
onBattery();
}
});
return () => {
mounted = false;
if (battery) {
off(battery, 'chargingchange', onChange);
off(battery, 'levelchange', onChange);
off(battery, 'chargingtimechange', onChange);
off(battery, 'dischargingtimechange', onChange);
}
};
}, [0]);
return state;
};
export default useBattery;