'use client' import { useState, useEffect, useCallback } from 'react' import AdminLayout from '@/components/admin/AdminLayout' import type { TabId, Collection, IngestionStatus } from './_components/types' import { API_BASE } from './_components/types' import { tabs } from './_components/tabs' import { CollectionsTab } from './_components/CollectionsTab' import { UploadTab } from './_components/UploadTab' import { IngestionTab } from './_components/IngestionTab' import { SearchTab } from './_components/SearchTab' import { MetricsTab } from './_components/MetricsTab' export default function RAGAdminPage() { const [activeTab, setActiveTab] = useState('collections') const [collections, setCollections] = useState([]) const [ingestionStatus, setIngestionStatus] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const fetchData = useCallback(async () => { try { setLoading(true) const collectionsRes = await fetch(`${API_BASE}/api/v1/admin/nibis/collections`) const statsRes = await fetch(`${API_BASE}/api/v1/admin/nibis/stats`) const statusRes = await fetch(`${API_BASE}/api/v1/admin/nibis/status`) if (collectionsRes.ok && statsRes.ok && statusRes.ok) { const collectionsData = await collectionsRes.json() const statsData = await statsRes.json() const statusData = await statusRes.json() const cols: Collection[] = [] const nibisCollection = collectionsData.collections?.find( (c: { name: string }) => c.name === 'bp_nibis_eh' ) if (nibisCollection || statsData.indexed) { cols.push({ name: 'bp_nibis_eh', displayName: 'Niedersachsen - Klausurkorrektur', bundesland: 'NI', useCase: 'klausur', documentCount: statsData.total_chunks || nibisCollection?.points_count || 0, chunkCount: statsData.total_chunks || nibisCollection?.points_count || 0, years: statsData.years || [], subjects: statsData.subjects || [], status: statusData.running ? 'indexing' : (statsData.indexed ? 'ready' : 'empty'), }) } setCollections(cols) setIngestionStatus({ running: statusData.running, lastRun: statusData.last_run, documentsIndexed: statusData.documents_indexed, chunksCreated: statusData.chunks_created, errors: statusData.errors || [], }) } setError(null) } catch (err) { console.error('Failed to fetch data:', err) setError('Verbindung zum Klausur-Service fehlgeschlagen') } finally { setLoading(false) } }, []) useEffect(() => { fetchData() const interval = setInterval(() => { if (ingestionStatus?.running) { fetchData() } }, 5000) return () => clearInterval(interval) }, [fetchData, ingestionStatus?.running]) return ( {/* Error Banner */} {error && (
{error}
)} {/* Tab Navigation */}
{/* Tab Content */} {activeTab === 'collections' && } {activeTab === 'upload' && } {activeTab === 'ingestion' && } {activeTab === 'search' && } {activeTab === 'metrics' && }
) }