品牌真正接入全站渲染 + document.title 同步 + 设置页实时刷新

- BrandContext 全局上下文: 挂载时拉取 GET /api/settings/brand
- HomePage: 品牌名称/标语/Logo 动态渲染, 封面卡片精调
- AdminLayout: 侧栏品牌名称/顶栏标语动态显示
- LoginPage: 登录页品牌 Logo + 名称
- WatchPage: 播放页接入品牌上下文
- Settings: 保存后调用 refresh() 全站即时刷新
- App.tsx: document.title 跟随 brand_name 变化
- 组件分层: AppRoutes + BrandProvider 避免 import 循环
This commit is contained in:
admin committed 2026-08-10 16:28:00 +08:00
1 parent efde5597bd
commit d4a3742136
7 files changed
+178 -61

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
import { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react'
import api from '../api/client'
interface BrandData {
brand_name: string
brand_tagline: string
brand_logo_url: string
}
interface BrandContextType {
brand: BrandData
loading: boolean
refresh: () => Promise<void>
}
const defaultBrand: BrandData = {
brand_name: 'StreamCore',
brand_tagline: '企业级直播平台',
brand_logo_url: '',
}
const BrandContext = createContext<BrandContextType>({
brand: defaultBrand,
loading: false,
refresh: async () => {},
})
export function BrandProvider({ children }: { children: ReactNode }) {
const [brand, setBrand] = useState<BrandData>(defaultBrand)
const [loading, setLoading] = useState(true)
const refresh = useCallback(async () => {
try {
const { data } = await api.get('/settings/brand')
setBrand({
brand_name: data.brand_name || defaultBrand.brand_name,
brand_tagline: data.brand_tagline || defaultBrand.brand_tagline,
brand_logo_url: data.brand_logo_url || '',
})
} catch { /* use default */ }
setLoading(false)
}, [])
useEffect(() => { refresh() }, [refresh])
return (
<BrandContext.Provider value={{ brand, loading, refresh }}>
{children}
</BrandContext.Provider>
)
}
export function useBrand() {
return useContext(BrandContext)
}