import { sendToMain } from "../../renderer/sendToMain.js"; import { AbstractStateSubscriberWebComponent } from "../util/AbstractStateSubscriberWebComponent.js"; import { registerElement } from "../../renderer/registerElement.js"; export type VisibilityWebComponentState = { visibilityMeters: number; }; export class VisibilityWebComponent extends AbstractStateSubscriberWebComponent { private isInitialized = false; private elements!: { visibilitySm: HTMLInputElement; visibilityMeters: HTMLInputElement; }; private initialize() { this.setAttribute("aria-role", "region"); this.innerHTML = `\
SM
m
`; this.elements = { visibilitySm: this.querySelector("#visibility-sm") as HTMLInputElement, visibilityMeters: this.querySelector("#visibility-meters") as HTMLInputElement, }; } get state(): VisibilityWebComponentState { return { visibilityMeters: this.elements.visibilityMeters.valueAsNumber || 0, }; } connectedCallback() { if (!this.isInitialized) { this.initialize(); this.isInitialized = true; } this.elements.visibilitySm.addEventListener("input", this.setMetersFromSm); this.elements.visibilityMeters.addEventListener("input", this.setSmFromMeters); this.setSmFromMeters(); this.subscribeToStateUpdates((state) => { this.elements.visibilityMeters.valueAsNumber = Math.round(state.aeroflyFlight.visibility_meter); this.setSmFromMeters(); }); this.addEventListener("input", this.handleChange); } disconnectedCallback(): void { super.disconnectedCallback(); this.elements.visibilitySm.removeEventListener("input", this.setMetersFromSm); this.elements.visibilityMeters.removeEventListener("input", this.setSmFromMeters); this.removeEventListener("input", this.handleChange); } private handleChange = () => { sendToMain("visibility:set", this.state); }; private setMetersFromSm = () => { this.elements.visibilityMeters.valueAsNumber = this.elements.visibilitySm.valueAsNumber === 10 ? 9999 : Math.round((this.elements.visibilitySm.valueAsNumber * 1609.344) / 100) * 100; }; private setSmFromMeters = () => { this.elements.visibilitySm.valueAsNumber = this.elements.visibilityMeters.valueAsNumber === 9999 ? 10 : Math.round(this.elements.visibilityMeters.valueAsNumber / 1609.344 / 0.25) * 0.25; }; static registerElement() { registerElement("startgeraet-visibility", VisibilityWebComponent); } }