From a43af1319311f78e731efb7fa2e902476dafed26 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Sun, 19 Apr 2026 00:44:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=B9=E5=B9=95=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=A4=A7=E5=B0=8F=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/UserMenu.tsx | 38 ++++++++++++++++++++++++++++++++----- src/lib/danmaku/cache.ts | 2 +- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx index 687bf95..dc6c8f0 100644 --- a/src/components/UserMenu.tsx +++ b/src/components/UserMenu.tsx @@ -34,23 +34,23 @@ import { X, } from 'lucide-react'; import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { getAuthInfoFromBrowserCookie } from '@/lib/auth'; -import { clearAllDanmakuCache } from '@/lib/danmaku/api'; +import { clearAllDanmakuCache, getDanmakuCacheStats } from '@/lib/danmaku/api'; import { CURRENT_VERSION } from '@/lib/version'; import { UpdateStatus } from '@/lib/version_check'; +import { DeviceManagementPanel } from './DeviceManagementPanel'; +import { DownloadManagementPanel } from './DownloadManagementPanel'; +import { EmailSettingsPanel } from './EmailSettingsPanel'; import { FavoritesPanel } from './FavoritesPanel'; import { NotificationPanel } from './NotificationPanel'; import { OfflineDownloadPanel } from './OfflineDownloadPanel'; -import { DeviceManagementPanel } from './DeviceManagementPanel'; -import { EmailSettingsPanel } from './EmailSettingsPanel'; import { PersonalCenterPanel } from './PersonalCenterPanel'; import { useVersionCheck } from './VersionCheckProvider'; import { VersionPanel } from './VersionPanel'; -import { DownloadManagementPanel } from './DownloadManagementPanel'; interface AuthInfo { username?: string; @@ -250,6 +250,7 @@ export const UserMenu: React.FC = () => { // 清除弹幕缓存相关状态 const [isClearingCache, setIsClearingCache] = useState(false); const [clearCacheMessage, setClearCacheMessage] = useState(null); + const [danmakuCacheUsage, setDanmakuCacheUsage] = useState('计算中...'); // 确保组件已挂载 useEffect(() => { @@ -274,6 +275,22 @@ export const UserMenu: React.FC = () => { } }; + const formatCacheSize = useCallback((size: number) => { + if (size < 1024) return `${size} B`; + if (size < 1024 * 1024) return `${(size / 1024).toFixed(2)} KB`; + return `${(size / 1024 / 1024).toFixed(2)} MB`; + }, []); + + const loadDanmakuCacheUsage = useCallback(async () => { + try { + const stats = await getDanmakuCacheStats(); + setDanmakuCacheUsage(formatCacheSize(stats.totalSize)); + } catch (error) { + console.error('获取弹幕缓存占用失败:', error); + setDanmakuCacheUsage('获取失败'); + } + }, [formatCacheSize]); + // 首次加载时检查未读通知数量(使用全局标记避免多个实例重复请求) useEffect(() => { if (typeof window === 'undefined') return; @@ -304,6 +321,13 @@ export const UserMenu: React.FC = () => { }); }, []); + useEffect(() => { + if (!mounted || !isSettingsOpen || !isDanmakuSectionOpen) return; + void (async () => { + await loadDanmakuCacheUsage(); + })(); + }, [loadDanmakuCacheUsage, mounted, isSettingsOpen, isDanmakuSectionOpen]); + // 监听通知更新事件 useEffect(() => { const handleNotificationsUpdated = () => { @@ -1398,6 +1422,7 @@ export const UserMenu: React.FC = () => { try { await clearAllDanmakuCache(); setClearCacheMessage('弹幕缓存已清除成功!'); + setDanmakuCacheUsage('0 B'); console.log('弹幕缓存已清除'); // 3秒后自动清除提示 @@ -2856,6 +2881,9 @@ export const UserMenu: React.FC = () => {

弹幕缓存管理

+

+ 弹幕缓存空间占用:{danmakuCacheUsage} +

清除所有已缓存的弹幕数据

diff --git a/src/lib/danmaku/cache.ts b/src/lib/danmaku/cache.ts index b36c2b9..6977f00 100644 --- a/src/lib/danmaku/cache.ts +++ b/src/lib/danmaku/cache.ts @@ -428,7 +428,7 @@ export async function getDanmakuCacheStats(): Promise<{ if (cursor) { const data = cursor.value as DanmakuCacheData; total++; - totalSize += data.comments.length; + totalSize += new Blob([JSON.stringify(data)]).size; if (data.timestamp < expireThreshold) { expired++;