diff --git a/src/components/settings/system-network-settings.tsx b/src/components/settings/system-network-settings.tsx
index b1a73e8..db5d930 100644
--- a/src/components/settings/system-network-settings.tsx
+++ b/src/components/settings/system-network-settings.tsx
@@ -3,10 +3,10 @@
import { useCallback, useEffect, useMemo, useState } from "react"
import {
ArrowUpCircle,
+ CheckCircle2,
Languages,
Loader2,
RefreshCw,
- Save,
Wifi,
} from "lucide-react"
import type { Update } from "@tauri-apps/plugin-updater"
@@ -153,7 +153,11 @@ export function SystemNetworkSettings() {
loadSettings().catch((err) => {
console.error("[Settings] load system settings failed:", err)
})
- }, [loadSettings])
+ checkForUpdates().catch((err) => {
+ console.error("[Settings] auto check update failed:", err)
+ })
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [])
useEffect(() => {
return () => {
@@ -164,48 +168,49 @@ export function SystemNetworkSettings() {
}
}, [availableUpdate])
- const saveSettings = useCallback(async () => {
- if (enabled && !proxyUrl.trim()) {
- toast.error(t("proxyRequired"))
- return
- }
+ const saveProxySettings = useCallback(
+ async (nextEnabled: boolean, nextProxyUrl: string) => {
+ if (nextEnabled && !nextProxyUrl.trim()) return
- setSaving(true)
- try {
- const next = await updateSystemProxySettings({
- enabled,
- proxy_url: proxyUrl.trim() || null,
- })
- setEnabled(next.enabled)
- setProxyUrl(next.proxy_url ?? "")
- toast.success(t("saveSuccess"))
- } catch (err) {
- const message = err instanceof Error ? err.message : String(err)
- toast.error(t("saveFailed", { message }))
- } finally {
- setSaving(false)
- }
- }, [enabled, proxyUrl, t])
+ setSaving(true)
+ try {
+ const next = await updateSystemProxySettings({
+ enabled: nextEnabled,
+ proxy_url: nextProxyUrl.trim() || null,
+ })
+ setEnabled(next.enabled)
+ setProxyUrl(next.proxy_url ?? "")
+ } catch (err) {
+ const message = err instanceof Error ? err.message : String(err)
+ toast.error(t("saveFailed", { message }))
+ } finally {
+ setSaving(false)
+ }
+ },
+ [t]
+ )
- const saveLanguage = useCallback(async () => {
- setSavingLanguage(true)
+ const saveLanguage = useCallback(
+ async (lang: LanguageSelectValue) => {
+ setSavingLanguage(true)
- try {
- const next = await updateSystemLanguageSettings({
- mode: appLanguage === "system" ? "system" : "manual",
- language:
- appLanguage === "system" ? languageSettings.language : appLanguage,
- })
+ try {
+ const next = await updateSystemLanguageSettings({
+ mode: lang === "system" ? "system" : "manual",
+ language:
+ lang === "system" ? languageSettings.language : lang,
+ })
- setLanguageSettings(next)
- toast.success(t("languageSaveSuccess"))
- } catch (err) {
- const message = err instanceof Error ? err.message : String(err)
- toast.error(t("languageSaveFailed", { message }))
- } finally {
- setSavingLanguage(false)
- }
- }, [appLanguage, languageSettings.language, setLanguageSettings, t])
+ setLanguageSettings(next)
+ } catch (err) {
+ const message = err instanceof Error ? err.message : String(err)
+ toast.error(t("languageSaveFailed", { message }))
+ } finally {
+ setSavingLanguage(false)
+ }
+ },
+ [languageSettings.language, setLanguageSettings, t]
+ )
const formatUpdateError = useCallback(
(error: unknown, action: UpdateAction): string => {
@@ -302,128 +307,16 @@ export function SystemNetworkSettings() {
-
-
{t("proxyTitle")}
-
-
-
- {t("proxyDescription")}
-
-
- {loadError && (
-
- {t("loadFailed", { message: loadError })}
-
- )}
-
-
-
-
-
-
setProxyUrl(event.target.value)}
- placeholder={PROXY_EXAMPLE}
- />
-
- {t("proxyHint", { example: PROXY_EXAMPLE })}
-
-
-
-
-
-
-
-
-
-
-
-
{t("languageTitle")}
-
-
-
- {t("languageDescription")}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{t("updateTitle")}
+ {checkingUpdate ? (
+
+ ) : availableUpdate ? (
+
+ ) : lastCheckedAt ? (
+
+ ) : (
+
+ )}
+
{t("versionTitle")}
@@ -514,6 +407,105 @@ export function SystemNetworkSettings() {
)}
+
+
+
+
+
{t("proxyTitle")}
+
+
+
+ {t("proxyDescription")}
+
+
+ {loadError && (
+
+ {t("loadFailed", { message: loadError })}
+
+ )}
+
+
+
+
+
+
setProxyUrl(event.target.value)}
+ onBlur={() => saveProxySettings(enabled, proxyUrl)}
+ placeholder={PROXY_EXAMPLE}
+ disabled={saving}
+ />
+
+ {t("proxyHint", { example: PROXY_EXAMPLE })}
+
+
+
+
+
+
+
+
{t("languageTitle")}
+
+
+
+ {t("languageDescription")}
+
+
+
+
+
+
+
)
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json
index ee6cac5..4c63714 100644
--- a/src/i18n/messages/ar.json
+++ b/src/i18n/messages/ar.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "تم حفظ إعدادات اللغة",
"languageSaveFailed": "فشل حفظ إعدادات اللغة: {message}",
"updateTitle": "تحديث التطبيق",
+ "versionTitle": "تحديث البرنامج",
"updateDescription": "تحقق من المصدر المهيأ للإصدارات الأحدث وثبّت التحديث مباشرة عند توفره.",
"currentVersion": "الإصدار الحالي",
"upgradableVersion": "أحدث إصدار",
diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json
index abee042..89ed30b 100644
--- a/src/i18n/messages/de.json
+++ b/src/i18n/messages/de.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "Spracheinstellungen wurden gespeichert",
"languageSaveFailed": "Spracheinstellungen konnten nicht gespeichert werden: {message}",
"updateTitle": "App-Update",
+ "versionTitle": "Softwareupdate",
"updateDescription": "Prüft die konfigurierte Release-Quelle auf neue Versionen und installiert sie bei Verfügbarkeit direkt.",
"currentVersion": "Aktuelle Version",
"upgradableVersion": "Neueste Version",
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index 89459b3..6c61fa8 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "Language settings saved",
"languageSaveFailed": "Failed to save language settings: {message}",
"updateTitle": "App Update",
+ "versionTitle": "Software Update",
"updateDescription": "Check the configured release source for newer versions and install directly when available.",
"currentVersion": "Current version",
"upgradableVersion": "Latest version",
diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json
index 749dc4d..058d3ad 100644
--- a/src/i18n/messages/es.json
+++ b/src/i18n/messages/es.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "La configuración de idioma se guardó",
"languageSaveFailed": "No se pudo guardar la configuración de idioma: {message}",
"updateTitle": "Actualización de la app",
+ "versionTitle": "Actualización de software",
"updateDescription": "Comprueba versiones más nuevas en la fuente de versiones configurada e instálalas directamente cuando estén disponibles.",
"currentVersion": "Versión actual",
"upgradableVersion": "Última versión",
diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json
index 409a3b0..bba8263 100644
--- a/src/i18n/messages/fr.json
+++ b/src/i18n/messages/fr.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "Les paramètres de langue ont été enregistrés",
"languageSaveFailed": "Échec de l’enregistrement des paramètres de langue : {message}",
"updateTitle": "Mise à jour de l’app",
+ "versionTitle": "Mise à jour logicielle",
"updateDescription": "Vérifiez les nouvelles versions depuis la source de publication configurée et installez-les directement si disponibles.",
"currentVersion": "Version actuelle",
"upgradableVersion": "Dernière version",
diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json
index 48434ef..331378d 100644
--- a/src/i18n/messages/ja.json
+++ b/src/i18n/messages/ja.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "言語設定を保存しました",
"languageSaveFailed": "言語設定の保存に失敗しました: {message}",
"updateTitle": "アプリ更新",
+ "versionTitle": "ソフトウェアアップデート",
"updateDescription": "設定されたリリースソースで新しいバージョンを確認し、利用可能なら直接インストールします。",
"currentVersion": "現在のバージョン",
"upgradableVersion": "最新バージョン",
diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json
index b22ffe1..735f9e0 100644
--- a/src/i18n/messages/ko.json
+++ b/src/i18n/messages/ko.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "언어 설정이 저장되었습니다",
"languageSaveFailed": "언어 설정 저장 실패: {message}",
"updateTitle": "앱 업데이트",
+ "versionTitle": "소프트웨어 업데이트",
"updateDescription": "설정된 릴리스 소스에서 새 버전을 확인하고 가능하면 바로 설치합니다.",
"currentVersion": "현재 버전",
"upgradableVersion": "최신 버전",
diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json
index 9a9c6d8..cdfb423 100644
--- a/src/i18n/messages/pt.json
+++ b/src/i18n/messages/pt.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "As configurações de idioma foram salvas",
"languageSaveFailed": "Falha ao salvar as configurações de idioma: {message}",
"updateTitle": "Atualização do app",
+ "versionTitle": "Atualização de software",
"updateDescription": "Verifique versões mais novas na fonte de releases configurada e instale diretamente quando disponíveis.",
"currentVersion": "Versão atual",
"upgradableVersion": "Versão mais recente",
diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json
index dd08e45..dac0998 100644
--- a/src/i18n/messages/zh-CN.json
+++ b/src/i18n/messages/zh-CN.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "语言设置已保存",
"languageSaveFailed": "语言设置保存失败:{message}",
"updateTitle": "应用升级",
+ "versionTitle": "软件更新",
"updateDescription": "点击检查后会从配置的发布源拉取最新版本信息,有新版本时可直接下载并安装。",
"currentVersion": "当前版本",
"upgradableVersion": "最新版本",
diff --git a/src/i18n/messages/zh-TW.json b/src/i18n/messages/zh-TW.json
index b416cc7..5a9af96 100644
--- a/src/i18n/messages/zh-TW.json
+++ b/src/i18n/messages/zh-TW.json
@@ -127,6 +127,7 @@
"languageSaveSuccess": "語言設定已儲存",
"languageSaveFailed": "語言設定儲存失敗:{message}",
"updateTitle": "應用升級",
+ "versionTitle": "軟體更新",
"updateDescription": "點擊檢查後會從設定的發佈來源拉取最新版本資訊,有新版本時可直接下載並安裝。",
"currentVersion": "目前版本",
"upgradableVersion": "最新版本",