diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9660fe3..02e76cc 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -94,6 +94,7 @@ export default async function RootLayout({ CUSTOM_CATEGORIES: customCategories, FLUID_SEARCH: fluidSearch, EnableComments: enableComments, + ENABLE_TVBOX_SUBSCRIBE: process.env.ENABLE_TVBOX_SUBSCRIBE === 'true', }; return ( diff --git a/src/components/UserMenu.tsx b/src/components/UserMenu.tsx index 2672400..408698c 100644 --- a/src/components/UserMenu.tsx +++ b/src/components/UserMenu.tsx @@ -126,27 +126,27 @@ export const UserMenu: React.FC = () => { setMounted(true); }, []); - // 获取订阅配置 + // 从运行时配置读取订阅是否启用 useEffect(() => { - const fetchSubscribeConfig = async () => { - try { - // 获取当前浏览器地址 - const currentOrigin = window.location.origin; - const response = await fetch(`/api/tvbox/config?origin=${encodeURIComponent(currentOrigin)}&adFilter=${adFilterEnabled}`); - if (response.ok) { - const data = await response.json(); - setSubscribeEnabled(data.enabled); - setSubscribeUrl(data.url); - } - } catch (error) { - console.error('获取订阅配置失败:', error); - } - }; - if (typeof window !== 'undefined') { - fetchSubscribeConfig(); + const enabled = (window as any).RUNTIME_CONFIG?.ENABLE_TVBOX_SUBSCRIBE || false; + setSubscribeEnabled(enabled); } - }, [adFilterEnabled]); // 依赖 adFilterEnabled,当开关改变时重新获取 + }, []); + + // 懒加载订阅 URL - 只在打开订阅面板时请求 + const fetchSubscribeUrl = async () => { + try { + const currentOrigin = window.location.origin; + const response = await fetch(`/api/tvbox/config?origin=${encodeURIComponent(currentOrigin)}&adFilter=${adFilterEnabled}`); + if (response.ok) { + const data = await response.json(); + setSubscribeUrl(data.url); + } + } catch (error) { + console.error('获取订阅URL失败:', error); + } + }; // 获取认证信息和存储类型 useEffect(() => { @@ -306,10 +306,12 @@ export const UserMenu: React.FC = () => { setPasswordError(''); }; - const handleSubscribe = () => { + const handleSubscribe = async () => { setIsOpen(false); setIsSubscribeOpen(true); setCopySuccess(false); + // 懒加载:打开面板时才请求订阅URL + await fetchSubscribeUrl(); }; const handleCloseSubscribe = () => { @@ -317,6 +319,12 @@ export const UserMenu: React.FC = () => { setCopySuccess(false); }; + const handleAdFilterToggle = async (checked: boolean) => { + setAdFilterEnabled(checked); + // 当去广告开关改变时,重新获取订阅URL + await fetchSubscribeUrl(); + }; + const handleCopySubscribeUrl = async () => { try { await navigator.clipboard.writeText(subscribeUrl); @@ -1155,7 +1163,7 @@ export const UserMenu: React.FC = () => { type='checkbox' className='sr-only peer' checked={adFilterEnabled} - onChange={(e) => setAdFilterEnabled(e.target.checked)} + onChange={(e) => handleAdFilterToggle(e.target.checked)} />