import React from 'react'; import { Link, useParams } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Separator } from '@/components/ui/separator'; import EmotionPicker from '../components/EmotionPicker'; import GalleryPreview from '../components/GalleryPreview'; import { useGuestIdentity } from '../context/GuestIdentityContext'; import { useEventStats } from '../context/EventStatsContext'; import { useEventData } from '../hooks/useEventData'; import { useGuestTaskProgress } from '../hooks/useGuestTaskProgress'; import { Sparkles, UploadCloud, Images, CheckCircle2, Users, TimerReset } from 'lucide-react'; import { useTranslation, type TranslateFn } from '../i18n/useTranslation'; export default function HomePage() { const { token } = useParams<{ token: string }>(); const { name, hydrated } = useGuestIdentity(); const stats = useEventStats(); const { event } = useEventData(); const { completedCount } = useGuestTaskProgress(token); const { t } = useTranslation(); if (!token) return null; const displayName = hydrated && name ? name : t('home.fallbackGuestName'); const eventNameDisplay = event?.name ?? t('home.hero.defaultEventName'); const latestUploadText = formatLatestUpload(stats.latestPhotoAt, t); const primaryActions = React.useMemo( () => [ { to: 'tasks', label: t('home.actions.items.tasks.label'), description: t('home.actions.items.tasks.description'), icon: , }, { to: 'upload', label: t('home.actions.items.upload.label'), description: t('home.actions.items.upload.description'), icon: , }, { to: 'gallery', label: t('home.actions.items.gallery.label'), description: t('home.actions.items.gallery.description'), icon: , }, ], [t], ); const checklistItems = React.useMemo( () => [ t('home.checklist.steps.first'), t('home.checklist.steps.second'), t('home.checklist.steps.third'), ], [t], ); return (
} label={t('home.stats.online')} value={`${stats.onlineGuests}`} /> } label={t('home.stats.tasksSolved')} value={`${stats.tasksSolved}`} /> } label={t('home.stats.lastUpload')} value={latestUploadText} /> } label={t('home.stats.completedTasks')} value={`${completedCount}`} />

{t('home.actions.title')}

{t('home.actions.subtitle')}
{primaryActions.map((action) => (
{action.icon}
{action.label} {action.description}
))}
{t('home.checklist.title')} {t('home.checklist.description')} {checklistItems.map((item) => (
{item}
))}
); } function HeroCard({ name, eventName, tasksCompleted, t, }: { name: string; eventName: string; tasksCompleted: number; t: TranslateFn; }) { const heroTitle = t('home.hero.title').replace('{name}', name); const heroDescription = t('home.hero.description').replace('{eventName}', eventName); const progressMessage = tasksCompleted > 0 ? t('home.hero.progress.some').replace('{count}', `${tasksCompleted}`) : t('home.hero.progress.none'); return ( {t('home.hero.subtitle')} {heroTitle}

{heroDescription}

{progressMessage}

); } function StatTile({ icon, label, value }: { icon: React.ReactNode; label: string; value: string }) { return (
{icon}
{label} {value}
); } function formatLatestUpload(isoDate: string | null, t: TranslateFn) { if (!isoDate) { return t('home.latestUpload.none'); } const date = new Date(isoDate); if (Number.isNaN(date.getTime())) { return t('home.latestUpload.invalid'); } const diffMs = Date.now() - date.getTime(); const diffMinutes = Math.round(diffMs / 60000); if (diffMinutes < 1) { return t('home.latestUpload.justNow'); } if (diffMinutes < 60) { return t('home.latestUpload.minutes').replace('{count}', `${diffMinutes}`); } const diffHours = Math.round(diffMinutes / 60); if (diffHours < 24) { return t('home.latestUpload.hours').replace('{count}', `${diffHours}`); } const diffDays = Math.round(diffHours / 24); return t('home.latestUpload.days').replace('{count}', `${diffDays}`); }