import { IconArchive as Archive, IconEye as Eye, IconLoader2 as Loader2, IconMail as Mail, IconMessage2 as MessageSquare, IconTrash as Trash2, } from '@tabler/icons-react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useState } from 'react'; import { toast } from 'sonner'; import { PageHeader } from '@/components/PageHeader'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { apiJson } from '@/lib/api'; import { ContentPanel } from '../../components/ContentPanel'; interface ContactSubmission { id: string; name: string; email: string; subject: string; message: string; status: string; created_at: string; } const queryKey = ['admin', 'contact-submissions']; function StatusBadge({ status }: { status: string }) { const variants: Record = { unread: 'default', read: 'secondary', replied: 'outline', archived: 'outline', }; return {status}; } export default function AdminContactSubmissions() { const queryClient = useQueryClient(); const [selectedSubmission, setSelectedSubmission] = useState(null); const { data, isLoading } = useQuery<{ submissions: ContactSubmission[]; total: number; }>({ queryKey, queryFn: () => apiJson<{ submissions: ContactSubmission[]; total: number }>( '/api/v1/admin/contact?limit=50', {}, 'Failed to fetch submissions' ), }); const updateMutation = useMutation({ mutationFn: ({ id, status }: { id: string; status: string }) => apiJson( `/api/v1/admin/contact/${id}`, { method: 'PATCH', body: { status } }, 'Failed to update' ), onSuccess: () => { queryClient.invalidateQueries({ queryKey }); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => apiJson(`/api/v1/admin/contact/${id}`, { method: 'DELETE' }, 'Failed to delete'), onSuccess: () => { queryClient.invalidateQueries({ queryKey }); setSelectedSubmission(null); toast.success('Submission deleted'); }, }); const submissions = data?.submissions ?? []; return ( <> Submissions Contact form submissions from your website {isLoading ? (
) : submissions.length === 0 ? (

No contact submissions yet.

) : (
{submissions.map((submission) => (
{ setSelectedSubmission(submission); if (submission.status === 'unread') { updateMutation.mutate({ id: submission.id, status: 'read' }); } }} onKeyDown={(e) => { if (e.key === 'Enter') setSelectedSubmission(submission); }} role="button" tabIndex={0} >
{submission.subject}
{submission.name} ({submission.email}) ·{' '} {new Date(submission.created_at).toLocaleDateString()}
))}
)}
{/* Submission detail dialog */} setSelectedSubmission(null)}> {selectedSubmission?.subject} From {selectedSubmission?.name} ({selectedSubmission?.email}) ·{' '} {selectedSubmission && new Date(selectedSubmission.created_at).toLocaleString()}

{selectedSubmission?.message}

{selectedSubmission?.status !== 'replied' && ( )}
); }