diff --git a/src/components/settings/system-network-settings.tsx b/src/components/settings/system-network-settings.tsx index b90b8b0..b1a73e8 100644 --- a/src/components/settings/system-network-settings.tsx +++ b/src/components/settings/system-network-settings.tsx @@ -103,6 +103,30 @@ export function SystemNetworkSettings() { }).format(lastCheckedAt) }, [lastCheckedAt, locale]) + const formattedUpdateDate = useMemo(() => { + if (!availableUpdate?.date) return null + + const parsed = new Date(availableUpdate.date) + if (Number.isNaN(parsed.getTime())) return availableUpdate.date + + return new Intl.DateTimeFormat(locale, { + dateStyle: "medium", + }).format(parsed) + }, [availableUpdate?.date, locale]) + + const updateNotes = useMemo( + () => availableUpdate?.body?.trim() || t("none"), + [availableUpdate?.body, t] + ) + + const updateStatusMessage = useMemo(() => { + if (checkingUpdate) return t("checking") + if (installingUpdate) return t("updating") + if (availableUpdate) return null + if (lastCheckedAt) return t("alreadyLatest") + return null + }, [availableUpdate, checkingUpdate, installingUpdate, lastCheckedAt, t]) + const loadSettings = useCallback(async () => { setLoading(true) setLoadError(null) @@ -220,10 +244,8 @@ export function SystemNetworkSettings() { if (result.update) { setAvailableUpdate(result.update) - toast.success(t("foundUpdate", { version: result.update.version })) } else { setAvailableUpdate(null) - toast.success(t("alreadyLatest")) } if (previousUpdate && previousUpdate !== result.update) { @@ -408,82 +430,89 @@ export function SystemNetworkSettings() { {t("updateDescription")}

-
-
-
{t("currentVersion")}
-
+
+
+

+ {t("currentVersion")}: {currentVersion ? `v${currentVersion}` : "-"} -

+

+ {checkingUpdate ? ( + + ) : availableUpdate ? ( + + ) : ( + + )}
-
-
- {t("upgradableVersion")} -
-
- {availableUpdate ? `v${availableUpdate.version}` : t("none")} -
-
-
- {formattedLastCheckedAt && ( -

- {t("lastChecked", { time: formattedLastCheckedAt })} -

- )} + {!availableUpdate && formattedLastCheckedAt && ( +

+ {t("lastChecked", { time: formattedLastCheckedAt })} +

+ )} + + {updateStatusMessage && ( +

{updateStatusMessage}

+ )} + + {availableUpdate && ( +
+
+ + {t("upgradableVersion")}:v{availableUpdate.version} + + {formattedUpdateDate && ( + + {formattedUpdateDate} + + )} +
+
+ {updateNotes} +
+
+ )} +
{updateError && (
{t("updateError", { message: updateError })}
)} - -
- {checkingUpdate ? ( - - ) : ( - - )} - - {availableUpdate && ( - - )} -
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index 2c83cf2..d1361fc 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -107,7 +107,7 @@ "updateTitle": "تحديث التطبيق", "updateDescription": "تحقق من المصدر المهيأ للإصدارات الأحدث وثبّت التحديث مباشرة عند توفره.", "currentVersion": "الإصدار الحالي", - "upgradableVersion": "الإصدار المتاح", + "upgradableVersion": "أحدث إصدار", "none": "لا يوجد", "lastChecked": "آخر فحص: {time}", "updateError": "خطأ في التحديث: {message}", diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index c64a8fa..8eacaa5 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -107,7 +107,7 @@ "updateTitle": "App-Update", "updateDescription": "Prüft die konfigurierte Release-Quelle auf neue Versionen und installiert sie bei Verfügbarkeit direkt.", "currentVersion": "Aktuelle Version", - "upgradableVersion": "Verfügbare Version", + "upgradableVersion": "Neueste Version", "none": "Keine", "lastChecked": "Zuletzt geprüft: {time}", "updateError": "Update-Fehler: {message}", diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index c8fd48d..855e41f 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -107,7 +107,7 @@ "updateTitle": "App Update", "updateDescription": "Check the configured release source for newer versions and install directly when available.", "currentVersion": "Current version", - "upgradableVersion": "Available version", + "upgradableVersion": "Latest version", "none": "None", "lastChecked": "Last checked: {time}", "updateError": "Update error: {message}", diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index 788189c..e0b8bef 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -107,7 +107,7 @@ "updateTitle": "Actualización de la app", "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": "Versión disponible", + "upgradableVersion": "Última versión", "none": "Ninguna", "lastChecked": "Última comprobación: {time}", "updateError": "Error de actualización: {message}", diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 99a2f32..7100398 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -107,7 +107,7 @@ "updateTitle": "Mise à jour de l’app", "updateDescription": "Vérifiez les nouvelles versions depuis la source de publication configurée et installez-les directement si disponibles.", "currentVersion": "Version actuelle", - "upgradableVersion": "Version disponible", + "upgradableVersion": "Dernière version", "none": "Aucune", "lastChecked": "Dernière vérification : {time}", "updateError": "Erreur de mise à jour : {message}", diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index d476194..6743a8f 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -107,7 +107,7 @@ "updateTitle": "アプリ更新", "updateDescription": "設定されたリリースソースで新しいバージョンを確認し、利用可能なら直接インストールします。", "currentVersion": "現在のバージョン", - "upgradableVersion": "利用可能なバージョン", + "upgradableVersion": "最新バージョン", "none": "なし", "lastChecked": "最終確認: {time}", "updateError": "更新エラー: {message}", diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index 1f76f98..9b4ae00 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -107,7 +107,7 @@ "updateTitle": "앱 업데이트", "updateDescription": "설정된 릴리스 소스에서 새 버전을 확인하고 가능하면 바로 설치합니다.", "currentVersion": "현재 버전", - "upgradableVersion": "사용 가능한 버전", + "upgradableVersion": "최신 버전", "none": "없음", "lastChecked": "마지막 확인: {time}", "updateError": "업데이트 오류: {message}", diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 978b065..ec48359 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -107,7 +107,7 @@ "updateTitle": "Atualização do app", "updateDescription": "Verifique versões mais novas na fonte de releases configurada e instale diretamente quando disponíveis.", "currentVersion": "Versão atual", - "upgradableVersion": "Versão disponível", + "upgradableVersion": "Versão mais recente", "none": "Nenhuma", "lastChecked": "Última verificação: {time}", "updateError": "Erro de atualização: {message}", diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index b11b5de..0edd4e8 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -107,7 +107,7 @@ "updateTitle": "应用升级", "updateDescription": "点击检查后会从配置的发布源拉取最新版本信息,有新版本时可直接下载并安装。", "currentVersion": "当前版本", - "upgradableVersion": "可升级版本", + "upgradableVersion": "最新版本", "none": "暂无", "lastChecked": "上次检查:{time}", "updateError": "更新异常:{message}", diff --git a/src/i18n/messages/zh-TW.json b/src/i18n/messages/zh-TW.json index 60a572c..66640fd 100644 --- a/src/i18n/messages/zh-TW.json +++ b/src/i18n/messages/zh-TW.json @@ -107,7 +107,7 @@ "updateTitle": "應用升級", "updateDescription": "點擊檢查後會從設定的發佈來源拉取最新版本資訊,有新版本時可直接下載並安裝。", "currentVersion": "目前版本", - "upgradableVersion": "可升級版本", + "upgradableVersion": "最新版本", "none": "暫無", "lastChecked": "上次檢查:{time}", "updateError": "更新異常:{message}",