import {Button, Card, CardContent, IconSpinner} from '@plunk/ui'; import {createTranslator, type Translator} from '@plunk/shared'; import {AnimatePresence, motion} from 'framer-motion'; import {useRouter} from 'next/router'; import React, {useEffect, useState} from 'react'; import {network} from '../../lib/network'; interface ContactInfo { id: string; email: string; subscribed: boolean; language: string; } export default function Subscribe() { const router = useRouter(); const {id} = router.query; const [contact, setContact] = useState(null); const [translator, setTranslator] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [subscribing, setSubscribing] = useState(false); const [success, setSuccess] = useState(false); useEffect(() => { if (!id || typeof id !== 'string') return; const fetchContact = async () => { try { setLoading(true); const data = await network.fetch('GET', `/contacts/public/${id}`); setContact(data); // Load translations for the project's language const t = await createTranslator(data.language || 'en'); setTranslator(t); setError(null); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load contact information'); } finally { setLoading(false); } }; void fetchContact(); }, [id]); const handleSubscribe = async () => { if (!id || typeof id !== 'string') return; try { setSubscribing(true); const data = await network.fetch('POST', `/contacts/public/${id}/subscribe`); setContact(data); setSuccess(true); setError(null); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to subscribe'); } finally { setSubscribing(false); } }; // Don't render until translations are loaded if (!translator) { return (

Loading...

); } if (loading) { return (

{translator.t('pages.common.loading')}

); } if (error && !contact) { return (

{translator.t('pages.common.error')}

{error}

); } if (success || (contact && contact.subscribed)) { return (

{translator.t('pages.subscribe.successTitle')}

{translator.t('pages.subscribe.successDescription', {email: contact?.email || ''})}

); } return (

{translator.t('pages.subscribe.title')}

{translator.t('pages.subscribe.description', {email: contact?.email || ''})}

{error && ( {error} )}
); }