73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { bind } from "astal";
 | 
						|
import AstalBluetooth from "gi://AstalBluetooth";
 | 
						|
 | 
						|
const BTDevice = ({ device }: { device: AstalBluetooth.Device }) => {
 | 
						|
    return (
 | 
						|
        <button
 | 
						|
            visible={bind(device, "name").as(n => n !== null)}
 | 
						|
            child={
 | 
						|
                <centerbox
 | 
						|
                    startWidget={
 | 
						|
                        <box>
 | 
						|
                            <image
 | 
						|
                                iconName={"chronometer-reset"}
 | 
						|
                                tooltipText={"Device is currently connecting"}
 | 
						|
                                visible={bind(device, "connecting")}
 | 
						|
                            ></image>
 | 
						|
                            <image
 | 
						|
                                iconName={bind(device, "icon")}
 | 
						|
                                marginEnd={3}
 | 
						|
                            ></image>
 | 
						|
                        </box>
 | 
						|
                    }
 | 
						|
                    centerWidget={
 | 
						|
                        <label
 | 
						|
                            label={bind(device, "name").as(n => n ?? "No name")}
 | 
						|
                            marginEnd={5}
 | 
						|
                        ></label>
 | 
						|
                    }
 | 
						|
                    endWidget={
 | 
						|
                        <box>
 | 
						|
                            <label
 | 
						|
                                label={bind(device, "batteryPercentage").as(
 | 
						|
                                    bat => (bat >= 0 ? bat + "%" : "?%"),
 | 
						|
                                )}
 | 
						|
                                tooltipText={"Device's battery percentage"}
 | 
						|
                                marginEnd={3}
 | 
						|
                            ></label>
 | 
						|
                            <image
 | 
						|
                                iconName={bind(device, "paired").as(v =>
 | 
						|
                                    v ? "network-bluetooth-activated-symbolic" : "bluetooth-disconnected-symbolic",
 | 
						|
                                )}
 | 
						|
                            ></image>
 | 
						|
                            <button tooltipText={"Device trusted status"} child={
 | 
						|
                                <image
 | 
						|
                                    iconName={bind(device, "trusted").as(v =>
 | 
						|
                                        v ? "checkbox" : "window-close-symbolic",
 | 
						|
                                    )}
 | 
						|
                                ></image>
 | 
						|
                            } onClicked={() => device.set_trusted( !device.get_trusted() )}
 | 
						|
                            cssClasses={[ 'button-no-margin' ]}
 | 
						|
                            ></button>
 | 
						|
                        </box>
 | 
						|
                    }
 | 
						|
                ></centerbox>
 | 
						|
            }
 | 
						|
            onClicked={() => {
 | 
						|
                connectOrPair( device );
 | 
						|
            }}
 | 
						|
        ></button>
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
const connectOrPair = (device: AstalBluetooth.Device) => {
 | 
						|
    if ( device.get_paired() ) {
 | 
						|
        device.connect_device(() => { });
 | 
						|
        // Show failed message if tried to connect and failed
 | 
						|
    } else {
 | 
						|
        device.pair();
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
export default BTDevice;
 |