import React from 'react'; import { useParams, Link } from 'react-router-dom'; import { Button } from '@/components/ui/button'; import { fetchPhotoShare } from '../services/photosApi'; import { useTranslation } from '../i18n/useTranslation'; import { useToast } from '../components/ToastHost'; import { Loader2 } from 'lucide-react'; interface ShareResponse { slug: string; expires_at?: string; photo: { id: number; title?: string; likes_count?: number; emotion?: { name?: string; emoji?: string } | null; image_urls: { full: string; thumbnail: string }; }; event?: { id: number; name?: string | null } | null; } export default function SharedPhotoPage() { const { slug } = useParams<{ slug: string }>(); const { t } = useTranslation(); const toast = useToast(); const [state, setState] = React.useState<{ loading: boolean; error: string | null; data: ShareResponse | null; }>({ loading: true, error: null, data: null }); React.useEffect(() => { let active = true; if (!slug) return; setState({ loading: true, error: null, data: null }); fetchPhotoShare(slug) .then((data) => { if (!active) return; setState({ loading: false, error: null, data }); }) .catch((error: any) => { if (!active) return; setState({ loading: false, error: error?.message ?? t('share.error', 'Moment konnte nicht geladen werden.'), data: null }); }); return () => { active = false; }; }, [slug, t]); const handleCopy = React.useCallback(async () => { try { await navigator.clipboard.writeText(window.location.href); toast.push({ text: t('share.copySuccess', 'Link kopiert!') }); } catch { toast.push({ text: t('share.copyError', 'Link konnte nicht kopiert werden.'), type: 'error' }); } }, [toast, t]); if (state.loading) { return (

{t('share.loading', 'Moment wird geladen...')}

); } if (state.error || !state.data) { return (

{t('share.expiredTitle', 'Link abgelaufen')}

{state.error ?? t('share.expiredDescription', 'Dieses Foto ist nicht mehr verfügbar.')}

); } const { data } = state; return (

{t('share.title', 'Geteiltes Foto')}

{data.event?.name ?? t('share.defaultEvent', 'Ein besonderer Moment')}

{data.photo.title && (

{data.photo.title}

)}
{data.photo.title
{data.photo.emotion && (

{data.photo.emotion.emoji} {data.photo.emotion.name}

)}
); }