38552a0c2e
* 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>
67 lines
1.9 KiB
TypeScript
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;
|
|
}
|