'use client' import { useState, useEffect } from 'react' import type { TrainingJob, TrainingConfig, DatasetStats } from './_components/types' import { MOCK_JOBS, MOCK_STATS, fetchJobs, fetchDatasetStats, createTrainingJob, pauseJob, resumeJob, cancelJob } from './_components/api' import { TrainingJobCard } from './_components/TrainingJobCard' import { DatasetOverview } from './_components/DatasetOverview' import { NewTrainingModal } from './_components/NewTrainingModal' import { QuickActions } from './_components/QuickActions' export default function TrainingDashboardPage() { const [jobs, setJobs] = useState([]) const [stats, setStats] = useState(MOCK_STATS) const [showNewTrainingModal, setShowNewTrainingModal] = useState(false) const [selectedJob, setSelectedJob] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) // Load initial data useEffect(() => { async function loadData() { setIsLoading(true) try { const [jobsData, statsData] = await Promise.all([fetchJobs(), fetchDatasetStats()]) setJobs(jobsData) setStats(statsData) setError(null) } catch (err) { console.error('Failed to load data:', err) setError('Verbindung zum Backend fehlgeschlagen') setJobs(MOCK_JOBS) setStats(MOCK_STATS) } finally { setIsLoading(false) } } loadData() }, []) // Real-time updates for active training jobs useEffect(() => { const hasActiveJob = jobs.some(j => j.status === 'training' || j.status === 'preparing') if (!hasActiveJob) return const interval = setInterval(async () => { try { const updatedJobs = await fetchJobs() setJobs(updatedJobs) } catch (err) { console.error('Failed to refresh jobs:', err) } }, 2000) return () => clearInterval(interval) }, [jobs]) const handleStartTraining = async (config: Partial) => { try { await createTrainingJob(config) const updatedJobs = await fetchJobs() setJobs(updatedJobs) setShowNewTrainingModal(false) } catch (err) { console.error('Failed to start training:', err) setError(err instanceof Error ? err.message : 'Training konnte nicht gestartet werden') } } const handlePauseJob = async (jobId: string) => { try { await pauseJob(jobId); setJobs(await fetchJobs()) } catch (err) { console.error('Failed to pause job:', err) } } const handleResumeJob = async (jobId: string) => { try { await resumeJob(jobId); setJobs(await fetchJobs()) } catch (err) { console.error('Failed to resume job:', err) } } const handleCancelJob = async (jobId: string) => { try { await cancelJob(jobId); setJobs(await fetchJobs()) } catch (err) { console.error('Failed to cancel job:', err) } } return (
{/* Header */}

Training Dashboard

Überwachen und steuern Sie KI-Trainingsprozesse für Zeugnisse

{/* Error Banner */} {error && (
{error}
)} {/* Loading State */} {isLoading ? (

Lade Trainingsdaten...

) : (
{/* Training Jobs */}
{jobs.length === 0 ? (

Kein aktives Training

Starten Sie ein neues Training, um das Zeugnis-Modell zu verbessern.

) : ( jobs.map(job => ( handlePauseJob(job.id)} onResume={() => handleResumeJob(job.id)} onStop={() => handleCancelJob(job.id)} onViewDetails={() => setSelectedJob(job)} /> )) )}
{/* Sidebar */}
)}
setShowNewTrainingModal(false)} onSubmit={handleStartTraining} />
) }