'use client' import { useState, useEffect, useMemo } from 'react' import { useRouter } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { useLanguage } from '@/lib/LanguageContext' import { Sidebar } from '@/components/Sidebar' import { ThemeToggle } from '@/components/ThemeToggle' import { LanguageDropdown } from '@/components/LanguageDropdown' import { korrekturApi } from '@/lib/korrektur/api' import { GlassCard } from './_components/GlassCard' import { FilterDropdown } from './_components/FilterDropdown' import { DokumentCard, type AbiturDokument } from './_components/DokumentCard' import { PreviewModal } from './_components/PreviewModal' import { CreateKlausurFromTemplateModal } from './_components/CreateKlausurFromTemplateModal' // ============================================================================= // CONSTANTS // ============================================================================= const BUNDESLAENDER = ['Alle', 'Niedersachsen', 'NRW', 'Bayern', 'Baden-Wuerttemberg', 'Hessen'] const POPULAR_THEMES = [ 'Textanalyse', 'Gedichtanalyse', 'Eroerterung', 'Dramenanalyse', 'Sprachreflexion', 'Romantik', 'Expressionismus', ] const SAMPLE_PDF = 'https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf' const MOCK_DOKUMENTE: AbiturDokument[] = [ { id: '1', dateiname: 'Deutsch_eA_2024_Aufgabe1.pdf', fach: 'Deutsch', jahr: 2024, bundesland: 'Niedersachsen', niveau: 'eA', dokumenttyp: 'Aufgabe', aufgabentyp: 'Textanalyse', thema: 'Textanalyse: "Der Prozess" - Kafka', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 4 }, { id: '2', dateiname: 'Deutsch_eA_2024_EH1.pdf', fach: 'Deutsch', jahr: 2024, bundesland: 'Niedersachsen', niveau: 'eA', dokumenttyp: 'Erwartungshorizont', aufgabentyp: 'Textanalyse', thema: 'EH zu Kafka-Analyse', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 8 }, { id: '3', dateiname: 'Deutsch_gA_2024_Aufgabe2.pdf', fach: 'Deutsch', jahr: 2024, bundesland: 'Niedersachsen', niveau: 'gA', dokumenttyp: 'Aufgabe', aufgabentyp: 'Gedichtanalyse', thema: 'Gedichtvergleich Romantik', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 3 }, { id: '4', dateiname: 'Deutsch_eA_2023_Aufgabe1.pdf', fach: 'Deutsch', jahr: 2023, bundesland: 'Niedersachsen', niveau: 'eA', dokumenttyp: 'Aufgabe', aufgabentyp: 'Eroerterung', thema: 'Materialgestuetzte Eroerterung: Digitalisierung', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 5 }, { id: '5', dateiname: 'Deutsch_eA_2023_EH1.pdf', fach: 'Deutsch', jahr: 2023, bundesland: 'Niedersachsen', niveau: 'eA', dokumenttyp: 'Erwartungshorizont', aufgabentyp: 'Eroerterung', thema: 'EH zu Digitalisierungs-Eroerterung', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 10 }, { id: '6', dateiname: 'Deutsch_gA_2023_Aufgabe3.pdf', fach: 'Deutsch', jahr: 2023, bundesland: 'Niedersachsen', niveau: 'gA', dokumenttyp: 'Aufgabe', aufgabentyp: 'Dramenanalyse', thema: 'Szenenanalyse: "Faust I"', download_url: SAMPLE_PDF, preview_url: SAMPLE_PDF, page_count: 4 }, ] // ============================================================================= // MAIN PAGE // ============================================================================= export default function ArchivPage() { const { isDark } = useTheme() const { t } = useLanguage() const router = useRouter() // State const [searchQuery, setSearchQuery] = useState('') const [dokumente, setDokumente] = useState([]) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) // Filters const [fach, setFach] = useState('Alle') const [jahr, setJahr] = useState('Alle') const [bundesland, setBundesland] = useState('Alle') const [niveau, setNiveau] = useState('Alle') const [dokumenttyp, setDokumenttyp] = useState('Alle') // Preview const [previewDokument, setPreviewDokument] = useState(null) // Create Klausur Modal const [showCreateModal, setShowCreateModal] = useState(false) const [selectedTemplate, setSelectedTemplate] = useState(null) const [isCreating, setIsCreating] = useState(false) const [createError, setCreateError] = useState(null) // Available filter options (updated from API response) const [availableFilters, setAvailableFilters] = useState<{ subjects: string[]; years: number[]; niveaus: string[]; doc_types: string[] }>({ subjects: ['Deutsch', 'Englisch', 'Mathematik'], years: [2025, 2024, 2023, 2022, 2021], niveaus: ['eA', 'gA'], doc_types: ['EWH', 'Aufgabe'] }) // Load data from API with fallback to mock useEffect(() => { const loadDocuments = async () => { setIsLoading(true) setError(null) try { const filters: { subject?: string; year?: number; niveau?: string; doc_type?: string; search?: string } = {} if (fach !== 'Alle') filters.subject = fach if (jahr !== 'Alle') filters.year = parseInt(jahr) if (niveau !== 'Alle') filters.niveau = niveau if (dokumenttyp !== 'Alle') { const docTypeMap: Record = { 'Erwartungshorizont': 'EWH', 'Aufgabe': 'Aufgabe', 'Loesungshinweise': 'Material' } filters.doc_type = docTypeMap[dokumenttyp] || dokumenttyp } if (searchQuery) filters.search = searchQuery const response = await korrekturApi.getArchivDocuments(filters) const mappedDokumente: AbiturDokument[] = response.documents.map((doc) => ({ id: doc.id, dateiname: `${doc.subject}_${doc.niveau}_${doc.year}_${doc.doc_type}.pdf`, fach: doc.subject, jahr: doc.year, bundesland: doc.bundesland === 'NI' ? 'Niedersachsen' : doc.bundesland, niveau: doc.niveau, dokumenttyp: doc.doc_type === 'EWH' ? 'Erwartungshorizont' : doc.doc_type, aufgabentyp: doc.doc_type, thema: doc.title, download_url: doc.preview_url || SAMPLE_PDF, preview_url: doc.preview_url || SAMPLE_PDF, })) if (response.filters) { setAvailableFilters({ subjects: response.filters.subjects || ['Deutsch', 'Englisch', 'Mathematik'], years: response.filters.years || [2025, 2024, 2023, 2022, 2021], niveaus: response.filters.niveaus || ['eA', 'gA'], doc_types: response.filters.doc_types || ['EWH', 'Aufgabe'] }) } if (mappedDokumente.length > 0) { setDokumente(mappedDokumente) } else { console.warn('API returned empty documents, using fallback data') throw new Error('Empty response') } } catch (err) { console.warn('Failed to load from API, using fallback data:', err) setDokumente(MOCK_DOKUMENTE) } finally { setIsLoading(false) } } loadDocuments() }, [fach, jahr, bundesland, niveau, dokumenttyp, searchQuery]) const filteredDokumente = useMemo(() => { return dokumente.filter((dok) => { if (bundesland !== 'Alle' && dok.bundesland !== bundesland) return false if (searchQuery) { const query = searchQuery.toLowerCase() const matchesSearch = dok.thema?.toLowerCase().includes(query) || dok.fach.toLowerCase().includes(query) || dok.aufgabentyp?.toLowerCase().includes(query) || dok.dateiname.toLowerCase().includes(query) if (!matchesSearch) return false } return true }) }, [dokumente, bundesland, searchQuery]) const handleThemeClick = (theme: string) => { setSearchQuery(theme) } const handleUseAsTemplate = (dokument: AbiturDokument) => { setSelectedTemplate(dokument); setShowCreateModal(true); setCreateError(null) } const handleCreateKlausur = async (title: string) => { if (!selectedTemplate) return setIsCreating(true); setCreateError(null) try { const newKlausur = await korrekturApi.createKlausur({ title: title || `${selectedTemplate.fach} ${selectedTemplate.aufgabentyp || ''} ${selectedTemplate.jahr}`, subject: selectedTemplate.fach, year: selectedTemplate.jahr, semester: 'Abitur', modus: 'landes_abitur', }) setShowCreateModal(false); setSelectedTemplate(null) router.push(`/korrektur/${newKlausur.id}`) } catch (err) { console.error('Failed to create klausur:', err) const errorMsg = err instanceof Error ? err.message : 'Unbekannter Fehler' if (errorMsg.includes('fetch') || errorMsg.includes('Load') || errorMsg.includes('network')) { setCreateError('Verbindung zum Server fehlgeschlagen. Bitte pruefen Sie, ob der Klausur-Service laeuft.') } else { setCreateError(`Klausur konnte nicht erstellt werden: ${errorMsg}`) } } finally { setIsCreating(false) } } const handleGoToKorrektur = () => { setShowCreateModal(false); setSelectedTemplate(null); router.push('/korrektur') } const activeFilters = [fach, jahr, bundesland, niveau, dokumenttyp].filter(f => f !== 'Alle').length const FAECHER = useMemo(() => ['Alle', ...availableFilters.subjects], [availableFilters.subjects]) const JAHRE = useMemo(() => ['Alle', ...availableFilters.years.map(String)], [availableFilters.years]) const NIVEAUS = useMemo(() => ['Alle', ...availableFilters.niveaus], [availableFilters.niveaus]) const DOKUMENTTYPEN = useMemo(() => ['Alle', ...availableFilters.doc_types.map(t => t === 'EWH' ? 'Erwartungshorizont' : t)], [availableFilters.doc_types]) return (
{/* Animated Background */}
{/* Header */}

