import Link from 'next/link'; import { ArrowLeft, Pencil, Send, Users } from 'lucide-react'; import { getTranslations } from 'next-intl/server'; import { createNewsletterApi } from '@kit/newsletter/api'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { AccountNotFound } from '~/components/account-not-found'; import { CmsPageShell } from '~/components/cms-page-shell'; import { StatsCard } from '~/components/stats-card'; import { NEWSLETTER_STATUS_VARIANT, NEWSLETTER_STATUS_LABEL_KEYS, NEWSLETTER_RECIPIENT_STATUS_VARIANT, NEWSLETTER_RECIPIENT_STATUS_LABEL_KEYS, } from '~/lib/status-badges'; import { DispatchNewsletterButton } from './dispatch-newsletter-button'; interface PageProps { params: Promise<{ account: string; campaignId: string }>; } export default async function NewsletterDetailPage({ params }: PageProps) { const { account, campaignId } = await params; const client = getSupabaseServerClient(); const t = await getTranslations('newsletter'); const { data: acct } = await client .from('accounts') .select('id') .eq('slug', account) .single(); if (!acct) return ; const api = createNewsletterApi(client); const [newsletter, recipients] = await Promise.all([ api.getNewsletter(campaignId), api.getRecipients(campaignId), ]); if (!newsletter) return ; const status = String(newsletter.status); const sentCount = recipients.filter( (r: Record) => r.status === 'sent', ).length; const failedCount = recipients.filter( (r: Record) => r.status === 'failed' || r.status === 'bounced', ).length; return (
{/* Back link */}
{t('detail.backToList')}
{/* Summary Card */} {String(newsletter.subject ?? `(${t('list.noSubject')})`)}
{status === 'draft' && ( )} {t(NEWSLETTER_STATUS_LABEL_KEYS[status] ?? status)}
} /> } /> } />
{/* Actions */} {status === 'draft' && (
)}
{/* Recipients Table */} {t('detail.recipientsSection')} ({recipients.length}) {recipients.length === 0 ? (

{t('detail.noRecipients')}

) : (
{recipients.map((recipient: Record) => { const rStatus = String(recipient.status ?? 'pending'); return ( ); })}
{t('detail.recipientName')} {t('detail.recipientEmail')} {t('detail.recipientStatus')}
{String(recipient.name ?? '—')} {String(recipient.email ?? '—')} {t( NEWSLETTER_RECIPIENT_STATUS_LABEL_KEYS[ rStatus ] ?? rStatus, )}
)}
); }