Files
readest/apps/readest-app/src/app/reader/hooks/useCurrentBattery.ts
T
scinac 38552a0c2e feat(reader): adding current Time and Battery to Footer (#3306) (#3402)
* added current time to desktop bar

* added time prototype to footer, needs code cleanup and settings toggle

* fixed settings toggle, added translations and code cleanup

* added battery support and moved Statusbar to own Component

* #3306 added 24 hour clock support

* refactored code styling and getting rid of any type in battery hook

* Add battery info for Tauri Apps

---------

Co-authored-by: Huang Xin <chrox.huang@gmail.com>
2026-03-03 17:10:13 +01:00

67 lines
1.9 KiB
TypeScript

import { useEffect, useState } from 'react';
import { useEnv } from '@/context/EnvContext';
import { getBatteryInfo } from 'tauri-plugin-device-info-api';
import { isTauriAppPlatform } from '@/services/environment';
interface BatteryManager extends EventTarget {
level: number;
charging: boolean;
chargingTime: number;
dischargingTime: number;
}
export function useCurrentBatteryStatus(enabled: boolean) {
const { appService } = useEnv();
const [batteryLevel, setBatteryLevel] = useState<number | null>(null);
useEffect(() => {
if (!enabled || typeof navigator === 'undefined' || !('getBattery' in navigator)) {
return;
}
let battery: BatteryManager | null = null;
const updateBatteryInfo = (batt: BatteryManager) => {
const level = Math.round(batt.level * 100);
setBatteryLevel(level);
};
const handleLevelChange = (event: Event) => {
updateBatteryInfo(event.currentTarget as BatteryManager);
};
(navigator as unknown as { getBattery: () => Promise<BatteryManager> })
.getBattery()
.then((batt) => {
battery = batt;
updateBatteryInfo(batt);
batt.addEventListener('levelchange', handleLevelChange);
});
return () => {
if (battery) {
battery.removeEventListener('levelchange', handleLevelChange);
}
};
}, [enabled]);
useEffect(() => {
if (!enabled || !appService || !isTauriAppPlatform()) return;
const fetchBatteryInfo = async () => {
try {
const info = await getBatteryInfo();
if (info.level !== undefined) {
setBatteryLevel(Math.round(info.level));
}
} catch (error) {
console.error('Failed to fetch battery info:', error);
}
};
fetchBatteryInfo();
const interval = setInterval(fetchBatteryInfo, 60_000);
return () => clearInterval(interval);
}, [appService, enabled]);
return batteryLevel;
}