import type { Metadata, Viewport } from 'next'; import { Inter } from 'next/font/google'; import './globals.css'; import 'sweetalert2/dist/sweetalert2.min.css'; import { getConfig } from '@/lib/config'; import { SiteProvider } from '../components/SiteProvider'; import { ThemeProvider } from '../components/ThemeProvider'; const inter = Inter({ subsets: ['latin'] }); // 动态生成 metadata,支持配置更新后的标题变化 export async function generateMetadata(): Promise { let siteName = process.env.SITE_NAME || 'MoonTV'; if (process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1') { const config = await getConfig(); siteName = config.SiteConfig.SiteName; } return { title: siteName, description: '影视聚合', manifest: '/manifest.json', }; } export const viewport: Viewport = { themeColor: '#000000', }; export default async function RootLayout({ children, }: { children: React.ReactNode; }) { let siteName = process.env.SITE_NAME || 'MoonTV'; let announcement = process.env.ANNOUNCEMENT || '本网站仅提供影视信息搜索服务,所有内容均来自第三方网站。本站不存储任何视频资源,不对任何内容的准确性、合法性、完整性负责。'; let enableRegister = process.env.NEXT_PUBLIC_ENABLE_REGISTER === 'true'; let aggregateSearchResult = process.env.NEXT_PUBLIC_AGGREGATE_SEARCH_RESULT !== 'false'; if (process.env.NEXT_PUBLIC_STORAGE_TYPE !== 'd1') { const config = await getConfig(); siteName = config.SiteConfig.SiteName; announcement = config.SiteConfig.Announcement; enableRegister = config.UserConfig.AllowRegister; aggregateSearchResult = config.SiteConfig.SearchResultDefaultAggregate; } // 将运行时配置注入到全局 window 对象,供客户端在运行时读取 const runtimeConfig = { STORAGE_TYPE: process.env.NEXT_PUBLIC_STORAGE_TYPE || 'localstorage', ENABLE_REGISTER: enableRegister, AGGREGATE_SEARCH_RESULT: aggregateSearchResult, }; return ( {/* 将配置序列化后直接写入脚本,浏览器端可通过 window.RUNTIME_CONFIG 获取 */} {/* eslint-disable-next-line @next/next/no-sync-scripts */}