diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d71222..553a896 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 4.9.2 - 2026-04-12 + +- 设置页首次自动检查更新时不再让“检查更新”按钮自己持续转圈。 +- 移除会反复闪烁的“正在整理结果”提示,避免用户误以为页面异常。 +- 手动点击“检查更新”时才显示按钮转圈,状态反馈与用户操作保持一致。 + ## 4.9.1 - 2026-04-12 - 移除仅支持 Node.js 的 `/api/site-icon` 路由,避免 `next-on-pages` 因非 Edge 路由中止构建。 diff --git a/app-release.json b/app-release.json index f05743d..e87e30e 100644 --- a/app-release.json +++ b/app-release.json @@ -4,8 +4,18 @@ "name": "KVideo", "branch": "main" }, - "currentVersion": "4.9.1", + "currentVersion": "4.9.2", "releases": [ + { + "version": "4.9.2", + "publishedAt": "2026-04-12", + "title": "修复检查更新状态闪烁", + "notes": [ + "设置页首次自动检查更新时不再让“检查更新”按钮自己持续转圈。", + "移除会反复闪烁的“正在整理结果”提示,避免用户误以为页面异常。", + "手动点击“检查更新”时才显示按钮转圈,状态反馈与用户操作保持一致。" + ] + }, { "version": "4.9.1", "publishedAt": "2026-04-12", diff --git a/components/settings/AppVersionSettings.tsx b/components/settings/AppVersionSettings.tsx index 0fbee15..23f3cb9 100644 --- a/components/settings/AppVersionSettings.tsx +++ b/components/settings/AppVersionSettings.tsx @@ -1,7 +1,7 @@ 'use client'; import Link from 'next/link'; -import { useEffect, useEffectEvent, useState, useTransition } from 'react'; +import { useEffect, useEffectEvent, useState } from 'react'; import { ExternalLink, RefreshCw } from 'lucide-react'; import { SettingsSection } from './SettingsSection'; import type { AppReleaseEntry, AppUpdateResponse } from '@/lib/types/app-update'; @@ -107,11 +107,12 @@ function ReleaseNotesBlock({ export function AppVersionSettings() { const [data, setData] = useState(null); const [hasLoaded, setHasLoaded] = useState(false); - const [isPending, startTransition] = useTransition(); const [isRefreshing, setIsRefreshing] = useState(false); - const fetchUpdateInfo = useEffectEvent(async () => { - setIsRefreshing(true); + const fetchUpdateInfo = useEffectEvent(async (manual: boolean = false) => { + if (manual) { + setIsRefreshing(true); + } try { const response = await fetch('/api/app-update', { @@ -126,53 +127,36 @@ export function AppVersionSettings() { } const payload = (await response.json()) as AppUpdateResponse; - - startTransition(() => { - setData(payload); - setHasLoaded(true); - }); + setData(payload); + setHasLoaded(true); + } catch (error) { + setHasLoaded(true); + setData((previous) => ({ + currentVersion: previous?.currentVersion || '未知', + currentRelease: previous?.currentRelease || null, + latestVersion: previous?.latestVersion || previous?.currentVersion || '未知', + latestRelease: previous?.latestRelease || previous?.currentRelease || null, + status: 'check-failed', + updateAvailable: false, + checkedAt: new Date().toISOString(), + checkedRemotely: false, + usedRemoteManifest: false, + source: previous?.source || DEFAULT_SOURCE, + error: error instanceof Error ? error.message : '未知错误', + })); } finally { - setIsRefreshing(false); + if (manual) { + setIsRefreshing(false); + } } }); useEffect(() => { - void fetchUpdateInfo().catch((error) => { - startTransition(() => { - setHasLoaded(true); - setData((previous) => ({ - currentVersion: previous?.currentVersion || '未知', - currentRelease: previous?.currentRelease || null, - latestVersion: previous?.latestVersion || previous?.currentVersion || '未知', - latestRelease: previous?.latestRelease || previous?.currentRelease || null, - status: 'check-failed', - updateAvailable: false, - checkedAt: new Date().toISOString(), - checkedRemotely: false, - usedRemoteManifest: false, - source: previous?.source || DEFAULT_SOURCE, - error: error instanceof Error ? error.message : '未知错误', - })); - }); - }); - }, [fetchUpdateInfo, startTransition]); + void fetchUpdateInfo(false); + }, []); const handleRefresh = () => { - void fetchUpdateInfo().catch((error) => { - startTransition(() => { - setData((previous) => - previous - ? { - ...previous, - status: 'check-failed', - error: error instanceof Error ? error.message : '未知错误', - checkedAt: new Date().toISOString(), - } - : previous, - ); - setHasLoaded(true); - }); - }); + void fetchUpdateInfo(true); }; const statusMeta = getStatusMeta(data); @@ -215,7 +199,6 @@ export function AppVersionSettings() {

{statusMeta.description}

上次检查:{hasLoaded ? formatDateLabel(data?.checkedAt) : '正在检查'} - {isPending ? '(正在整理结果)' : ''}

diff --git a/package-lock.json b/package-lock.json index 89117d5..c3498e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kvideo", - "version": "4.9.1", + "version": "4.9.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "kvideo", - "version": "4.9.1", + "version": "4.9.2", "dependencies": { "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", diff --git a/package.json b/package.json index 1a98e88..6a14bda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kvideo", - "version": "4.9.1", + "version": "4.9.2", "private": true, "scripts": { "dev": "next dev --port ${PORT:-3000}",