import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { Page } from './_util'; import { useTranslation } from '../i18n/useTranslation'; import { fetchPendingUploadsSummary, type PendingUpload } from '../services/pendingUploadsApi'; import { Button } from '@/components/ui/button'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Image as ImageIcon, Loader2, RefreshCcw } from 'lucide-react'; import { useEventBranding } from '../context/EventBrandingContext'; export default function UploadQueuePage() { const { t, locale } = useTranslation(); const { token } = useParams<{ token?: string }>(); const [searchParams] = useSearchParams(); const navigate = useNavigate(); const { branding } = useEventBranding(); const bodyFont = branding.typography?.body ?? branding.fontFamily ?? undefined; const [pending, setPending] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const showSuccess = searchParams.get('uploaded') === 'true'; const buttonStyle = branding.buttons?.style ?? 'filled'; const linkColor = branding.buttons?.linkColor ?? branding.secondaryColor; const radius = branding.buttons?.radius ?? 12; const formatter = useMemo( () => new Intl.DateTimeFormat(locale, { day: '2-digit', month: 'short', hour: '2-digit', minute: '2-digit' }), [locale], ); const formatTimestamp = useCallback((value?: string | null) => { if (!value) { return t('pendingUploads.card.justNow'); } const date = new Date(value); if (Number.isNaN(date.getTime())) { return t('pendingUploads.card.justNow'); } return formatter.format(date); }, [formatter, t]); const loadPendingUploads = useCallback(async () => { if (!token) return; try { setLoading(true); setError(null); const result = await fetchPendingUploadsSummary(token, 12); setPending(result.items); } catch (err) { console.error('Pending uploads load failed', err); setError(t('pendingUploads.error')); } finally { setLoading(false); } }, [t, token]); useEffect(() => { if (!token) return; loadPendingUploads(); }, [loadPendingUploads, token]); const emptyState = !loading && pending.length === 0; return (

{t('pendingUploads.subtitle')}

{showSuccess && (

{t('pendingUploads.successTitle')}

{t('pendingUploads.successBody')}

)} {error && ( {error} )}
{loading ? (
{t('pendingUploads.loading', 'Lade Uploads...')}
) : (
{pending.map((photo) => (
{photo.thumbnail_url ? ( ) : (
)}

{t('pendingUploads.card.pending')}

{t('pendingUploads.card.uploadedAt').replace('{time}', formatTimestamp(photo.created_at))}

))} {emptyState && (

{t('pendingUploads.emptyTitle')}

{t('pendingUploads.emptyBody')}

)}
)}
); }