Files
gitlab-instance-0a899031_na…/components/site-provider.tsx
2025-11-13 05:05:53 +08:00

66 lines
1.6 KiB
TypeScript

'use client'
import { createContext, useContext, useEffect, useState } from 'react'
import type { SiteConfig } from '@/types/site'
const SiteContext = createContext<{
siteInfo: SiteConfig | null
isLoading: boolean
error: Error | null
}>({
siteInfo: null,
isLoading: true,
error: null,
})
export function useSiteInfo() {
return useContext(SiteContext)
}
export function SiteProvider({ children }: { children: React.ReactNode }) {
const [siteInfo, setSiteInfo] = useState<SiteConfig | null>(null)
const [isLoading, setIsLoading] = useState(true)
const [error, setError] = useState<Error | null>(null)
useEffect(() => {
async function loadSiteInfo() {
try {
const response = await fetch('/api/site-config')
if (!response.ok) {
throw new Error('Failed to fetch site config')
}
const data = await response.json()
setSiteInfo(data)
} catch (err) {
setError(err instanceof Error ? err : new Error('Unknown error'))
// 设置默认值
setSiteInfo({
basic: {
title: 'NavSphere',
description: 'A modern navigation platform',
keywords: 'navigation, platform, web, management'
},
appearance: {
logo: '/logo.png',
favicon: '/favicon.ico',
theme: 'system'
},
navigation: {
linkTarget: '_blank'
}
})
} finally {
setIsLoading(false)
}
}
loadSiteInfo()
}, [])
return (
<SiteContext.Provider value={{ siteInfo, isLoading, error }}>
{children}
</SiteContext.Provider>
)
}