From e01822f4be167a44b4f6a12836dc1648c662dc29 Mon Sep 17 00:00:00 2001 From: jaylfc Date: Tue, 27 Oct 2026 06:51:11 +0000 Subject: [PATCH 1/2] fix: reset mounted ref on effect start so StrictMode remount does not discard every load WifiPanel.tsx: moved mounted.current = true before const load in useEffect BluetoothPanel.tsx: moved mounted.current = true before const load in useEffect WifiPanel.test.tsx: added StrictMode test asserting loaded content appears BluetoothPanel.test.tsx: added StrictMode test asserting loaded content appears FAILED src/apps/SettingsApp/BluetoothPanel.test.tsx > BluetoothPanel StrictMode > loads devices even when mounted remounts under StrictMode FAILED src/apps/SettingsApp/WifiPanel.test.tsx > WifiPanel StrictMode > loads access points even when mounted remounts under StrictMode --- changelog.d/tsk-4owb7b-fix-forward.md | 2 ++ .../apps/SettingsApp/BluetoothPanel.test.tsx | 17 +++++++++++++++++ .../src/apps/SettingsApp/BluetoothPanel.tsx | 1 + .../src/apps/SettingsApp/WifiPanel.test.tsx | 19 +++++++++++++++++++ desktop/src/apps/SettingsApp/WifiPanel.tsx | 1 + 5 files changed, 40 insertions(+) create mode 100644 changelog.d/tsk-4owb7b-fix-forward.md diff --git a/changelog.d/tsk-4owb7b-fix-forward.md b/changelog.d/tsk-4owb7b-fix-forward.md new file mode 100644 index 000000000..bca37bc1d --- /dev/null +++ b/changelog.d/tsk-4owb7b-fix-forward.md @@ -0,0 +1,2 @@ +### Fixed +- reset the mounted ref on effect start so StrictMode's remount does not discard every load \ No newline at end of file diff --git a/desktop/src/apps/SettingsApp/BluetoothPanel.test.tsx b/desktop/src/apps/SettingsApp/BluetoothPanel.test.tsx index bddc7b575..9f0ad91af 100644 --- a/desktop/src/apps/SettingsApp/BluetoothPanel.test.tsx +++ b/desktop/src/apps/SettingsApp/BluetoothPanel.test.tsx @@ -1,6 +1,7 @@ import { describe, it, expect, vi, afterEach } from "vitest"; import { render, screen, waitFor, act } from "@testing-library/react"; import { BluetoothPanel } from "./BluetoothPanel"; +import { StrictMode } from "react"; function json(obj: unknown, status = 200) { return new Response(JSON.stringify(obj), { @@ -96,3 +97,19 @@ describe("BluetoothPanel", () => { vi.useRealTimers(); }, 15000); }); + +describe("BluetoothPanel StrictMode", () => { + it("loads devices even when mounted remounts under StrictMode", async () => { + vi.spyOn(globalThis, "fetch").mockResolvedValue( + json({ + available: true, + adapters: [{ path: "/org/bluez/hci0", address: "AA:BB:CC:DD:EE:FF", powered: true }], + devices: [{ path: "/org/bluez/hci0/dev_11_22_33_44_55_66", address: "11:22:33:44:55:66", name: "TestDevice", paired: true, connected: true, trusted: true }], + }) + ); + render(); + await waitFor(() => { + expect(screen.getByText("TestDevice")).toBeInTheDocument(); + }); + }); +}); diff --git a/desktop/src/apps/SettingsApp/BluetoothPanel.tsx b/desktop/src/apps/SettingsApp/BluetoothPanel.tsx index fec553cbe..d50ff756a 100644 --- a/desktop/src/apps/SettingsApp/BluetoothPanel.tsx +++ b/desktop/src/apps/SettingsApp/BluetoothPanel.tsx @@ -9,6 +9,7 @@ export function BluetoothPanel() { const mounted = useRef(true); useEffect(() => { + mounted.current = true; const load = async () => { try { const res = await fetch("/api/hardware/bluetooth", { credentials: "include" }); diff --git a/desktop/src/apps/SettingsApp/WifiPanel.test.tsx b/desktop/src/apps/SettingsApp/WifiPanel.test.tsx index 9c910f0ac..284e9aa18 100644 --- a/desktop/src/apps/SettingsApp/WifiPanel.test.tsx +++ b/desktop/src/apps/SettingsApp/WifiPanel.test.tsx @@ -1,6 +1,7 @@ import { describe, it, expect, vi, afterEach } from "vitest"; import { render, screen, waitFor, act } from "@testing-library/react"; import { WifiPanel } from "./WifiPanel"; +import { StrictMode } from "react"; function json(obj: unknown, status = 200) { return new Response(JSON.stringify(obj), { @@ -92,4 +93,22 @@ it("refreshes access points every 10s and clears interval on unmount", async () expect(fetchSpy).toHaveBeenCalledTimes(2); vi.useRealTimers(); }, 15000); +}); + +describe("WifiPanel StrictMode", () => { + it("loads access points even when mounted remounts under StrictMode", async () => { + vi.spyOn(globalThis, "fetch").mockResolvedValue( + json({ + available: true, + wifi_enabled: true, + access_points: [ + { ssid: "TestNetwork", strength: 75, frequency: 2437, secured: true, active: true }, + ], + }) + ); + render(); + await waitFor(() => { + expect(screen.getByText("TestNetwork")).toBeInTheDocument(); + }); + }); }); \ No newline at end of file diff --git a/desktop/src/apps/SettingsApp/WifiPanel.tsx b/desktop/src/apps/SettingsApp/WifiPanel.tsx index 9fc79a8f0..0bc87c46d 100644 --- a/desktop/src/apps/SettingsApp/WifiPanel.tsx +++ b/desktop/src/apps/SettingsApp/WifiPanel.tsx @@ -10,6 +10,7 @@ export function WifiPanel() { const mounted = useRef(true); useEffect(() => { + mounted.current = true; const load = async () => { try { const res = await fetch("/api/hardware/wifi", { credentials: "include" }); From 0125032486dc5d868f1e805e555f9882970b6c24 Mon Sep 17 00:00:00 2001 From: jaylfc Date: Tue, 27 Oct 2026 06:53:27 +0000 Subject: [PATCH 2/2] test: harness-measured red for tsk-4owb7b MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RED-FIRST proof measured by the harness (measure_red.sh): the changed tests run against product code at base 2c4c77a67, then against this branch. RED on the base: ``` $ (cd desktop && npx vitest run src/apps/SettingsApp/BluetoothPanel.test.tsx src/apps/SettingsApp/WifiPanel.test.tsx) × loads devices even when mounted remounts under StrictMode 2012ms (retry x1) × loads access points even when mounted remounts under StrictMode 2012ms (retry x1) FAIL src/apps/SettingsApp/BluetoothPanel.test.tsx > BluetoothPanel StrictMode > loads devices even when mounted remounts under StrictMode FAIL src/apps/SettingsApp/WifiPanel.test.tsx > WifiPanel StrictMode > loads access points even when mounted remounts under StrictMode Test Files 2 failed (2) Tests 2 failed | 11 passed (13) exit 1 ``` GREEN on the fix: ``` Test Files 2 passed (2) Tests 13 passed (13) exit 0 ```