58 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { bind } from "astal";
 | 
						|
import Battery from "gi://AstalBattery";
 | 
						|
 | 
						|
export const BatteryBox = () => {
 | 
						|
    const battery = Battery.get_default();
 | 
						|
    const batteryEnergy = (energyRate: number) => {
 | 
						|
        return energyRate > 0.1 ? `${Math.round(energyRate * 10) / 10} W ` : "";
 | 
						|
    };
 | 
						|
    return (
 | 
						|
        <box
 | 
						|
            cssClasses={["battery-info"]}
 | 
						|
            visible={bind(battery, "isBattery")}
 | 
						|
            hexpand={false}
 | 
						|
            vexpand={false}
 | 
						|
        >
 | 
						|
            <image
 | 
						|
                iconName={bind(battery, "batteryIconName")}
 | 
						|
                tooltipText={bind(battery, "energyRate").as(er =>
 | 
						|
                    batteryEnergy(er),
 | 
						|
                )}
 | 
						|
            />
 | 
						|
            <label
 | 
						|
                label={bind(battery, "percentage").as(
 | 
						|
                    p => ` ${Math.round(p * 100)}%`,
 | 
						|
                )}
 | 
						|
                marginEnd={3}
 | 
						|
            />
 | 
						|
            <label
 | 
						|
                cssClasses={["battery-time"]}
 | 
						|
                visible={bind(battery, "charging").as(c => !c)}
 | 
						|
                label={bind(battery, "timeToEmpty").as(t => `(${toTime(t)})`)}
 | 
						|
                tooltipText={bind(battery, 'energyRate').as(er => `Time to empty. Power usage: ${batteryEnergy(er)}`)}
 | 
						|
            />
 | 
						|
            <label
 | 
						|
                cssClasses={["battery-time"]}
 | 
						|
                visible={bind(battery, "charging")}
 | 
						|
                label={bind(battery, "timeToFull").as(t => `(${toTime(t)})`)}
 | 
						|
                tooltipText={bind(battery, 'energyRate').as(er => `Time to full. Charge rate: ${batteryEnergy(er)}`)}
 | 
						|
            />
 | 
						|
        </box>
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
const MINUTE = 60;
 | 
						|
const HOUR = MINUTE * 60;
 | 
						|
const toTime = (time: number) => {
 | 
						|
    if (!time) return "Waiting on BIOS"
 | 
						|
    if (time > 24 * HOUR) return "24h+";
 | 
						|
 | 
						|
    const hours = Math.round(time / HOUR);
 | 
						|
    const minutes = Math.round((time - hours * HOUR) / MINUTE);
 | 
						|
 | 
						|
    const hoursDisplay = hours > 0 ? `${hours}h` : "";
 | 
						|
    const minutesDisplay = minutes > 0 ? `${minutes}m` : "";
 | 
						|
 | 
						|
    return `${hoursDisplay}${minutesDisplay}`;
 | 
						|
};
 |