From 1fc182817eae0c60d33986fb5190c33b3cf21382 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Thu, 5 Feb 2026 17:21:43 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(about):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E5=BC=B9=E7=AA=97=E7=9A=84=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=B8=8E=E4=B8=8B=E8=BD=BD=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 记录最新更新信息并展示“更新状态” - 自动检查发现新版本弹出关于,但不自动下载 - 新增“下载更新/本次不再提示”按钮 --- frontend/src/App.tsx | 51 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2ff6aca..0f33b56 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -29,9 +29,13 @@ function App() { const updateDownloadInFlightRef = React.useRef(false); const updateDownloadedVersionRef = React.useRef(null); const updateDeferredVersionRef = React.useRef(null); + const updateNotifiedVersionRef = React.useRef(null); + const updateMutedVersionRef = React.useRef(null); const [isAboutOpen, setIsAboutOpen] = useState(false); const [aboutLoading, setAboutLoading] = useState(false); const [aboutInfo, setAboutInfo] = useState<{ version: string; author: string; buildTime?: string; repoUrl?: string; issueUrl?: string; releaseUrl?: string } | null>(null); + const [aboutUpdateStatus, setAboutUpdateStatus] = useState(''); + const [lastUpdateInfo, setLastUpdateInfo] = useState(null); type UpdateInfo = { hasUpdate: boolean; @@ -94,23 +98,40 @@ function App() { const checkForUpdates = React.useCallback(async (silent: boolean) => { if (updateCheckInFlightRef.current) return; updateCheckInFlightRef.current = true; + if (!silent) { + setAboutUpdateStatus('正在检查更新...'); + } const res = await (window as any).go.app.App.CheckForUpdates(); updateCheckInFlightRef.current = false; if (!res?.success) { if (!silent) { message.error('检查更新失败: ' + (res?.message || '未知错误')); + setAboutUpdateStatus('检查更新失败: ' + (res?.message || '未知错误')); } return; } const info: UpdateInfo = res.data; if (!info) return; + setLastUpdateInfo(info); if (info.hasUpdate) { if (!silent) { - message.info(`发现新版本 ${info.latestVersion},开始下载...`); + message.info(`发现新版本 ${info.latestVersion}`); + setAboutUpdateStatus(`发现新版本 ${info.latestVersion}(未下载)`); + } + if (silent && isAboutOpen) { + setAboutUpdateStatus(`发现新版本 ${info.latestVersion}(未下载)`); + } + if (silent && !isAboutOpen && updateMutedVersionRef.current !== info.latestVersion && updateNotifiedVersionRef.current !== info.latestVersion) { + updateNotifiedVersionRef.current = info.latestVersion; + setIsAboutOpen(true); } - await downloadUpdate(info, silent); } else if (!silent) { - message.success(`当前已是最新版本(${info.currentVersion || '未知'})`); + const text = `当前已是最新版本(${info.currentVersion || '未知'})`; + message.success(text); + setAboutUpdateStatus(text); + } else if (silent && isAboutOpen) { + const text = `当前已是最新版本(${info.currentVersion || '未知'})`; + setAboutUpdateStatus(text); } }, [downloadUpdate]); @@ -333,9 +354,16 @@ function App() { useEffect(() => { if (isAboutOpen) { + if (lastUpdateInfo?.hasUpdate) { + setAboutUpdateStatus(`发现新版本 ${lastUpdateInfo.latestVersion}(未下载)`); + } else if (lastUpdateInfo) { + setAboutUpdateStatus(`当前已是最新版本(${lastUpdateInfo.currentVersion || '未知'})`); + } else { + setAboutUpdateStatus('未检查'); + } loadAboutInfo(); } - }, [isAboutOpen, loadAboutInfo]); + }, [isAboutOpen, lastUpdateInfo, loadAboutInfo]); useEffect(() => { const startupTimer = window.setTimeout(() => { @@ -455,9 +483,15 @@ function App() { open={isAboutOpen} onCancel={() => setIsAboutOpen(false)} footer={[ + lastUpdateInfo?.hasUpdate ? ( + + ) : null, + lastUpdateInfo?.hasUpdate ? ( + + ) : null, , - ]} + ].filter(Boolean)} > {aboutLoading ? (
@@ -467,9 +501,10 @@ function App() {
版本:{aboutInfo?.version || '未知'}
作者:{aboutInfo?.author || '未知'}
-
- - {aboutInfo?.repoUrl ? ( +
更新状态:{aboutUpdateStatus || '未检查'}
+