diff --git a/src/app/play/page.tsx b/src/app/play/page.tsx index eac5e03..6c9c661 100644 --- a/src/app/play/page.tsx +++ b/src/app/play/page.tsx @@ -4965,8 +4965,8 @@ function PlayPageClient() { return '打开设置'; }, }, - // 热力图开关(始终显示,不再依赖 danmakuHeatmapDisabled) - { + // 热力图开关(仅在未禁用时显示) + ...(!danmakuHeatmapDisabledRef.current ? [{ name: '弹幕热力', html: '弹幕热力', icon: '', @@ -4982,7 +4982,7 @@ function PlayPageClient() { } return newVal; }, - }, + }] : []), ...(webGPUSupported ? [ { name: 'Anime4K超分', diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx index 0d8266d..16fcbc8 100644 --- a/src/components/UserMenu.tsx +++ b/src/components/UserMenu.tsx @@ -115,6 +115,7 @@ export const UserMenu: React.FC = () => { const [nextEpisodeDanmakuPreload, setNextEpisodeDanmakuPreload] = useState(true); const [disableAutoLoadDanmaku, setDisableAutoLoadDanmaku] = useState(false); const [danmakuMaxCount, setDanmakuMaxCount] = useState(0); + const [danmakuHeatmapDisabled, setDanmakuHeatmapDisabled] = useState(false); const [searchTraditionalToSimplified, setSearchTraditionalToSimplified] = useState(false); // 邮件通知设置 @@ -411,15 +412,12 @@ export const UserMenu: React.FC = () => { const savedDanmakuMaxCount = localStorage.getItem('danmakuMaxCount'); if (savedDanmakuMaxCount !== null) { - const value = parseInt(savedDanmakuMaxCount, 10); - // 兼容旧版本的0-4映射值 - if (value <= 4) { - const mappedValue = value === 0 ? 0 : value === 1 ? 1000 : value === 2 ? 3000 : value === 3 ? 5000 : 10000; - setDanmakuMaxCount(mappedValue); - localStorage.setItem('danmakuMaxCount', String(mappedValue)); - } else { - setDanmakuMaxCount(value); - } + setDanmakuMaxCount(parseInt(savedDanmakuMaxCount, 10)); + } + + const savedDanmakuHeatmapDisabled = localStorage.getItem('danmaku_heatmap_disabled'); + if (savedDanmakuHeatmapDisabled !== null) { + setDanmakuHeatmapDisabled(savedDanmakuHeatmapDisabled === 'true'); } // 加载首页模块配置 @@ -792,6 +790,13 @@ export const UserMenu: React.FC = () => { } }; + const handleDanmakuHeatmapDisabledToggle = (value: boolean) => { + setDanmakuHeatmapDisabled(value); + if (typeof window !== 'undefined') { + localStorage.setItem('danmaku_heatmap_disabled', String(value)); + } + }; + const handleSearchTraditionalToSimplifiedToggle = (value: boolean) => { setSearchTraditionalToSimplified(value); if (typeof window !== 'undefined') { @@ -912,6 +917,7 @@ export const UserMenu: React.FC = () => { localStorage.setItem('nextEpisodeDanmakuPreload', 'true'); localStorage.setItem('disableAutoLoadDanmaku', 'false'); localStorage.setItem('danmakuMaxCount', '0'); + localStorage.setItem('danmaku_heatmap_disabled', 'false'); localStorage.setItem('homeModules', JSON.stringify(defaultHomeModules)); localStorage.setItem('searchTraditionalToSimplified', 'false'); window.dispatchEvent(new CustomEvent('homeModulesUpdated')); @@ -1900,6 +1906,30 @@ export const UserMenu: React.FC = () => { + {/* 禁用弹幕热力图 */} +
+ 开启后不显示弹幕热力图和热力图开关 +
+