'use client' import { useState, useEffect, useCallback } from 'react' import dynamic from 'next/dynamic' import { useTheme } from '@/lib/ThemeContext' import { useLanguage } from '@/lib/LanguageContext' import { WorksheetProvider, useWorksheet } from '@/lib/worksheet-editor/WorksheetContext' import { Sidebar } from '@/components/Sidebar' import { EditorToolbar } from '@/components/worksheet-editor/EditorToolbar' import { PropertiesPanel } from '@/components/worksheet-editor/PropertiesPanel' import { CanvasControls } from '@/components/worksheet-editor/CanvasControls' import { PageNavigator } from '@/components/worksheet-editor/PageNavigator' import { AIImageGenerator } from '@/components/worksheet-editor/AIImageGenerator' import { ExportPanel } from '@/components/worksheet-editor/ExportPanel' import { AIPromptBar } from '@/components/worksheet-editor/AIPromptBar' import { DocumentImporter } from '@/components/worksheet-editor/DocumentImporter' import { CleanupPanel } from '@/components/worksheet-editor/CleanupPanel' import { OCRImportPanel } from '@/components/worksheet-editor/OCRImportPanel' import { ThemeToggle } from '@/components/ThemeToggle' import { LanguageDropdown } from '@/components/LanguageDropdown' // Dynamic import to prevent SSR issues with Fabric.js const FabricCanvas = dynamic( () => import('@/components/worksheet-editor/FabricCanvas').then(mod => mod.FabricCanvas), { ssr: false, loading: () => (
) } ) // Storage key for saved worksheets const WORKSHEETS_KEY = 'bp_worksheets' interface SavedWorksheet { id: string title: string updatedAt: string thumbnail?: string } function WorksheetEditorContent() { const { isDark } = useTheme() const { t } = useLanguage() const { document, setDocument, isDirty, setIsDirty, saveDocument, loadDocument, canvas } = useWorksheet() const [mounted, setMounted] = useState(false) const [isAIGeneratorOpen, setIsAIGeneratorOpen] = useState(false) const [isExportPanelOpen, setIsExportPanelOpen] = useState(false) const [isDocumentImporterOpen, setIsDocumentImporterOpen] = useState(false) const [isCleanupPanelOpen, setIsCleanupPanelOpen] = useState(false) const [isOCRImportOpen, setIsOCRImportOpen] = useState(false) const [isDocumentListOpen, setIsDocumentListOpen] = useState(false) const [savedWorksheets, setSavedWorksheets] = useState([]) const [isSaving, setIsSaving] = useState(false) const [title, setTitle] = useState('') useEffect(() => { setMounted(true) loadSavedWorksheets() }, []) useEffect(() => { if (document) { setTitle(document.title) } }, [document]) // Load saved worksheets from localStorage const loadSavedWorksheets = useCallback(() => { try { const stored = localStorage.getItem(WORKSHEETS_KEY) if (stored) { setSavedWorksheets(JSON.parse(stored)) } } catch (e) { console.error('Failed to load worksheets:', e) } }, []) // Save current worksheet const handleSave = useCallback(async () => { if (!document) return setIsSaving(true) try { // Save to context (which saves to API or localStorage) await saveDocument() // Update worksheets list const worksheetEntry: SavedWorksheet = { id: document.id, title: document.title, updatedAt: new Date().toISOString(), thumbnail: canvas?.toDataURL({ format: 'png', multiplier: 0.1 }) } setSavedWorksheets(prev => { const filtered = prev.filter(w => w.id !== document.id) const updated = [worksheetEntry, ...filtered] localStorage.setItem(WORKSHEETS_KEY, JSON.stringify(updated)) return updated }) setIsDirty(false) } catch (e) { console.error('Save failed:', e) } finally { setIsSaving(false) } }, [document, saveDocument, canvas, setIsDirty]) // Load a saved worksheet const handleLoadWorksheet = useCallback(async (id: string) => { try { await loadDocument(id) setIsDocumentListOpen(false) } catch (e) { console.error('Failed to load worksheet:', e) } }, [loadDocument]) // Delete a saved worksheet const handleDeleteWorksheet = useCallback((id: string) => { setSavedWorksheets(prev => { const updated = prev.filter(w => w.id !== id) localStorage.setItem(WORKSHEETS_KEY, JSON.stringify(updated)) localStorage.removeItem(`worksheet_${id}`) return updated }) }, []) // Create new worksheet const handleNewWorksheet = useCallback(() => { const newDoc = { id: `ws_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, title: 'Neues Arbeitsblatt', pages: [{ id: `page_${Date.now()}`, index: 0, canvasJSON: '' }], pageFormat: { width: 210, height: 297, orientation: 'portrait' as const, margins: { top: 15, right: 15, bottom: 15, left: 15 } }, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } setDocument(newDoc) setIsDocumentListOpen(false) if (canvas) { canvas.clear() canvas.backgroundColor = '#ffffff' canvas.renderAll() } }, [setDocument, canvas]) const handleTitleChange = (newTitle: string) => { setTitle(newTitle) if (document) { setDocument({ ...document, title: newTitle, updatedAt: new Date().toISOString() }) } } if (!mounted) { return (
) } return (
{/* Animated Background Blobs */}
{/* Sidebar */}
{/* Main Content */}
{/* Header */}

Arbeitsblatt-Editor

handleTitleChange(e.target.value)} placeholder="Arbeitsblatt-Titel..." className={`text-sm px-3 py-1.5 rounded-lg border transition-all w-56 ${ isDark ? 'bg-white/10 border-white/20 text-white placeholder-white/40 focus:border-purple-400' : 'bg-white/50 border-slate-300 text-slate-900 placeholder-slate-400 focus:border-purple-500' }`} /> {isDirty && ( Ungespeichert )} {/* Save Button */}
{/* Document List Button */} {/* Export Button */} {/* Theme Toggle */} {/* Language Dropdown */}
{/* Editor Area - New Layout */}
{/* Left Toolbar */}
setIsAIGeneratorOpen(true)} onOpenDocumentImporter={() => setIsDocumentImporterOpen(true)} onOpenCleanupPanel={() => setIsCleanupPanelOpen(true)} onOpenOCRImport={() => setIsOCRImportOpen(true)} className="h-full" />
{/* Canvas Area - takes remaining space */}
{/* Canvas with fixed aspect ratio container */}
{/* Bottom Controls */}
{/* Right Panel - AI Prompt + Properties */}
{/* AI Prompt Bar */}
{/* Properties Panel */}
{/* Document List Modal */} {isDocumentListOpen && (
setIsDocumentListOpen(false)} />

Meine Arbeitsblätter

{/* New Worksheet Button */} {/* Worksheets List */}
{savedWorksheets.length === 0 ? (

Noch keine Arbeitsblätter gespeichert

) : ( savedWorksheets.map((worksheet) => (
handleLoadWorksheet(worksheet.id)} > {/* Thumbnail */}
{worksheet.thumbnail ? ( ) : (
)}
{/* Info */}

{worksheet.title}

{new Date(worksheet.updatedAt).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' })}

{document?.id === worksheet.id && ( Aktuell geöffnet )}
{/* Delete Button */}
)) )}
)} {/* Modals */} setIsAIGeneratorOpen(false)} /> setIsExportPanelOpen(false)} /> setIsDocumentImporterOpen(false)} /> setIsCleanupPanelOpen(false)} /> setIsOCRImportOpen(false)} />
) } export default function WorksheetEditorPage() { return ( ) }