优化系统版本升级操作流程
This commit is contained in:
@@ -103,6 +103,30 @@ export function SystemNetworkSettings() {
|
|||||||
}).format(lastCheckedAt)
|
}).format(lastCheckedAt)
|
||||||
}, [lastCheckedAt, locale])
|
}, [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 () => {
|
const loadSettings = useCallback(async () => {
|
||||||
setLoading(true)
|
setLoading(true)
|
||||||
setLoadError(null)
|
setLoadError(null)
|
||||||
@@ -220,10 +244,8 @@ export function SystemNetworkSettings() {
|
|||||||
|
|
||||||
if (result.update) {
|
if (result.update) {
|
||||||
setAvailableUpdate(result.update)
|
setAvailableUpdate(result.update)
|
||||||
toast.success(t("foundUpdate", { version: result.update.version }))
|
|
||||||
} else {
|
} else {
|
||||||
setAvailableUpdate(null)
|
setAvailableUpdate(null)
|
||||||
toast.success(t("alreadyLatest"))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (previousUpdate && previousUpdate !== result.update) {
|
if (previousUpdate && previousUpdate !== result.update) {
|
||||||
@@ -408,82 +430,89 @@ export function SystemNetworkSettings() {
|
|||||||
{t("updateDescription")}
|
{t("updateDescription")}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 gap-2 text-xs sm:grid-cols-2">
|
<div className="rounded-md border bg-muted/20 px-3 py-3 text-xs space-y-2">
|
||||||
<div className="rounded-md border bg-muted/20 px-3 py-2">
|
<div className="flex items-center justify-between gap-3">
|
||||||
<div className="text-muted-foreground">{t("currentVersion")}</div>
|
<p className="text-muted-foreground">
|
||||||
<div className="mt-1 font-medium">
|
{t("currentVersion")}:
|
||||||
{currentVersion ? `v${currentVersion}` : "-"}
|
{currentVersion ? `v${currentVersion}` : "-"}
|
||||||
</div>
|
</p>
|
||||||
|
{checkingUpdate ? (
|
||||||
|
<Button
|
||||||
|
key="checking-update"
|
||||||
|
size="sm"
|
||||||
|
disabled
|
||||||
|
aria-busy="true"
|
||||||
|
className="w-[9.5rem] justify-center transition-none"
|
||||||
|
>
|
||||||
|
<Loader2 className="h-3.5 w-3.5 animate-spin" />
|
||||||
|
{t("checking")}
|
||||||
|
</Button>
|
||||||
|
) : availableUpdate ? (
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
onClick={installUpdate}
|
||||||
|
disabled={installingUpdate}
|
||||||
|
>
|
||||||
|
{installingUpdate ? (
|
||||||
|
<>
|
||||||
|
<Loader2 className="h-3.5 w-3.5 animate-spin" />
|
||||||
|
{t("updating")}
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<ArrowUpCircle className="h-3.5 w-3.5" />
|
||||||
|
{t("upgradeTo", { version: availableUpdate.version })}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Button>
|
||||||
|
) : (
|
||||||
|
<Button
|
||||||
|
key="check-update"
|
||||||
|
size="sm"
|
||||||
|
onClick={checkForUpdates}
|
||||||
|
disabled={installingUpdate}
|
||||||
|
className="w-[9.5rem] justify-center transition-none"
|
||||||
|
>
|
||||||
|
<RefreshCw className="h-3.5 w-3.5" />
|
||||||
|
{t("checkUpdate")}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="rounded-md border bg-muted/20 px-3 py-2">
|
|
||||||
<div className="text-muted-foreground">
|
|
||||||
{t("upgradableVersion")}
|
|
||||||
</div>
|
|
||||||
<div className="mt-1 font-medium">
|
|
||||||
{availableUpdate ? `v${availableUpdate.version}` : t("none")}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{formattedLastCheckedAt && (
|
{!availableUpdate && formattedLastCheckedAt && (
|
||||||
<p className="text-[11px] text-muted-foreground">
|
<p className="text-muted-foreground">
|
||||||
{t("lastChecked", { time: formattedLastCheckedAt })}
|
{t("lastChecked", { time: formattedLastCheckedAt })}
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{updateStatusMessage && (
|
||||||
|
<p className="text-muted-foreground">{updateStatusMessage}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{availableUpdate && (
|
||||||
|
<div className="space-y-2 pt-2 border-t border-border/70">
|
||||||
|
<div className="flex items-center justify-between gap-3">
|
||||||
|
<span className="font-medium">
|
||||||
|
{t("upgradableVersion")}:v{availableUpdate.version}
|
||||||
|
</span>
|
||||||
|
{formattedUpdateDate && (
|
||||||
|
<span className="text-muted-foreground text-[11px]">
|
||||||
|
{formattedUpdateDate}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className="mt-3 max-h-28 overflow-auto rounded-md border bg-background/70 px-3 py-3 leading-6 whitespace-pre-wrap break-words text-muted-foreground">
|
||||||
|
{updateNotes}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
{updateError && (
|
{updateError && (
|
||||||
<div className="rounded-md border border-red-500/30 bg-red-500/5 px-3 py-2 text-xs text-red-400">
|
<div className="rounded-md border border-red-500/30 bg-red-500/5 px-3 py-2 text-xs text-red-400">
|
||||||
{t("updateError", { message: updateError })}
|
{t("updateError", { message: updateError })}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="flex flex-wrap items-center gap-2 justify-end">
|
|
||||||
{checkingUpdate ? (
|
|
||||||
<Button
|
|
||||||
key="checking-update"
|
|
||||||
size="sm"
|
|
||||||
variant="secondary"
|
|
||||||
disabled
|
|
||||||
aria-busy="true"
|
|
||||||
className="w-[9.5rem] justify-center transition-none"
|
|
||||||
>
|
|
||||||
<Loader2 className="h-3.5 w-3.5 animate-spin" />
|
|
||||||
{t("checking")}
|
|
||||||
</Button>
|
|
||||||
) : (
|
|
||||||
<Button
|
|
||||||
key="check-update"
|
|
||||||
size="sm"
|
|
||||||
variant="secondary"
|
|
||||||
onClick={checkForUpdates}
|
|
||||||
disabled={installingUpdate}
|
|
||||||
className="w-[9.5rem] justify-center transition-none"
|
|
||||||
>
|
|
||||||
<RefreshCw className="h-3.5 w-3.5" />
|
|
||||||
{t("checkUpdate")}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{availableUpdate && (
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
onClick={installUpdate}
|
|
||||||
disabled={installingUpdate || checkingUpdate}
|
|
||||||
>
|
|
||||||
{installingUpdate ? (
|
|
||||||
<>
|
|
||||||
<Loader2 className="h-3.5 w-3.5 animate-spin" />
|
|
||||||
{t("updating")}
|
|
||||||
</>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<ArrowUpCircle className="h-3.5 w-3.5" />
|
|
||||||
{t("upgradeTo", { version: availableUpdate.version })}
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "تحديث التطبيق",
|
"updateTitle": "تحديث التطبيق",
|
||||||
"updateDescription": "تحقق من المصدر المهيأ للإصدارات الأحدث وثبّت التحديث مباشرة عند توفره.",
|
"updateDescription": "تحقق من المصدر المهيأ للإصدارات الأحدث وثبّت التحديث مباشرة عند توفره.",
|
||||||
"currentVersion": "الإصدار الحالي",
|
"currentVersion": "الإصدار الحالي",
|
||||||
"upgradableVersion": "الإصدار المتاح",
|
"upgradableVersion": "أحدث إصدار",
|
||||||
"none": "لا يوجد",
|
"none": "لا يوجد",
|
||||||
"lastChecked": "آخر فحص: {time}",
|
"lastChecked": "آخر فحص: {time}",
|
||||||
"updateError": "خطأ في التحديث: {message}",
|
"updateError": "خطأ في التحديث: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "App-Update",
|
"updateTitle": "App-Update",
|
||||||
"updateDescription": "Prüft die konfigurierte Release-Quelle auf neue Versionen und installiert sie bei Verfügbarkeit direkt.",
|
"updateDescription": "Prüft die konfigurierte Release-Quelle auf neue Versionen und installiert sie bei Verfügbarkeit direkt.",
|
||||||
"currentVersion": "Aktuelle Version",
|
"currentVersion": "Aktuelle Version",
|
||||||
"upgradableVersion": "Verfügbare Version",
|
"upgradableVersion": "Neueste Version",
|
||||||
"none": "Keine",
|
"none": "Keine",
|
||||||
"lastChecked": "Zuletzt geprüft: {time}",
|
"lastChecked": "Zuletzt geprüft: {time}",
|
||||||
"updateError": "Update-Fehler: {message}",
|
"updateError": "Update-Fehler: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "App Update",
|
"updateTitle": "App Update",
|
||||||
"updateDescription": "Check the configured release source for newer versions and install directly when available.",
|
"updateDescription": "Check the configured release source for newer versions and install directly when available.",
|
||||||
"currentVersion": "Current version",
|
"currentVersion": "Current version",
|
||||||
"upgradableVersion": "Available version",
|
"upgradableVersion": "Latest version",
|
||||||
"none": "None",
|
"none": "None",
|
||||||
"lastChecked": "Last checked: {time}",
|
"lastChecked": "Last checked: {time}",
|
||||||
"updateError": "Update error: {message}",
|
"updateError": "Update error: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "Actualización de la app",
|
"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.",
|
"updateDescription": "Comprueba versiones más nuevas en la fuente de versiones configurada e instálalas directamente cuando estén disponibles.",
|
||||||
"currentVersion": "Versión actual",
|
"currentVersion": "Versión actual",
|
||||||
"upgradableVersion": "Versión disponible",
|
"upgradableVersion": "Última versión",
|
||||||
"none": "Ninguna",
|
"none": "Ninguna",
|
||||||
"lastChecked": "Última comprobación: {time}",
|
"lastChecked": "Última comprobación: {time}",
|
||||||
"updateError": "Error de actualización: {message}",
|
"updateError": "Error de actualización: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "Mise à jour de l’app",
|
"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.",
|
"updateDescription": "Vérifiez les nouvelles versions depuis la source de publication configurée et installez-les directement si disponibles.",
|
||||||
"currentVersion": "Version actuelle",
|
"currentVersion": "Version actuelle",
|
||||||
"upgradableVersion": "Version disponible",
|
"upgradableVersion": "Dernière version",
|
||||||
"none": "Aucune",
|
"none": "Aucune",
|
||||||
"lastChecked": "Dernière vérification : {time}",
|
"lastChecked": "Dernière vérification : {time}",
|
||||||
"updateError": "Erreur de mise à jour : {message}",
|
"updateError": "Erreur de mise à jour : {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "アプリ更新",
|
"updateTitle": "アプリ更新",
|
||||||
"updateDescription": "設定されたリリースソースで新しいバージョンを確認し、利用可能なら直接インストールします。",
|
"updateDescription": "設定されたリリースソースで新しいバージョンを確認し、利用可能なら直接インストールします。",
|
||||||
"currentVersion": "現在のバージョン",
|
"currentVersion": "現在のバージョン",
|
||||||
"upgradableVersion": "利用可能なバージョン",
|
"upgradableVersion": "最新バージョン",
|
||||||
"none": "なし",
|
"none": "なし",
|
||||||
"lastChecked": "最終確認: {time}",
|
"lastChecked": "最終確認: {time}",
|
||||||
"updateError": "更新エラー: {message}",
|
"updateError": "更新エラー: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "앱 업데이트",
|
"updateTitle": "앱 업데이트",
|
||||||
"updateDescription": "설정된 릴리스 소스에서 새 버전을 확인하고 가능하면 바로 설치합니다.",
|
"updateDescription": "설정된 릴리스 소스에서 새 버전을 확인하고 가능하면 바로 설치합니다.",
|
||||||
"currentVersion": "현재 버전",
|
"currentVersion": "현재 버전",
|
||||||
"upgradableVersion": "사용 가능한 버전",
|
"upgradableVersion": "최신 버전",
|
||||||
"none": "없음",
|
"none": "없음",
|
||||||
"lastChecked": "마지막 확인: {time}",
|
"lastChecked": "마지막 확인: {time}",
|
||||||
"updateError": "업데이트 오류: {message}",
|
"updateError": "업데이트 오류: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "Atualização do app",
|
"updateTitle": "Atualização do app",
|
||||||
"updateDescription": "Verifique versões mais novas na fonte de releases configurada e instale diretamente quando disponíveis.",
|
"updateDescription": "Verifique versões mais novas na fonte de releases configurada e instale diretamente quando disponíveis.",
|
||||||
"currentVersion": "Versão atual",
|
"currentVersion": "Versão atual",
|
||||||
"upgradableVersion": "Versão disponível",
|
"upgradableVersion": "Versão mais recente",
|
||||||
"none": "Nenhuma",
|
"none": "Nenhuma",
|
||||||
"lastChecked": "Última verificação: {time}",
|
"lastChecked": "Última verificação: {time}",
|
||||||
"updateError": "Erro de atualização: {message}",
|
"updateError": "Erro de atualização: {message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "应用升级",
|
"updateTitle": "应用升级",
|
||||||
"updateDescription": "点击检查后会从配置的发布源拉取最新版本信息,有新版本时可直接下载并安装。",
|
"updateDescription": "点击检查后会从配置的发布源拉取最新版本信息,有新版本时可直接下载并安装。",
|
||||||
"currentVersion": "当前版本",
|
"currentVersion": "当前版本",
|
||||||
"upgradableVersion": "可升级版本",
|
"upgradableVersion": "最新版本",
|
||||||
"none": "暂无",
|
"none": "暂无",
|
||||||
"lastChecked": "上次检查:{time}",
|
"lastChecked": "上次检查:{time}",
|
||||||
"updateError": "更新异常:{message}",
|
"updateError": "更新异常:{message}",
|
||||||
|
|||||||
@@ -107,7 +107,7 @@
|
|||||||
"updateTitle": "應用升級",
|
"updateTitle": "應用升級",
|
||||||
"updateDescription": "點擊檢查後會從設定的發佈來源拉取最新版本資訊,有新版本時可直接下載並安裝。",
|
"updateDescription": "點擊檢查後會從設定的發佈來源拉取最新版本資訊,有新版本時可直接下載並安裝。",
|
||||||
"currentVersion": "目前版本",
|
"currentVersion": "目前版本",
|
||||||
"upgradableVersion": "可升級版本",
|
"upgradableVersion": "最新版本",
|
||||||
"none": "暫無",
|
"none": "暫無",
|
||||||
"lastChecked": "上次檢查:{time}",
|
"lastChecked": "上次檢查:{time}",
|
||||||
"updateError": "更新異常:{message}",
|
"updateError": "更新異常:{message}",
|
||||||
|
|||||||
Reference in New Issue
Block a user