diff --git a/VERSION.txt b/VERSION.txt index f6a91f1..6abd966 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -20250728004933 \ No newline at end of file +20250728012011 \ No newline at end of file diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 0f58d68..abcc149 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,24 +2,25 @@ 'use client'; +import { AlertCircle, CheckCircle } from 'lucide-react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Suspense, useEffect, useState } from 'react'; -import { checkForUpdates, CURRENT_VERSION } from '@/lib/version'; +import { checkForUpdates, CURRENT_VERSION, UpdateStatus } from '@/lib/version'; import { useSite } from '@/components/SiteProvider'; import { ThemeToggle } from '@/components/ThemeToggle'; // 版本显示组件 function VersionDisplay() { - const [hasUpdate, setHasUpdate] = useState(false); + const [updateStatus, setUpdateStatus] = useState(null); const [isChecking, setIsChecking] = useState(true); useEffect(() => { const checkUpdate = async () => { try { - const updateAvailable = await checkForUpdates(); - setHasUpdate(updateAvailable); + const status = await checkForUpdates(); + setUpdateStatus(status); } catch (_) { // do nothing } finally { @@ -38,16 +39,28 @@ function VersionDisplay() { className='absolute bottom-4 left-1/2 transform -translate-x-1/2 flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400 transition-colors cursor-pointer' > v{CURRENT_VERSION} - {!isChecking && hasUpdate && ( -
- - - - 有新版本 + {!isChecking && updateStatus !== UpdateStatus.FETCH_FAILED && ( +
+ {updateStatus === UpdateStatus.HAS_UPDATE && ( + <> + + 有新版本 + + )} + {updateStatus === UpdateStatus.NO_UPDATE && ( + <> + + 已是最新 + + )}
)} diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx index 72d1e3f..260231e 100644 --- a/src/components/UserMenu.tsx +++ b/src/components/UserMenu.tsx @@ -8,7 +8,7 @@ import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { getAuthInfoFromBrowserCookie } from '@/lib/auth'; -import { checkForUpdates, CURRENT_VERSION } from '@/lib/version'; +import { checkForUpdates, CURRENT_VERSION, UpdateStatus } from '@/lib/version'; interface AuthInfo { username?: string; @@ -39,7 +39,8 @@ export const UserMenu: React.FC = () => { const [passwordError, setPasswordError] = useState(''); // 版本检查相关状态 - const [hasUpdate, setHasUpdate] = useState(false); + const [updateStatus, setUpdateStatus] = useState(null); + const [isChecking, setIsChecking] = useState(true); // 确保组件已挂载 useEffect(() => { @@ -112,10 +113,12 @@ export const UserMenu: React.FC = () => { useEffect(() => { const checkUpdate = async () => { try { - const updateAvailable = await checkForUpdates(); - setHasUpdate(updateAvailable); + const status = await checkForUpdates(); + setUpdateStatus(status); } catch (error) { console.warn('版本检查失败:', error); + } finally { + setIsChecking(false); } }; @@ -406,9 +409,19 @@ export const UserMenu: React.FC = () => { >
v{CURRENT_VERSION} - {hasUpdate && ( -
- )} + {!isChecking && + updateStatus && + updateStatus !== UpdateStatus.FETCH_FAILED && ( +
+ )}
@@ -716,7 +729,7 @@ export const UserMenu: React.FC = () => { > - {hasUpdate && ( + {updateStatus === UpdateStatus.HAS_UPDATE && (
)} diff --git a/src/lib/version.ts b/src/lib/version.ts index 95c019d..5a85921 100644 --- a/src/lib/version.ts +++ b/src/lib/version.ts @@ -2,7 +2,14 @@ 'use client'; -const CURRENT_VERSION = '20250728004933'; +const CURRENT_VERSION = '20250728012011'; + +// 版本检查结果枚举 +export enum UpdateStatus { + HAS_UPDATE = 'has_update', // 有新版本 + NO_UPDATE = 'no_update', // 无新版本 + FETCH_FAILED = 'fetch_failed', // 获取失败 +} // 远程版本检查URL配置 const VERSION_CHECK_URLS = [ @@ -12,9 +19,9 @@ const VERSION_CHECK_URLS = [ /** * 检查是否有新版本可用 - * @returns Promise - true表示有新版本,false表示当前版本是最新的 + * @returns Promise - 返回版本检查状态 */ -export async function checkForUpdates(): Promise { +export async function checkForUpdates(): Promise { try { // 尝试从主要URL获取版本信息 const primaryVersion = await fetchVersionFromUrl(VERSION_CHECK_URLS[0]); @@ -28,11 +35,11 @@ export async function checkForUpdates(): Promise { return compareVersions(backupVersion); } - // 如果两个URL都失败,返回false(假设当前版本是最新的) - return false; + // 如果两个URL都失败,返回获取失败状态 + return UpdateStatus.FETCH_FAILED; } catch (error) { console.error('版本检查失败:', error); - return false; + return UpdateStatus.FETCH_FAILED; } } @@ -71,18 +78,18 @@ async function fetchVersionFromUrl(url: string): Promise { /** * 比较版本号 * @param remoteVersion - 远程版本号 - * @returns boolean - true表示远程版本更新 + * @returns UpdateStatus - 返回版本比较结果 */ -function compareVersions(remoteVersion: string): boolean { +function compareVersions(remoteVersion: string): UpdateStatus { try { // 将版本号转换为数字进行比较 const current = parseInt(CURRENT_VERSION, 10); const remote = parseInt(remoteVersion, 10); - return remote !== current; + return remote > current ? UpdateStatus.HAS_UPDATE : UpdateStatus.NO_UPDATE; } catch (error) { console.error('版本比较失败:', error); - return false; + return UpdateStatus.FETCH_FAILED; } }