From baa0f5a0a4bd3bde5c2bfdf7de45d6483a79181b Mon Sep 17 00:00:00 2001 From: Harshit Singh Bhandari Date: Sat, 27 Jun 2026 20:59:16 +0530 Subject: [PATCH] feat(settings): show current app version in Updates section Surface app.getVersion() as a 'Current version vX.Y.Z' line above the update controls so users can see what they're running. Refs #2207. Co-Authored-By: Claude Opus 4.8 --- .../components/GlobalSettingsForm.test.tsx | 9 + .../renderer/components/UpdatesSection.tsx | 7 +- frontend/src/renderer/routeTree.gen.ts | 351 +++++++++--------- 3 files changed, 193 insertions(+), 174 deletions(-) diff --git a/frontend/src/renderer/components/GlobalSettingsForm.test.tsx b/frontend/src/renderer/components/GlobalSettingsForm.test.tsx index 770e35045..a98d7a3b4 100644 --- a/frontend/src/renderer/components/GlobalSettingsForm.test.tsx +++ b/frontend/src/renderer/components/GlobalSettingsForm.test.tsx @@ -16,6 +16,7 @@ const { updDownload, updInstall, updOnStatus, + getVersion, } = vi.hoisted(() => ({ getMock: vi.fn(), postMock: vi.fn(), @@ -28,6 +29,7 @@ const { updDownload: vi.fn(), updInstall: vi.fn(), updOnStatus: vi.fn(), + getVersion: vi.fn(), })); vi.mock("../lib/api-client", () => ({ @@ -37,6 +39,7 @@ vi.mock("../lib/api-client", () => ({ })); vi.mock("../lib/bridge", () => ({ aoBridge: { + app: { getVersion }, appState: { getMigration, setMigration }, updateSettings: { get: getUpdate, set: setUpdate }, updates: { @@ -72,6 +75,7 @@ beforeEach(() => { updDownload.mockResolvedValue(undefined); updInstall.mockResolvedValue(undefined); updOnStatus.mockReturnValue(() => undefined); + getVersion.mockResolvedValue("1.4.0"); }); describe("GlobalSettingsForm", () => { @@ -129,6 +133,11 @@ describe("GlobalSettingsForm", () => { expect(screen.getByRole("button", { name: "Run migration" })).toBeDisabled(); }); + it("shows the current app version", async () => { + renderForm(); + expect(await screen.findByText("v1.4.0")).toBeInTheDocument(); + }); + it("Check for updates triggers a manual check", async () => { renderForm(); const btn = await screen.findByRole("button", { name: "Check for updates" }); diff --git a/frontend/src/renderer/components/UpdatesSection.tsx b/frontend/src/renderer/components/UpdatesSection.tsx index f9817c7d5..3cd1e397f 100644 --- a/frontend/src/renderer/components/UpdatesSection.tsx +++ b/frontend/src/renderer/components/UpdatesSection.tsx @@ -117,6 +117,7 @@ export function UpdatesSection() { // updates are off, so users who never opted in can still pull the latest build. function UpdateActions() { const [status, setStatus] = useState({ state: "idle" }); + const version = useQuery({ queryKey: ["app-version"], queryFn: () => aoBridge.app.getVersion() }); useEffect(() => { let live = true; @@ -135,7 +136,11 @@ function UpdateActions() { const busy = checking || downloading; return ( -
+
+
+ Current version + {version.data ? `v${version.data}` : "…"} +