import { sendToMain } from "../../renderer/sendToMain.js"; import { AbstractStateSubscriberWebComponent } from "../util/AbstractStateSubscriberWebComponent.js"; import { registerElement } from "../../renderer/registerElement.js"; import type { ConfigTheme } from "../../../core/io/Config.js"; export type SettingsWebComponentState = { mainMcfFilePath: string; theme: ConfigTheme; fontSizePercent: number; }; export class SettingsWebComponent extends AbstractStateSubscriberWebComponent { private isInitialized = false; private elements!: { mainMcfFilePath: HTMLInputElement; mainMcfFilePathChooser: HTMLButtonElement; theme: HTMLSelectElement; fontSizePercent: HTMLSelectElement; }; get state(): SettingsWebComponentState { return { mainMcfFilePath: this.elements.mainMcfFilePath.value, theme: this.elements.theme.value as ConfigTheme, fontSizePercent: Number(this.elements.fontSizePercent.value), }; } private initialize() { this.innerHTML = `\

Settings

`; this.elements = { mainMcfFilePath: this.querySelector("#settings-mainmcffilepath") as HTMLInputElement, mainMcfFilePathChooser: this.querySelector("#choose-mainmcffilepath") as HTMLButtonElement, theme: this.querySelector("#settings-theme") as HTMLSelectElement, fontSizePercent: this.querySelector("#settings-fontsizepercent") as HTMLSelectElement, }; } connectedCallback() { if (!this.isInitialized) { this.initialize(); this.isInitialized = true; } this.subscribeToStateUpdates((state) => { this.elements.mainMcfFilePath.value = state.config.mainMcfFilePath ?? ""; this.elements.theme.value = state.config.theme ?? "system"; const fontSize = state.config.fontSizePercent ?? 93.75; this.elements.fontSizePercent.value = fontSize.toString(); document.documentElement.style.fontSize = `${fontSize}%`; }); this.addEventListener("input", this.handleChange); this.elements.mainMcfFilePathChooser.addEventListener("click", this.handlePathChooserClick); } disconnectedCallback(): void { super.disconnectedCallback(); this.removeEventListener("input", this.handleChange); this.elements.mainMcfFilePathChooser.removeEventListener("click", this.handlePathChooserClick); } handleChange = async () => { sendToMain("config:set", this.state); }; handlePathChooserClick = async () => { sendToMain("config:choose-main-mcf-path", this.state); }; static registerElement() { registerElement("startgeraet-settings", SettingsWebComponent); } }