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 || '未检查'}
+