import React from 'react'; import { YStack, XStack } from '@tamagui/stacks'; import { SizableText as Text } from '@tamagui/text'; import { Button } from '@tamagui/button'; import { Share2, QrCode, Link, Users } from 'lucide-react'; import AppShell from '../components/AppShell'; import { useEventData } from '../context/EventDataContext'; import { buildEventShareLink } from '../services/eventLink'; import { usePollStats } from '../hooks/usePollStats'; import { fetchEventQrCode } from '../services/qrApi'; import { useGuestThemeVariant } from '../lib/guestTheme'; import { useTranslation } from '@/guest/i18n/useTranslation'; export default function ShareScreen() { const { event, token } = useEventData(); const { t } = useTranslation(); const { isDark } = useGuestThemeVariant(); 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 [copyState, setCopyState] = React.useState<'idle' | 'copied' | 'failed'>('idle'); const { stats } = usePollStats(token ?? null); const [qrCodeDataUrl, setQrCodeDataUrl] = React.useState(''); const [qrLoading, setQrLoading] = React.useState(false); const shareUrl = buildEventShareLink(event, token); const handleCopy = React.useCallback(async () => { if (!shareUrl) { return; } try { await navigator.clipboard?.writeText(shareUrl); setCopyState('copied'); } catch (error) { console.error('Copy failed', error); setCopyState('failed'); } finally { window.setTimeout(() => setCopyState('idle'), 2000); } }, [shareUrl]); const handleShare = React.useCallback(async () => { if (!shareUrl) return; const title = event?.name ?? t('share.defaultEvent', 'Fotospiel'); const data: ShareData = { title, text: title, url: shareUrl }; if (navigator.share && (!navigator.canShare || navigator.canShare(data))) { try { await navigator.share(data); } catch (error) { // user dismissed } } else { await handleCopy(); } }, [event?.name, handleCopy, shareUrl]); React.useEffect(() => { if (!token) { setQrCodeDataUrl(''); setQrLoading(false); return; } let active = true; setQrLoading(true); fetchEventQrCode(token, 240) .then((payload) => { if (!active) { return; } setQrCodeDataUrl(payload.qr_code_data_url ?? ''); }) .catch((error) => { if (!active) { return; } console.error('Failed to load QR code', error); setQrCodeDataUrl(''); }) .finally(() => { if (active) { setQrLoading(false); } }); return () => { active = false; }; }, [token]); const guestCountLabel = stats.onlineGuests.toString(); const inviteDisabled = !shareUrl; return ( {t('share.invite.title', 'Invite guests')} {t('share.invite.description', 'Share the event link or show the QR code to join.')} {qrCodeDataUrl ? ( {t('share.invite.qrAlt', ) : ( )} {t('share.invite.qrLabel', 'Show QR')} {copyState === 'copied' ? t('share.copySuccess', 'Copied') : copyState === 'failed' ? t('share.copyError', 'Copy failed') : t('share.invite.copyLabel', 'Copy link')} {t('share.invite.guestsTitle', 'Guests joined')} {guestCountLabel} {t('home.stats.online', 'Guests online')} {event?.name ? t('share.invite.guestsSubtitleEvent', 'Share {event} with your guests.', { event: event.name }) : t('share.invite.guestsSubtitle', 'Share the event with your guests.')} ); }