'use client' import { useState, useEffect, useCallback } from 'react' export interface UploadedFile { id: string sessionId: string name: string type: string size: number uploadedAt: string dataUrl: string } interface QRCodeUploadProps { sessionId?: string onClose?: () => void onFileUploaded?: (file: UploadedFile) => void onFilesChanged?: (files: UploadedFile[]) => void className?: string } export function QRCodeUpload({ sessionId, onClose, onFileUploaded, onFilesChanged, className = '' }: QRCodeUploadProps) { const [qrCodeUrl, setQrCodeUrl] = useState(null) const [uploadUrl, setUploadUrl] = useState('') const [isLoading, setIsLoading] = useState(true) const [uploadedFiles, setUploadedFiles] = useState([]) const [isPolling, setIsPolling] = useState(false) 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 fetchUploads = useCallback(async () => { if (!sessionId) return try { const response = await fetch(`/api/uploads?sessionId=${sessionId}`) if (response.ok) { const data = await response.json() const newFiles = data.uploads || [] if (newFiles.length > uploadedFiles.length) { const newlyAdded = newFiles.slice(uploadedFiles.length) newlyAdded.forEach((file: UploadedFile) => { if (onFileUploaded) onFileUploaded(file) }) } setUploadedFiles(newFiles) if (onFilesChanged) onFilesChanged(newFiles) } } catch (error) { console.error('Failed to fetch uploads:', error) } }, [sessionId, uploadedFiles.length, onFileUploaded, onFilesChanged]) useEffect(() => { let baseUrl = typeof window !== 'undefined' ? window.location.origin : '' const hostnameToIP: Record = { 'macmini': '192.168.178.100', 'macmini.local': '192.168.178.100', } Object.entries(hostnameToIP).forEach(([hostname, ip]) => { if (baseUrl.includes(hostname)) baseUrl = baseUrl.replace(hostname, ip) }) const uploadPath = `/upload/${sessionId || 'new'}` const fullUrl = `${baseUrl}${uploadPath}` setUploadUrl(fullUrl) const qrApiUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(fullUrl)}` setQrCodeUrl(qrApiUrl) setIsLoading(false) fetchUploads() setIsPolling(true) const pollInterval = setInterval(() => fetchUploads(), 3000) return () => { clearInterval(pollInterval); setIsPolling(false) } }, [sessionId]) const copyToClipboard = async () => { try { await navigator.clipboard.writeText(uploadUrl) alert('Link kopiert!') } catch (err) { console.error('Kopieren fehlgeschlagen:', err) } } const deleteUpload = async (id: string) => { try { const response = await fetch(`/api/uploads?id=${id}`, { method: 'DELETE' }) if (response.ok) { const newFiles = uploadedFiles.filter(f => f.id !== id) setUploadedFiles(newFiles) if (onFilesChanged) onFilesChanged(newFiles) } } catch (error) { console.error('Failed to delete upload:', error) } } return (
📱

Mit Mobiltelefon hochladen

QR-Code scannen oder Link teilen

{onClose && ( )}
{isLoading ? (
) : qrCodeUrl ? ( QR Code zum Hochladen ) : (
QR-Code nicht verfuegbar
)}

Scannen Sie diesen Code mit Ihrem Handy,
um Dokumente direkt hochzuladen.

{isPolling && (
Warte auf Uploads...
)}
{uploadedFiles.length > 0 && (

{uploadedFiles.length} Datei{uploadedFiles.length !== 1 ? 'en' : ''} empfangen

{uploadedFiles.map((file) => (
{file.type.startsWith('image/') ? '🖼️' : '📄'}

{file.name}

{formatFileSize(file.size)}

))}
)}

Oder Link teilen:

) }