diff --git a/astro.config.mjs b/astro.config.mjs index 4398192..902d7b2 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -11,7 +11,11 @@ import preact from '@astrojs/preact'; export default defineConfig({ vite: { build: { - sourcemap: true + // Source maps go on the device's LittleFS otherwise — pure debug data the + // browser only fetches if devtools is open. Each .map adds ~30–300 KB to + // the flash image. Keep production builds map-free; if you need a map for + // debugging a specific build, flip to true temporarily. + sourcemap: false } }, integrations: [tailwind(), playformCompress(), compressor(), preact()],//Sonda() diff --git a/src/components/AccessPointConfigModal.astro b/src/components/AccessPointConfigModal.astro index 91dc15f..e9c22b5 100644 --- a/src/components/AccessPointConfigModal.astro +++ b/src/components/AccessPointConfigModal.astro @@ -1,8 +1,3 @@ ---- -import IconEye from "../icons/IconEye.astro"; -import IconEyeClosed from "../icons/IconEyeClosed.astro"; ---- - @@ -83,7 +73,8 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; $current_network_configuration, send_new_network_configuration_to_alpha, ConnectionMode, - } from "../backend_components/NetworkManagerStore"; + type NetworkConfigNVS, + } from "./NetworkManagerStore"; const modal = document.getElementById("ap-config-modal") as HTMLDialogElement; const apSSID = document.getElementById("ap-ssid") as HTMLInputElement; @@ -94,8 +85,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; const apPasswordError = document.getElementById("ap-password-error"); const apChannel = document.getElementById("ap-channel") as HTMLSelectElement; const toggleApPasswordBtn = document.getElementById("toggle-ap-password-btn"); - const apEyeOpen = document.getElementById("ap-eye-icon-open"); - const apEyeClosed = document.getElementById("ap-eye-icon-closed"); + const apEyeText = document.getElementById("ap-eye-text"); function resetModal() { if (apSSID) apSSID.value = ""; @@ -105,14 +95,15 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; apSSIDError?.classList.add("hidden"); apPasswordWrap?.classList.remove("input-error"); apPasswordError?.classList.add("hidden"); - apEyeOpen?.classList.remove("hidden"); - apEyeClosed?.classList.add("hidden"); + if (apEyeText) apEyeText.textContent = "show"; } function prefillFromConfig() { const cfg = $current_network_configuration.get(); if (apSSID) apSSID.value = cfg.SSID_AP || ""; - if (apPassword) apPassword.value = cfg.Password_AP || ""; + // Password is intentionally blanked by firmware on read — leave the field empty so the + // user is forced to re-enter it. Updating it without re-entering would risk wiping it. + if (apPassword) apPassword.value = ""; if (apChannel) apChannel.value = String(cfg.AP_Channel ?? 0); } @@ -132,8 +123,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; if (!apPassword) return; const isVisible = apPassword.type === "text"; apPassword.type = isVisible ? "password" : "text"; - apEyeOpen?.classList.toggle("hidden", !isVisible); - apEyeClosed?.classList.toggle("hidden", isVisible); + if (apEyeText) apEyeText.textContent = isVisible ? "show" : "hide"; }); apSSID?.addEventListener("input", () => { @@ -175,24 +165,10 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; if (!valid) return; const base = $current_network_configuration.get(); - - // Derive the APSTA connection mode: keep ETH DHCP/static, switch WiFi to APSTA - let apstaMode: ConnectionMode; - switch (base.Connection_Mode) { - case ConnectionMode.CONNECTION_MODE_ETH_STATIC_NO_WIFI: - case ConnectionMode.CONNECTION_MODE_ETH_STATIC_APSTA: - case ConnectionMode.CONNECTION_MODE_ETH_STATIC_STA_DHCP: - case ConnectionMode.CONNECTION_MODE_ETH_STATIC_STA_STATIC: - apstaMode = ConnectionMode.CONNECTION_MODE_ETH_STATIC_APSTA; - break; - default: - apstaMode = ConnectionMode.CONNECTION_MODE_ETH_DHCP_APSTA; - } - - const updatedConfig = { + // No ethernet in our case — APSTA is always just APSTA mode, no eth-static-vs-dhcp variants. + const updatedConfig: NetworkConfigNVS = { ...base, - Connection_Mode: apstaMode, - WiFi_Enabled: true, + Connection_Mode: ConnectionMode.CONNECTION_MODE_APSTA, SSID_AP: apSSID.value, Password_AP: apPassword?.value ?? "", AP_Channel: parseInt(apChannel?.value ?? "0", 10), diff --git a/src/components/NetworkOverview.astro b/src/components/NetworkOverview.astro index d9347a8..472e455 100644 --- a/src/components/NetworkOverview.astro +++ b/src/components/NetworkOverview.astro @@ -1,5 +1,7 @@ --- import { IconPlant } from "@tabler/icons-preact"; +import StationConfigModal from "./StationConfigModal.astro"; +import AccessPointConfigModal from "./AccessPointConfigModal.astro"; ---
@@ -163,26 +165,14 @@ import { IconPlant } from "@tabler/icons-preact";
- - + + + + - - - @@ -200,10 +181,9 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; type WiFiNetwork, type NetworkConfigNVS, ConnectionMode, - AntennaSelection, $current_network_configuration, send_new_network_configuration_to_alpha, - } from "../backend_components/NetworkManagerStore"; + } from "./NetworkManagerStore"; import { is_valid_ip_format, @@ -211,7 +191,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; isPracticalNetmask, isInValidHostRange, isInSameSubnet, - } from "../helper_scripts/IP_Subnetmask_validation"; + } from "./helper_scripts/IP_Subnetmask_validation"; const stationSSID = document.getElementById("station-ssid") as HTMLInputElement; const stationSsidError = document.getElementById("station-ssid-error"); @@ -222,15 +202,13 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; const scanList = document.getElementById("network-scan-list"); const refreshBtnRow = document.getElementById("refresh-btn-row"); const toggleStationPasswordBtn = document.getElementById("toggle-station-password-btn") as HTMLButtonElement | null; - const stationEyeOpen = document.getElementById("station-eye-icon-open"); - const stationEyeClosed = document.getElementById("station-eye-icon-closed"); + const stationEyeText = document.getElementById("station-eye-text"); toggleStationPasswordBtn?.addEventListener("click", () => { if (!stationPassword) return; const isVisible = stationPassword.type === "text"; stationPassword.type = isVisible ? "password" : "text"; - stationEyeOpen?.classList.toggle("hidden", !isVisible); - stationEyeClosed?.classList.toggle("hidden", isVisible); + if (stationEyeText) stationEyeText.textContent = isVisible ? "show" : "hide"; }); const staticIpToggle = document.getElementById("static-ip-toggle-modal") as HTMLInputElement; @@ -542,8 +520,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; scanList?.classList.remove("hidden"); selectedNetworkForConfirm = null; if (stationPassword) stationPassword.type = "password"; - stationEyeOpen?.classList.remove("hidden"); - stationEyeClosed?.classList.add("hidden"); + if (stationEyeText) stationEyeText.textContent = "show"; performScan(); } }); @@ -594,8 +571,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; scanList?.classList.remove("hidden"); selectedNetworkForConfirm = null; if (stationPassword) stationPassword.type = "password"; - stationEyeOpen?.classList.remove("hidden"); - stationEyeClosed?.classList.add("hidden"); + if (stationEyeText) stationEyeText.textContent = "show"; clear_scanned_wifi_networks(); renderNetworkList([]); }); @@ -713,32 +689,20 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; let pendingConfig: NetworkConfigNVS | null = null; saveStationBtn?.addEventListener("click", () => { - const _currCfg = $current_network_configuration.get(); - const _newStaDHCP = !staticIpToggle?.checked; // toggle checked = static IP, unchecked = DHCP - const _staMode = _currCfg.DHCP_Mode_Ethernet - ? (_newStaDHCP ? ConnectionMode.CONNECTION_MODE_ETH_DHCP_STA_DHCP : ConnectionMode.CONNECTION_MODE_ETH_DHCP_STA_STATIC) - : (_newStaDHCP ? ConnectionMode.CONNECTION_MODE_ETH_STATIC_STA_DHCP : ConnectionMode.CONNECTION_MODE_ETH_STATIC_STA_STATIC); const _cfg = $current_network_configuration.get(); + const _newStaDHCP = !staticIpToggle?.checked; // toggle checked = static IP, unchecked = DHCP + // No ethernet variants anymore — STA is either DHCP or STATIC, period. + const _staMode = _newStaDHCP ? ConnectionMode.CONNECTION_MODE_STA_DHCP : ConnectionMode.CONNECTION_MODE_STA_STATIC; let temp_station_network_config: NetworkConfigNVS = { Connection_Mode: _staMode, - Antenna_Power: _cfg.Antenna_Power, - Antenna_Selection: _cfg.Antenna_Selection, - DHCP_Mode_Station: _cfg.DHCP_Mode_Station, - DHCP_Mode_Ethernet: _cfg.DHCP_Mode_Ethernet, + DHCP_Mode_Station: _newStaDHCP, AP_Channel: _cfg.AP_Channel, - WiFi_Enabled: _cfg.WiFi_Enabled, - IP_Address_Ethernet: _cfg.IP_Address_Ethernet, IP_Address_Station: _cfg.IP_Address_Station, - Gateway_IP_Address_Ethernet: _cfg.Gateway_IP_Address_Ethernet, Gateway_IP_Address_Station: _cfg.Gateway_IP_Address_Station, - Netmask_Ethernet: _cfg.Netmask_Ethernet, Netmask_Station: _cfg.Netmask_Station, - Static_Cfg_IP_Address_Ethernet: _cfg.Static_Cfg_IP_Address_Ethernet, - Static_Cfg_IP_Address_Station: _cfg.Static_Cfg_IP_Address_Station, + Static_Cfg_IP_Address_Station: "", Static_Cfg_Gateway_IP_Address_Station: "", - Static_Cfg_Gateway_IP_Address_Ethernet: _cfg.Static_Cfg_Gateway_IP_Address_Ethernet, Static_Cfg_Netmask_Station: "", - Static_Cfg_Netmask_Ethernet: _cfg.Static_Cfg_Netmask_Ethernet, SSID_Station: "", Password_Station: "", SSID_AP: _cfg.SSID_AP, @@ -903,7 +867,7 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; temp_station_network_config.SSID_Station = stationSSID.value; temp_station_network_config.Password_Station = stationPassword.value; temp_station_network_config.DHCP_Mode_Station = false; - temp_station_network_config.WiFi_Enabled = true; + // WiFi is always on for this board — no WiFi_Enabled field needed. } } else { // enable DHCP mode @@ -913,7 +877,6 @@ import IconEyeClosed from "../icons/IconEyeClosed.astro"; temp_station_network_config.SSID_Station = stationSSID.value; temp_station_network_config.Password_Station = stationPassword.value; temp_station_network_config.DHCP_Mode_Station = true; - temp_station_network_config.WiFi_Enabled = true; } // Store the config and show confirmation view