'use client' import { useState, useRef, useCallback } from 'react' import { useParams } from 'next/navigation' import { BPIcon } from '@/components/Logo' interface UploadedFile { id: string name: string size: number status: 'uploading' | 'complete' | 'error' progress: number } 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] } export default function MobileUploadPage() { const params = useParams() const sessionId = params.sessionId as string const [files, setFiles] = useState([]) const [isDragging, setIsDragging] = useState(false) const fileInputRef = useRef(null) // Echten Upload durchfuehren const uploadFile = useCallback(async (file: File) => { const localId = `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}` const uploadFileState: UploadedFile = { id: localId, name: file.name, size: file.size, status: 'uploading', progress: 0 } setFiles(prev => [...prev, uploadFileState]) try { // Fortschritt auf 30% setzen (Datei wird gelesen) setFiles(prev => prev.map(f => f.id === localId ? { ...f, progress: 30 } : f )) // Datei als Base64 Data URL konvertieren const dataUrl = await new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = () => resolve(reader.result as string) reader.onerror = reject reader.readAsDataURL(file) }) // Fortschritt auf 60% setzen (Upload wird gesendet) setFiles(prev => prev.map(f => f.id === localId ? { ...f, progress: 60 } : f )) // An API senden const response = await fetch('/api/uploads', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sessionId, name: file.name, type: file.type, size: file.size, dataUrl }) }) if (!response.ok) { throw new Error('Upload fehlgeschlagen') } // Upload erfolgreich setFiles(prev => prev.map(f => f.id === localId ? { ...f, status: 'complete', progress: 100 } : f )) } catch (error) { console.error('Upload error:', error) setFiles(prev => prev.map(f => f.id === localId ? { ...f, status: 'error', progress: 0 } : f )) } }, [sessionId]) const handleFiles = useCallback((fileList: FileList | null) => { if (!fileList) return Array.from(fileList).forEach(file => { if (file.type === 'application/pdf' || file.type.startsWith('image/')) { uploadFile(file) } }) }, [uploadFile]) const handleDragOver = (e: React.DragEvent) => { e.preventDefault() setIsDragging(true) } const handleDragLeave = (e: React.DragEvent) => { e.preventDefault() setIsDragging(false) } const handleDrop = (e: React.DragEvent) => { e.preventDefault() setIsDragging(false) handleFiles(e.dataTransfer.files) } const completedCount = files.filter(f => f.status === 'complete').length return (
{/* Animated Background Blobs */}
{/* Header */}

BreakPilot

Mobiler Upload

{/* Upload Area */}
{/* Upload-Button */} {/* Uploaded Files */} {files.length > 0 && (
Hochgeladene Dateien {completedCount}/{files.length} fertig
{files.map((file) => (
{file.status === 'complete' ? '✅' : '📄'}

{file.name}

{formatFileSize(file.size)} {file.status === 'uploading' && ( {Math.round(file.progress)}% )}
{file.status === 'uploading' && (
)}
))}
)} {/* Success Message */} {completedCount > 0 && (

{completedCount} Datei{completedCount !== 1 ? 'en' : ''} erfolgreich hochgeladen!

Sie koennen diese Seite jetzt schliessen.

)}
{/* Footer */}

Session: {sessionId}

) }