import React from 'react'; import { Page } from './_util'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { useParams } from 'react-router-dom'; import { getDeviceId } from '../lib/device'; import { compressPhoto, formatBytes } from '../lib/image'; import { useUploadQueue } from '../queue/hooks'; import React from 'react'; type Item = { file: File; out?: File; progress: number; done?: boolean; error?: string; id?: number }; export default function UploadPage() { const { slug } = useParams(); const [items, setItems] = React.useState([]); const queue = useUploadQueue(); const [progressMap, setProgressMap] = React.useState>({}); React.useEffect(() => { const onProg = (e: any) => { const { id, progress } = e.detail || {}; if (typeof id === 'number') setProgressMap((m) => ({ ...m, [id]: progress })); }; window.addEventListener('queue-progress', onProg); return () => window.removeEventListener('queue-progress', onProg); }, []); async function onPick(e: React.ChangeEvent) { const files = Array.from(e.target.files ?? []).slice(0, 10); const results: Item[] = []; for (const f of files) { try { const out = await compressPhoto(f, { targetBytes: 1_500_000, maxEdge: 2560, qualityStart: 0.85 }); results.push({ file: f, out, progress: 0 }); } catch (err: any) { results.push({ file: f, progress: 0, error: err?.message || 'Komprimierung fehlgeschlagen' }); } } setItems(results); } async function startUpload() { // Enqueue items for offline-friendly processing for (const it of items) { await queue.add({ slug: slug!, fileName: it.out?.name ?? it.file.name, blob: it.out ?? it.file }); } setItems([]); } return (
{items.map((it, i) => (
{it.file.name}
{formatBytes(it.out?.size ?? it.file.size)}
{it.done &&
Fertig
} {it.error &&
{it.error}
}
))}
Warteschlange
{queue.loading ? (
Lade…
) : queue.items.length === 0 ? (
Keine offenen Uploads.
) : (
{queue.items.map((q) => (
{q.fileName}
{q.status}{q.status==='uploading' && typeof q.id==='number' ? ` • ${progressMap[q.id] ?? 0}%` : ''}
{q.status === 'uploading' && typeof q.id==='number' && (
)}
))}
)}
); }