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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | 17x 17x 17x 17x 17x 17x 17x 17x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 17x | import { useState, useEffect } from 'react'
import { toast } from 'sonner'
import {
api,
type AIPrompt,
type AIModel,
type AIStatus,
type Source,
type ProfileWithStats,
type QuotaResponse,
} from '../api/client'
export interface SettingsData {
aiStatus: AIStatus | null
prompts: AIPrompt[]
models: AIModel[]
sources: Source[]
profiles: ProfileWithStats[]
quotaData: QuotaResponse | null
loading: boolean
setAiStatus: (status: AIStatus | null) => void
setPrompts: (prompts: AIPrompt[]) => void
setModels: (models: AIModel[]) => void
setSources: (sources: Source[]) => void
setProfiles: (profiles: ProfileWithStats[]) => void
setQuotaData: (data: QuotaResponse | null) => void
}
export function useSettingsData(isAdmin: boolean): SettingsData {
const [aiStatus, setAiStatus] = useState<AIStatus | null>(null)
const [prompts, setPrompts] = useState<AIPrompt[]>([])
const [models, setModels] = useState<AIModel[]>([])
const [sources, setSources] = useState<Source[]>([])
const [profiles, setProfiles] = useState<ProfileWithStats[]>([])
const [quotaData, setQuotaData] = useState<QuotaResponse | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
let cancelled = false
;(async () => {
try {
Eif (isAdmin) {
const [statusData, promptsData, modelsData, sourcesData, profilesData] =
await Promise.all([
api.ai.status(),
api.ai.prompts.list(),
api.ai.models(),
api.sources.list(),
api.profiles.list(),
])
Eif (!cancelled) {
setAiStatus(statusData)
setPrompts(promptsData)
setModels(modelsData)
setSources(sourcesData)
setProfiles(profilesData)
}
}
// Load quotas separately — 404 in home mode is expected
try {
const quotas = await api.ai.quotas.get()
if (!cancelled) setQuotaData(quotas)
} catch {
// Quotas not available (e.g. home mode) — ignore
}
} catch (error) {
if (!cancelled) {
console.error('Failed to load settings:', error)
toast.error('Failed to load settings')
}
} finally {
Eif (!cancelled) setLoading(false)
}
})()
return () => { cancelled = true }
}, [isAdmin])
return {
aiStatus,
prompts,
models,
sources,
profiles,
quotaData,
loading,
setAiStatus,
setPrompts,
setModels,
setSources,
setProfiles,
setQuotaData,
}
}
|