'use client'; import { useState } from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { format } from 'date-fns'; import { Pencil, Plus, Trash2 } from 'lucide-react'; import { toast } from 'sonner'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { ConfirmationDialog } from '@/components/shared/confirmation-dialog'; import { PageHeader } from '@/components/shared/page-header'; import { apiFetch } from '@/lib/api/client'; import { toastError } from '@/lib/api/toast-error'; import type { FormField } from '@/lib/validators/form-templates'; import { FormTemplateForm } from './form-template-form'; export interface FormTemplate { id: string; name: string; description: string | null; fields: FormField[]; isActive: boolean; updatedAt: string; } export function FormTemplateList() { const qc = useQueryClient(); const [formOpen, setFormOpen] = useState(false); const [editing, setEditing] = useState(null); const { data: templates = [], isLoading } = useQuery({ queryKey: ['admin', 'form-templates'], queryFn: () => apiFetch<{ data: FormTemplate[] }>('/api/v1/admin/form-templates').then((r) => r.data), }); const deleteMutation = useMutation({ mutationFn: (id: string) => apiFetch(`/api/v1/admin/form-templates/${id}`, { method: 'DELETE' }), onSuccess: () => { toast.success('Template deleted'); qc.invalidateQueries({ queryKey: ['admin', 'form-templates'] }); }, onError: (err) => toastError(err), }); return (
{ setEditing(null); setFormOpen(true); }} > New template } /> {isLoading ? (

Loading…

) : templates.length === 0 ? (

No form templates yet.

) : (
{templates.map((t) => (
{t.name} {!t.isActive && ( Inactive )}
{t.fields.length} field{t.fields.length === 1 ? '' : 's'} · updated{' '} {format(new Date(t.updatedAt), 'MMM d, yyyy')}
} title="Delete form template" description={`Delete "${t.name}"? Existing submissions will be preserved.`} confirmLabel="Delete" onConfirm={() => deleteMutation.mutate(t.id)} />
))}
)} qc.invalidateQueries({ queryKey: ['admin', 'form-templates'] })} />
); }