From ab31d3063eef2e5a33ac6638de58d6ac3faf3976 Mon Sep 17 00:00:00 2001 From: xintaofei Date: Sun, 8 Mar 2026 08:35:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E6=97=B6=E7=9A=84=E6=8F=90=E7=A4=BA=E8=AF=AD=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A3=80=E6=9F=A5=E6=9B=B4=E6=96=B0=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E7=82=B9=E5=87=BB=E5=90=8E=E6=9C=89=E9=87=8D=E5=BD=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../settings/system-network-settings.tsx | 81 ++++++++++++++----- src/i18n/messages/en.json | 9 ++- src/i18n/messages/zh-CN.json | 9 ++- src/i18n/messages/zh-TW.json | 9 ++- src/lib/updater.ts | 58 +++++++++++++ 5 files changed, 141 insertions(+), 25 deletions(-) diff --git a/src/components/settings/system-network-settings.tsx b/src/components/settings/system-network-settings.tsx index 74a7ec0..c0b0fd1 100644 --- a/src/components/settings/system-network-settings.tsx +++ b/src/components/settings/system-network-settings.tsx @@ -33,6 +33,7 @@ import { closeAppUpdate, getCurrentAppVersion, installAppUpdate, + normalizeAppUpdateError, relaunchApp, } from "@/lib/updater" @@ -45,6 +46,8 @@ function isAppLocale(value: string): value is AppLocale { return APP_LANGUAGE_VALUES.includes(value as AppLocale) } +type UpdateAction = "check" | "install" + export function SystemNetworkSettings() { const t = useTranslations("SystemSettings") const tLanguage = useTranslations("Language") @@ -172,6 +175,31 @@ export function SystemNetworkSettings() { } }, [appLanguage, languageSettings.language, setLanguageSettings, t]) + const formatUpdateError = useCallback( + (error: unknown, action: UpdateAction): string => { + const { kind, rawMessage } = normalizeAppUpdateError(error) + + switch (kind) { + case "source_unreachable": + return t("updateErrors.sourceUnavailable") + case "network": + return t("updateErrors.network") + case "download_failed": + return t("updateErrors.downloadFailed") + case "install_failed": + return t("updateErrors.installFailed") + case "unknown": + default: + if (action === "install") { + return t("updateErrors.installFailed") + } + console.error("[Settings] updater unknown error:", rawMessage) + return t("updateErrors.unknown") + } + }, + [t] + ) + const checkForUpdates = useCallback(async () => { setCheckingUpdate(true) setUpdateError(null) @@ -194,13 +222,14 @@ export function SystemNetworkSettings() { await closeAppUpdate(previousUpdate) } } catch (err) { - const message = err instanceof Error ? err.message : String(err) + const message = formatUpdateError(err, "check") setUpdateError(message) toast.error(t("checkUpdateFailed", { message })) + console.error("[Settings] check app update failed:", err) } finally { setCheckingUpdate(false) } - }, [availableUpdate, t]) + }, [availableUpdate, formatUpdateError, t]) const installUpdate = useCallback(async () => { if (!availableUpdate) return @@ -213,13 +242,14 @@ export function SystemNetworkSettings() { toast.success(t("installSuccess")) await relaunchApp() } catch (err) { - const message = err instanceof Error ? err.message : String(err) + const message = formatUpdateError(err, "install") setUpdateError(message) toast.error(t("installFailed", { message })) + console.error("[Settings] install app update failed:", err) } finally { setInstallingUpdate(false) } - }, [availableUpdate, t]) + }, [availableUpdate, formatUpdateError, t]) if (loading) { return ( @@ -393,24 +423,31 @@ export function SystemNetworkSettings() { )}
- + {checkingUpdate ? ( + + ) : ( + + )} {availableUpdate && (