品牌真正接入全站渲染 + 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:
1 parent
efde5597bd
commit
d4a3742136
7 files changed
+178
-61
No files matched your search
@@ -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)
|
||||
}
|
||||
Reference in new issue
Block a user