import { sendToMain } from "../../renderer/sendToMain.js";
import { AbstractStateSubscriberWebComponent } from "../util/AbstractStateSubscriberWebComponent.js";
import { registerElement } from "../../renderer/registerElement.js";
export type TemperatureWebComponentState = {
temperatureCelsius: number;
};
export class TemperatureWebComponent extends AbstractStateSubscriberWebComponent {
private isInitialized = false;
private elements!: {
temperatureCelsius: HTMLInputElement;
temperatureFahrenheit: HTMLInputElement;
};
private initialize() {
this.setAttribute("aria-role", "region");
this.innerHTML = `\
`;
this.elements = {
temperatureCelsius: this.querySelector("#temperature-celsius") as HTMLInputElement,
temperatureFahrenheit: this.querySelector("#temperature-fahrenheit") as HTMLInputElement,
};
}
get state(): TemperatureWebComponentState {
return {
temperatureCelsius: this.elements.temperatureCelsius.valueAsNumber || 0,
};
}
connectedCallback() {
if (!this.isInitialized) {
this.initialize();
this.isInitialized = true;
}
this.elements.temperatureFahrenheit.addEventListener("input", this.setCelsiusFromFahrenheit);
this.elements.temperatureCelsius.addEventListener("input", this.setFahrenheitFromCelsius);
this.setFahrenheitFromCelsius();
this.subscribeToStateUpdates((state) => {
this.elements.temperatureCelsius.valueAsNumber = Math.round(state.aeroflyFlight.wind.temperature_celsius);
this.setFahrenheitFromCelsius();
});
this.addEventListener("input", this.handleChange);
}
disconnectedCallback(): void {
super.disconnectedCallback();
this.elements.temperatureFahrenheit.removeEventListener("input", this.setCelsiusFromFahrenheit);
this.elements.temperatureCelsius.removeEventListener("input", this.setFahrenheitFromCelsius);
this.setFahrenheitFromCelsius();
this.removeEventListener("input", this.handleChange);
}
private handleChange = () => {
sendToMain("temperature:set", this.state);
};
private setCelsiusFromFahrenheit = () => {
this.elements.temperatureCelsius.valueAsNumber = Math.round(
(this.elements.temperatureFahrenheit.valueAsNumber - 32) * (5 / 9),
);
};
private setFahrenheitFromCelsius = () => {
const celsius = this.elements.temperatureCelsius.valueAsNumber;
const fahrenheit = Math.round(celsius * 1.8 + 32);
// Only overwrite if the existing rounded Fahrenheit value would not
// convert back to the same rounded Celsius — i.e. the two fields are
// genuinely inconsistent, not just a rounding artefact.
const existingFahrenheit = Math.round(this.elements.temperatureFahrenheit.valueAsNumber);
const celsiusFromExisting = Math.round((existingFahrenheit - 32) / 1.8);
if (celsiusFromExisting !== Math.round(celsius)) {
this.elements.temperatureFahrenheit.valueAsNumber = fahrenheit;
}
};
static registerElement() {
registerElement("startgeraet-temperature", TemperatureWebComponent);
}
}