"use client"; import { useEffect, useState, useCallback } from "react"; import type { ProviderInfo } from "@/lib/analysis/providers"; import ProviderStatus from "@/components/settings/ProviderStatus"; import OllamaModelPicker from "@/components/settings/OllamaModelPicker"; import PreferencesPanel from "@/components/settings/PreferencesPanel"; const PROVIDER_KEY = "clicktrack_analysis_provider"; const MODEL_KEY = "clicktrack_ollama_model"; interface ProvidersResponse { providers: ProviderInfo[]; ollamaModels: string[]; } export default function SettingsPage() { const [providers, setProviders] = useState([]); const [ollamaModels, setOllamaModels] = useState([]); const [loading, setLoading] = useState(true); const [refreshing, setRefreshing] = useState(false); const [defaultProvider, setDefaultProvider] = useState(""); const [selectedOllamaModel, setSelectedOllamaModel] = useState(""); const fetchProviders = useCallback(async (isRefresh = false) => { if (isRefresh) setRefreshing(true); try { const res = await fetch("/api/analyze/providers"); const data = await res.json() as ProvidersResponse; setProviders(data.providers); setOllamaModels(data.ollamaModels); // Initialise model selection if (data.ollamaModels.length > 0) { const saved = localStorage.getItem(MODEL_KEY); if (saved && data.ollamaModels.includes(saved)) { setSelectedOllamaModel(saved); } else { setSelectedOllamaModel(data.ollamaModels[0]); } } } finally { setLoading(false); setRefreshing(false); } }, []); useEffect(() => { const saved = localStorage.getItem(PROVIDER_KEY); if (saved) setDefaultProvider(saved); fetchProviders(); }, [fetchProviders]); function handleSetDefault(id: string) { setDefaultProvider(id); localStorage.setItem(PROVIDER_KEY, id); } function handleModelChange(model: string) { setSelectedOllamaModel(model); localStorage.setItem(MODEL_KEY, model); } const ollamaProvider = providers.find((p) => p.id === "ollama"); const ollamaAvailable = ollamaProvider?.available === true; if (loading) { return (

Settings

Loading…

); } return (

Settings

{/* Analysis Providers */}

Analysis Providers

{providers.map((provider) => ( ))}
{/* Ollama Models */} {ollamaAvailable && (

Ollama Models

fetchProviders(true)} refreshing={refreshing} /> {ollamaProvider?.ollamaBaseUrl && (

Base URL (operator-configured):{" "} {ollamaProvider.ollamaBaseUrl}

)}
)} {/* Preferences */}

Preferences

); }