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 @@