'use client' import { useState, useEffect, useCallback } from 'react' import { useRouter, useParams } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { Sidebar } from '@/components/Sidebar' import { ThemeToggle } from '@/components/ThemeToggle' import { LanguageDropdown } from '@/components/LanguageDropdown' import { QRCodeUpload } from '@/components/QRCodeUpload' import { korrekturApi } from '@/lib/korrektur/api' import type { Klausur, StudentWork } from '../types' import { GlassCard } from './_components/GlassCard' import { StudentCard } from './_components/StudentCard' import { UploadModal } from './_components/UploadModal' const SESSION_ID_KEY = 'bp_korrektur_student_session' export default function KlausurDetailPage() { const { isDark } = useTheme() const router = useRouter() const params = useParams() const klausurId = params.klausurId as string const [klausur, setKlausur] = useState(null) const [students, setStudents] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const [showUploadModal, setShowUploadModal] = useState(false) const [showQRModal, setShowQRModal] = useState(false) const [isUploading, setIsUploading] = useState(false) const [uploadSessionId, setUploadSessionId] = useState('') useEffect(() => { let storedSessionId = localStorage.getItem(SESSION_ID_KEY) if (!storedSessionId) { storedSessionId = `student-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` localStorage.setItem(SESSION_ID_KEY, storedSessionId) } setUploadSessionId(storedSessionId) }, []) const loadData = useCallback(async () => { if (!klausurId) return setIsLoading(true) setError(null) try { const [klausurData, studentsData] = await Promise.all([ korrekturApi.getKlausur(klausurId), korrekturApi.getStudents(klausurId), ]) setKlausur(klausurData) setStudents(studentsData) } catch (err) { console.error('Failed to load data:', err) setError(err instanceof Error ? err.message : 'Laden fehlgeschlagen') } finally { setIsLoading(false) } }, [klausurId]) useEffect(() => { loadData() }, [loadData]) const handleUpload = async (files: File[], anonymIds: string[]) => { setIsUploading(true) try { for (let i = 0; i < files.length; i++) { await korrekturApi.uploadStudentWork(klausurId, files[i], anonymIds[i]) } setShowUploadModal(false) loadData() } catch (err) { console.error('Upload failed:', err) setError(err instanceof Error ? err.message : 'Upload fehlgeschlagen') } finally { setIsUploading(false) } } const completedCount = students.filter(s => s.status === 'COMPLETED').length const progress = students.length > 0 ? Math.round((completedCount / students.length) * 100) : 0 return (

{klausur?.title || 'Klausur'}

{klausur ? `${klausur.subject} ${klausur.semester} ${klausur.year}` : ''}

{!isLoading && klausur && (

{students.length}

Arbeiten

{completedCount}

Abgeschlossen

{students.length - completedCount}

Offen

{progress}%

Fortschritt

)} {!isLoading && students.length > 0 && (
Gesamtfortschritt {completedCount}/{students.length} korrigiert
)} {error && (
{error}
)} {isLoading && (
)} {!isLoading && (
{students.length > 0 && ( )}
)} {!isLoading && students.length === 0 && (

Keine Arbeiten vorhanden

Laden Sie Schuelerarbeiten hoch, um mit der Korrektur zu beginnen.

)} {!isLoading && students.length > 0 && (
{students.map((student, index) => ( router.push(`/korrektur/${klausurId}/${student.id}`)} delay={350 + index * 30} isDark={isDark} /> ))}
)}
setShowUploadModal(false)} onUpload={handleUpload} isUploading={isUploading} /> {showQRModal && (
setShowQRModal(false)} />
setShowQRModal(false)} onFilesChanged={() => {}} />
)}
) }