import { useState, useEffect } from 'react' import { adminApi } from '@/api/admin' import type { SurveyInviteResponse } from '@/api/admin' import { PageHeader } from '@/components/admin' import { Copy, Check, Mail, Link2, Loader2, Send } from 'lucide-react' import { cn } from '@/lib/utils' export default function SurveyInvitesPage() { const [invites, setInvites] = useState([]) const [loading, setLoading] = useState(true) const [creating, setCreating] = useState(false) const [name, setName] = useState('') const [email, setEmail] = useState('') const [lastCreated, setLastCreated] = useState(null) const [copied, setCopied] = useState(false) const [error, setError] = useState('') const fetchInvites = async () => { try { const data = await adminApi.listSurveyInvites() setInvites(data) } catch { setError('Failed to load invites') } finally { setLoading(false) } } useEffect(() => { fetchInvites() }, []) const handleCreate = async (sendEmail: boolean) => { if (!name.trim()) return if (sendEmail && !email.trim()) return setCreating(true) setError('') try { const invite = await adminApi.createSurveyInvite({ recipient_name: name.trim(), recipient_email: email.trim() || undefined, send_email: sendEmail, }) setLastCreated(invite) setName('') setEmail('') setInvites(prev => [invite, ...prev]) } catch { setError('Failed to create invite') } finally { setCreating(false) } } const handleCopy = async (url: string) => { await navigator.clipboard.writeText(url) setCopied(true) setTimeout(() => setCopied(false), 2000) } const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit', }) } return (
{/* Create Invite Section */}

Create Invite

setName(e.target.value)} placeholder="John Smith" className="w-full rounded-[10px] border border-border bg-card px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-hidden" />
setEmail(e.target.value)} placeholder="john@example.com" className="w-full rounded-[10px] border border-border bg-card px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:border-primary/30 focus:outline-hidden" />
{error && (

{error}

)} {lastCreated && (

{lastCreated.email_sent ? 'Email sent to ' + lastCreated.recipient_email + '! Link:' : 'Share this link with ' + lastCreated.recipient_name + ':'}

{lastCreated.survey_url}

)}
{/* Invites Table */}
{loading ? ( ) : invites.length === 0 ? ( ) : ( invites.map(invite => ( )) )}
Name Email Status Sent Created Completed Link
Loading...
No invites yet
{invite.recipient_name} {invite.recipient_email || '—'} {invite.status} {invite.email_sent ? ( ) : ( )} {formatDate(invite.created_at)} {invite.completed_at ? formatDate(invite.completed_at) : '—'}
) }