Abitur-Archiv

Zentralabitur-Materialien 2021-2025 durchsuchen

{/* Search Bar */}
setSearchQuery(e.target.value)} placeholder="Thema suchen... z.B. Gedichtanalyse, Romantik, Kafka" className={`flex-1 bg-transparent border-none outline-none text-lg ${isDark ? 'text-white placeholder-white/40' : 'text-slate-900 placeholder-slate-400'}`} /> {searchQuery && ( )}
{POPULAR_THEMES.map((theme) => ( ))}
{/* Filters */}
{activeFilters > 0 && ( )}
{filteredDokumente.length} Dokumente
{/* Loading */} {isLoading && (
)} {/* Error */} {error && (
{error}
)} {/* Documents Grid */} {!isLoading && (
{filteredDokumente.map((dok, index) => ( setPreviewDokument(dok)} onUseAsTemplate={() => handleUseAsTemplate(dok)} delay={200 + index * 50} isDark={isDark} /> ))} {filteredDokumente.length === 0 && !isLoading && (

Keine Dokumente gefunden

Versuchen Sie andere Filtereinstellungen

)}
)}
setPreviewDokument(null)} onUseAsTemplate={() => { if (previewDokument) handleUseAsTemplate(previewDokument); setPreviewDokument(null) }} isDark={isDark} /> {showCreateModal && selectedTemplate && ( { setShowCreateModal(false); setSelectedTemplate(null); setCreateError(null) }} onCreate={handleCreateKlausur} onFallback={handleGoToKorrektur} isLoading={isCreating} error={createError} isDark={isDark} /> )}
) }