diff --git a/Provider/frontend/src/App.svelte b/Provider/frontend/src/App.svelte
index 7ba8160..0ebfca6 100644
--- a/Provider/frontend/src/App.svelte
+++ b/Provider/frontend/src/App.svelte
@@ -6,6 +6,7 @@
let status = $state("loading");
let errorMsg = $state("");
let showRebootConfirm = $state(false);
+ let isRecovering = $state(false);
let systemInfo = $state({
chip: "—",
@@ -42,14 +43,17 @@
status = "ok";
errorMsg = "";
} catch (e) {
- status = "error";
- errorMsg = e.message || "Connection failed";
+ if (!isRecovering) {
+ status = "error";
+ errorMsg = e.message || "Connection failed";
+ }
}
}
async function handleReboot() {
showRebootConfirm = false;
status = "rebooting";
+ isRecovering = true;
try {
await reboot();
} catch (e) {
@@ -61,6 +65,25 @@
fetchInfo();
});
+ // Resilient recovery polling: Only poll when we are waiting for a reboot
+ $effect(() => {
+ if (isRecovering) {
+ const interval = setInterval(async () => {
+ try {
+ const info = await getSystemInfo();
+ if (info) {
+ console.log("Device back online! Refreshing UI...");
+ window.location.reload();
+ }
+ } catch (e) {
+ // Still offline or rebooting, just keep waiting
+ console.log("Waiting for device...");
+ }
+ }, 2000);
+ return () => clearInterval(interval);
+ }
+ });
+
const infoItems = $derived([
{ label: "Chip", value: systemInfo.chip, icon: "🔧" },
{ label: "Free Heap", value: formatBytes(systemInfo.freeHeap), icon: "💾" },
@@ -168,7 +191,7 @@
-
+ (status = "rebooting")} />
{#if showRebootConfirm}
diff --git a/Provider/frontend/src/lib/OTAUpdate.svelte b/Provider/frontend/src/lib/OTAUpdate.svelte
index 2d47572..905537a 100644
--- a/Provider/frontend/src/lib/OTAUpdate.svelte
+++ b/Provider/frontend/src/lib/OTAUpdate.svelte
@@ -1,4 +1,5 @@