import React from 'react'; import { YStack, XStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { Trophy, Star } from 'lucide-react'; import AppShell from '../components/AppShell'; import { useEventData } from '../context/EventDataContext'; import { useOptionalGuestIdentity } from '../context/GuestIdentityContext'; import { fetchAchievements, type AchievementsPayload } from '../services/achievementsApi'; import { useTranslation } from '@/guest/i18n/useTranslation'; import { useLocale } from '@/guest/i18n/LocaleContext'; import { useAppearance } from '@/hooks/use-appearance'; export default function AchievementsScreen() { const { token } = useEventData(); const identity = useOptionalGuestIdentity(); const { t } = useTranslation(); const { locale } = useLocale(); const { resolved } = useAppearance(); const isDark = resolved === 'dark'; const cardBorder = isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(15, 23, 42, 0.12)'; const cardShadow = isDark ? '0 18px 40px rgba(2, 6, 23, 0.4)' : '0 16px 30px rgba(15, 23, 42, 0.12)'; const [payload, setPayload] = React.useState(null); const [loading, setLoading] = React.useState(false); const [error, setError] = React.useState(null); React.useEffect(() => { if (!token) { setPayload(null); return; } let active = true; setLoading(true); setError(null); fetchAchievements(token, { guestName: identity?.name ?? undefined, locale }) .then((data) => { if (!active) return; setPayload(data); }) .catch((err) => { console.error('Failed to load achievements', err); if (active) { setError(t('achievements.error', 'Achievements could not be loaded.')); } }) .finally(() => { if (active) { setLoading(false); } }); return () => { active = false; }; }, [token, identity?.name, locale, t]); const topPhoto = payload?.highlights?.topPhoto ?? null; const totalPhotos = payload?.summary?.totalPhotos ?? 0; const totalTasks = payload?.summary?.tasksSolved ?? 0; const totalLikes = payload?.summary?.likesTotal ?? 0; return ( {t('achievements.page.title', 'Achievements')} {loading ? t('common.actions.loading', 'Loading...') : t('achievements.page.subtitle', 'Track your milestones and highlight streaks.')} {error ? ( {error ?? t('achievements.page.loadError', 'Achievements could not be loaded.')} ) : null} {topPhoto ? t('achievements.highlights.topTitle', 'Top photo') : t('achievements.summary.topContributor', 'Top contributor')} {topPhoto ? t('achievements.highlights.likesAmount', { count: topPhoto.likes }, '{count} Likes') : t('achievements.summary.placeholder', 'Keep sharing to unlock highlights.')} {[1, 2].map((card) => ( {card === 1 ? totalTasks : totalPhotos} {card === 1 ? t('achievements.summary.tasksCompleted', 'Tasks completed') : t('achievements.summary.photosShared', 'Photos shared')} ))} {totalLikes} {t('achievements.summary.likesCollected', 'Likes collected')} ); }