Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import { createContext, useContext, useState, useEffect, useCallback, ReactNode } from 'react'
import { api, AIStatus } from '../api/client'
interface AIStatusContextType {
available: boolean
configured: boolean
valid: boolean
error: string | null
errorCode: string | null
loading: boolean
refresh: () => Promise<void>
}
const defaultStatus: AIStatusContextType = {
available: false,
configured: false,
valid: false,
error: null,
errorCode: null,
loading: true,
refresh: async () => {},
}
const AIStatusContext = createContext<AIStatusContextType>(defaultStatus)
export function useAIStatus() {
return useContext(AIStatusContext)
}
interface AIStatusProviderProps {
children: ReactNode
}
export function AIStatusProvider({ children }: AIStatusProviderProps) {
const [status, setStatus] = useState<Omit<AIStatusContextType, 'refresh' | 'loading'>>({
available: false,
configured: false,
valid: false,
error: null,
errorCode: null,
})
const [loading, setLoading] = useState(true)
const refresh = useCallback(async () => {
try {
const data: AIStatus = await api.ai.status()
setStatus({
available: data.available,
configured: data.configured,
valid: data.valid,
error: data.error,
errorCode: data.error_code,
})
} catch (error) {
console.error('Failed to fetch AI status:', error)
setStatus({
available: false,
configured: false,
valid: false,
error: 'Failed to check AI availability',
errorCode: 'connection_error',
})
} finally {
setLoading(false)
}
}, [])
useEffect(() => {
refresh()
// Refresh every 5 minutes
const interval = setInterval(refresh, 5 * 60 * 1000)
return () => clearInterval(interval)
}, [refresh])
return (
<AIStatusContext.Provider value={{ ...status, loading, refresh }}>
{children}
</AIStatusContext.Provider>
)
}
|