'use client' import { useState, useMemo } from 'react' import { useTheme } from '@/lib/ThemeContext' interface Document { id: string name: string type: string size: number uploadedAt: Date category?: string tags?: string[] url?: string } interface DocumentSpaceProps { documents: Document[] onDelete?: (id: string) => void onRename?: (id: string, newName: string) => void onOpen?: (doc: Document) => void className?: string } const formatFileSize = (bytes: number): string => { if (bytes === 0) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i] } const formatDate = (date: Date): string => { return new Intl.DateTimeFormat('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(date) } export function DocumentSpace({ documents, onDelete, onRename, onOpen, className = '' }: DocumentSpaceProps) { const { isDark } = useTheme() const [searchQuery, setSearchQuery] = useState('') const [filterType, setFilterType] = useState('all') const [sortBy, setSortBy] = useState<'name' | 'date' | 'size'>('date') const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('desc') const [viewMode, setViewMode] = useState<'grid' | 'list'>('list') const [editingId, setEditingId] = useState(null) const [editName, setEditName] = useState('') const [previewDoc, setPreviewDoc] = useState(null) // Filtertypen ermitteln const fileTypes = useMemo(() => { const types = new Set(documents.map(d => d.type.split('/')[1] || d.type)) return ['all', ...Array.from(types)] }, [documents]) // Dokumente filtern und sortieren const filteredDocuments = useMemo(() => { let filtered = [...documents] // Suchfilter if (searchQuery) { const query = searchQuery.toLowerCase() filtered = filtered.filter(d => d.name.toLowerCase().includes(query) || d.tags?.some(t => t.toLowerCase().includes(query)) ) } // Typfilter if (filterType !== 'all') { filtered = filtered.filter(d => d.type.includes(filterType) ) } // Sortieren filtered.sort((a, b) => { let cmp = 0 switch (sortBy) { case 'name': cmp = a.name.localeCompare(b.name) break case 'date': cmp = new Date(a.uploadedAt).getTime() - new Date(b.uploadedAt).getTime() break case 'size': cmp = a.size - b.size break } return sortOrder === 'asc' ? cmp : -cmp }) return filtered }, [documents, searchQuery, filterType, sortBy, sortOrder]) const handleStartRename = (doc: Document) => { setEditingId(doc.id) setEditName(doc.name.replace(/\.[^/.]+$/, '')) } const handleSaveRename = (doc: Document) => { if (editName.trim() && onRename) { const ext = doc.name.split('.').pop() onRename(doc.id, `${editName.trim()}.${ext}`) } setEditingId(null) setEditName('') } const getFileIcon = (type: string) => { if (type.includes('pdf')) return '๐Ÿ“„' if (type.includes('image')) return '๐Ÿ–ผ๏ธ' if (type.includes('word') || type.includes('doc')) return '๐Ÿ“' if (type.includes('sheet') || type.includes('excel')) return '๐Ÿ“Š' return '๐Ÿ“Ž' } if (documents.length === 0) { return (
๐Ÿ“

Noch keine Dokumente

Laden Sie Ihr erstes Dokument hoch, um loszulegen.

) } return (
{/* Toolbar */}
{/* Suche */}
setSearchQuery(e.target.value)} placeholder="Dokumente durchsuchen..." className={`w-full pl-10 pr-4 py-2 rounded-xl border text-sm ${ isDark ? 'bg-white/5 border-white/10 text-white placeholder-white/40' : 'bg-white border-slate-200 text-slate-900 placeholder-slate-400' }`} />
{/* Filter */} {/* Sortierung */} {/* Ansicht */}
{/* Ergebnisse */}
{filteredDocuments.length} Dokument{filteredDocuments.length !== 1 ? 'e' : ''} gefunden
{/* Dokumentliste */} {viewMode === 'list' ? (
{filteredDocuments.map((doc) => (
setPreviewDoc(doc)} >
{getFileIcon(doc.type)}
{editingId === doc.id ? (
e.stopPropagation()}> setEditName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSaveRename(doc)} onBlur={() => handleSaveRename(doc)} autoFocus className={`flex-1 px-2 py-1 rounded border text-sm ${ isDark ? 'bg-white/10 border-white/20 text-white' : 'bg-white border-slate-300 text-slate-900' }`} />
) : (

{doc.name}

)}

{formatFileSize(doc.size)} ยท {formatDate(new Date(doc.uploadedAt))}

e.stopPropagation()}>
))}
) : (
{filteredDocuments.map((doc) => (
setPreviewDoc(doc)} >
{getFileIcon(doc.type)}

{doc.name}

{formatFileSize(doc.size)}

))}
)} {/* Vorschau-Modal */} {previewDoc && previewDoc.url && (
setPreviewDoc(null)} />
{/* Header */}
{getFileIcon(previewDoc.type)}

{previewDoc.name}

{formatFileSize(previewDoc.size)} ยท {formatDate(new Date(previewDoc.uploadedAt))}

{/* Vorschau-Inhalt */}
{previewDoc.type.includes('image') ? ( {previewDoc.name} ) : previewDoc.type.includes('pdf') ? (