From b96885eaee28b0ffdfd7c656c3d54f5ad9a49e0b Mon Sep 17 00:00:00 2001 From: Peter Kirkham Date: Tue, 5 May 2026 09:19:12 +0000 Subject: [PATCH 1/3] feat(code): toast when manual update check finds no update Generated-By: PostHog Code Task-Id: d79f9950-8e3f-4cc1-9e09-166a4f99aad5 --- apps/code/src/renderer/stores/updateStore.ts | 34 +++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/apps/code/src/renderer/stores/updateStore.ts b/apps/code/src/renderer/stores/updateStore.ts index 084db3257..0851f246e 100644 --- a/apps/code/src/renderer/stores/updateStore.ts +++ b/apps/code/src/renderer/stores/updateStore.ts @@ -1,9 +1,12 @@ import { trpcClient } from "@renderer/trpc/client"; import { logger } from "@utils/logger"; +import { toast } from "@utils/toast"; import { create } from "zustand"; const log = logger.scope("update-store"); +let menuCheckPending = false; + type UpdateStatus = | "idle" | "checking" @@ -70,12 +73,26 @@ export function initializeUpdateStore() { if (current === "checking" || current === "downloading") { useUpdateStore.setState({ status: "idle" }); } + if (menuCheckPending) { + menuCheckPending = false; + toast.success("You're on the latest version"); + } } else if (status.error) { log.error("Update check failed", { error: status.error }); const current = useUpdateStore.getState().status; if (current === "checking" || current === "downloading") { useUpdateStore.setState({ status: "idle" }); } + if (menuCheckPending) { + menuCheckPending = false; + toast.error("Failed to check for updates", { + description: status.error, + }); + } + } else if (status.checking === false && menuCheckPending) { + // Check finished and an update was found (download in progress / ready) — + // the UpdateBanner will surface it, so suppress the menu-check toast. + menuCheckPending = false; } }, onError: (error) => { @@ -97,7 +114,22 @@ export function initializeUpdateStore() { const menuCheckSub = trpcClient.updates.onCheckFromMenu.subscribe(undefined, { onData: () => { - useUpdateStore.getState().checkForUpdates(); + menuCheckPending = true; + trpcClient.updates.check + .mutate() + .then((result) => { + if (!result.success && result.errorCode === "disabled") { + menuCheckPending = false; + toast.error(result.errorMessage ?? "Updates not available"); + } + // For "already_checking", keep the flag so the in-flight check + // surfaces the toast when it resolves. + }) + .catch((error: unknown) => { + menuCheckPending = false; + log.error("Failed to check for updates", { error }); + toast.error("Failed to check for updates"); + }); }, onError: (error) => { log.error("Update menu check subscription error", { error }); From abf9c9b8342f54a4631010e65372f8805cd6a7e8 Mon Sep 17 00:00:00 2001 From: Peter Kirkham Date: Tue, 5 May 2026 10:31:14 +0100 Subject: [PATCH 2/3] Update apps/code/src/renderer/stores/updateStore.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- apps/code/src/renderer/stores/updateStore.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/code/src/renderer/stores/updateStore.ts b/apps/code/src/renderer/stores/updateStore.ts index 0851f246e..c413a56c3 100644 --- a/apps/code/src/renderer/stores/updateStore.ts +++ b/apps/code/src/renderer/stores/updateStore.ts @@ -118,12 +118,17 @@ export function initializeUpdateStore() { trpcClient.updates.check .mutate() .then((result) => { - if (!result.success && result.errorCode === "disabled") { - menuCheckPending = false; - toast.error(result.errorMessage ?? "Updates not available"); + if (!result.success) { + if (result.errorCode === "disabled") { + menuCheckPending = false; + toast.error(result.errorMessage ?? "Updates not available"); + } else if (result.errorCode !== "already_checking") { + // Unknown/future error code — reset the flag so it never gets stuck. + menuCheckPending = false; + } + // For "already_checking", keep the flag so the in-flight check + // surfaces the toast when it resolves. } - // For "already_checking", keep the flag so the in-flight check - // surfaces the toast when it resolves. }) .catch((error: unknown) => { menuCheckPending = false; From b62614d4bdcd67fbbcc6a79cf0a7794dc6e47949 Mon Sep 17 00:00:00 2001 From: Peter Kirkham Date: Tue, 5 May 2026 09:36:24 +0000 Subject: [PATCH 3/3] fix(code): reset menuCheckPending on status subscription error Prevents a stale flag from triggering a spurious "You're on the latest version" toast when a subsequent periodic check resolves after the subscription recovers from an error. Flagged by Greptile. Generated-By: PostHog Code Task-Id: d79f9950-8e3f-4cc1-9e09-166a4f99aad5 --- apps/code/src/renderer/stores/updateStore.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/code/src/renderer/stores/updateStore.ts b/apps/code/src/renderer/stores/updateStore.ts index c413a56c3..23b589bcf 100644 --- a/apps/code/src/renderer/stores/updateStore.ts +++ b/apps/code/src/renderer/stores/updateStore.ts @@ -97,6 +97,7 @@ export function initializeUpdateStore() { }, onError: (error) => { log.error("Update status subscription error", { error }); + menuCheckPending = false; }, });