import type { AeroflyAircraft } from "@fboes/aerofly-data/data/aircraft-liveries.json";
import { sendToMain } from "../../renderer/sendToMain.js";
import { AbstractStateSubscriberWebComponent } from "../util/AbstractStateSubscriberWebComponent.js";
import { registerElement } from "../../renderer/registerElement.js";
export type AircraftWebComponentState = {
aircraftName: string;
aircraftPaintscheme: string;
cruiseSpeed_kts: number;
cruiseAltitude_ft: number;
};
export class AircraftWebComponent extends AbstractStateSubscriberWebComponent {
private isInitialized = false;
private showIcaoCode = true;
private elements!: {
aircraftName: HTMLSelectElement;
aircraftPaintscheme: HTMLSelectElement;
aircraftCruiseSpeed: HTMLInputElement;
aircraftCruiseAltitude: HTMLInputElement;
};
get state(): AircraftWebComponentState {
return {
aircraftName: this.elements.aircraftName.value,
aircraftPaintscheme: this.elements.aircraftPaintscheme.value,
cruiseSpeed_kts: this.elements.aircraftCruiseSpeed.valueAsNumber || 1,
cruiseAltitude_ft: this.elements.aircraftCruiseAltitude.valueAsNumber || 1,
};
}
private initialize() {
this.setAttribute("aria-role", "region");
this.innerHTML = `\
`;
this.elements = {
aircraftName: this.querySelector("#aircraft-name") as HTMLSelectElement,
aircraftPaintscheme: this.querySelector("#aircraft-paintscheme") as HTMLSelectElement,
aircraftCruiseSpeed: this.querySelector("#aircraft-cruise-speed") as HTMLInputElement,
aircraftCruiseAltitude: this.querySelector("#aircraft-cruise-altitude") as HTMLInputElement,
};
if (this.showIcaoCode) {
this.elements.aircraftName.title = "ICAO codes in brackets";
this.elements.aircraftPaintscheme.title = "ICAO codes in brackets";
}
}
connectedCallback() {
if (!this.isInitialized) {
this.initialize();
this.isInitialized = true;
}
sendToMain("aircraft:update").then((aircraft) => {
this.elements.aircraftName.innerHTML = aircraft
.sort((a, b) => a.nameFull.localeCompare(b.nameFull))
.map((aircraft) => {
let optionLabel = aircraft.nameFull;
if (this.showIcaoCode && aircraft.icaoCode) {
optionLabel += ` [${aircraft.icaoCode}]`;
}
return ``;
})
.join("");
});
this.subscribeToStateUpdates((state) => {
this.elements.aircraftName.value = state.aeroflyFlight.aircraft.name;
this.elements.aircraftPaintscheme.innerHTML =
state.aircraftData?.liveries
.sort((a, b) => a.name.localeCompare(b.name))
.map((livery) => {
let optionLabel = livery.name;
if (this.showIcaoCode && livery.icaoCode) {
optionLabel += ` [${livery.icaoCode}]`;
}
return ``;
})
.join("") ?? ``;
this.elements.aircraftPaintscheme.value = state.aeroflyFlight.aircraft.paintscheme || "";
this.elements.aircraftCruiseSpeed.valueAsNumber = Math.round(state.route.cruiseSpeed_kts);
this.elements.aircraftCruiseAltitude.valueAsNumber = Math.round(state.route.cruiseAltitude_ft);
});
this.addEventListener("change", this.handleChange);
}
disconnectedCallback(): void {
super.disconnectedCallback();
this.removeEventListener("change", this.handleChange);
}
private handleChange = () => {
sendToMain("aircraft:set", this.state);
};
static registerElement() {
registerElement("startgeraet-aircraft", AircraftWebComponent);
}
}