import React, { useState, useEffect, useCallback } from 'react' import axios from 'axios' import { Wifi, WifiOff, Server, FileText, GitBranch, Table2, Activity, TerminalSquare, Box, Settings, RefreshCw, } from 'lucide-react' import ConnectionPanel from './components/ConnectionPanel' import DocumentManager from './components/DocumentManager' import PipelineRunner from './components/PipelineRunner' import QAPairViewer from './components/QAPairViewer' import TrainingMonitor from './components/TrainingMonitor' import Terminal from './components/Terminal' import ModelManager from './components/ModelManager' import ConfigEditor from './components/ConfigEditor' const API = '' // vite proxy forwards /api → :8080 const NAV = [ { id: 'connection', label: 'Connection', icon: Server }, { id: 'documents', label: 'Documents', icon: FileText }, { id: 'pipeline', label: 'Pipeline', icon: GitBranch }, { id: 'pairs', label: 'QA Pairs', icon: Table2 }, { id: 'training', label: 'Training', icon: Activity }, { id: 'terminal', label: 'Terminal', icon: TerminalSquare }, { id: 'models', label: 'Models', icon: Box }, { id: 'config', label: 'Config', icon: Settings }, ] export default function App() { const [active, setActive] = useState('connection') const [connected, setConnected] = useState(false) const [gpuInfo, setGpuInfo] = useState(null) const [statusMsg, setStatusMsg] = useState('') const fetchStatus = useCallback(async () => { try { const { data } = await axios.get(`${API}/api/status`) setConnected(data.connected) if (data.gpu?.gpus?.length) setGpuInfo(data.gpu.gpus[0]) } catch { setConnected(false) } }, []) useEffect(() => { fetchStatus() const id = setInterval(fetchStatus, 10000) return () => clearInterval(id) }, [fetchStatus]) const panels = { connection: , documents: , pipeline: , pairs: , training: , terminal: , models: , config: , } return (
{/* ── Sidebar ── */} {/* ── Main content ── */}
{/* Top bar */}

{NAV.find(n => n.id === active)?.label}

{statusMsg && ( {statusMsg} )}
{panels[active]}
) }