All files / src/hooks useSettingsData.ts

83.87% Statements 26/31
30% Branches 3/10
100% Functions 4/4
85.71% Lines 24/28

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,
  }
}
 
← Back to Dashboard