'use client' import { useState } from 'react' import Link from 'next/link' import { FileText, Plus } from 'lucide-react' import { toast } from 'sonner' import { PageHeader, PageTitle } from '@/components/ui/page-title' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription } from '@/components/ui/empty' import { useConfirm } from '@/components/ui/confirm' import { CopyLinkButton } from '@/components/forms/copy-link-button' import { deleteForm, relinkAllSubmissions } from '@/lib/actions' type FormRow = { id: string slug: string title: string kind: string visibility: string status: string version: number created_at: string } const VIS_LABEL: Record = { members: 'Members only', public_auth: 'Signed in', public_anon: 'Public', } export function FormsClient({ forms: initial, spaceSlug }: { forms: FormRow[]; spaceSlug: string }) { const confirm = useConfirm() const [forms, setForms] = useState(initial) const [busy, setBusy] = useState(false) async function onRelink() { setBusy(true) const res = await relinkAllSubmissions() setBusy(false) if ('error' in res && res.error) return toast.error(res.error) const n = (res as { data: { linked: number } }).data.linked toast.success(n > 0 ? `Linked ${n} submission(s) to members` : 'All submissions already linked') } async function onDelete(f: FormRow) { const ok = await confirm({ title: `Delete "${f.title}"?`, description: 'This permanently deletes the form AND every response/submission for it, including any signed waivers. This cannot be undone. Export the results first if you need a record.', confirmText: 'Delete form and all responses', destructive: true, }) if (!ok) return setBusy(true) const res = await deleteForm({ formId: f.id, confirm: true }) setBusy(false) if ('error' in res && res.error) return toast.error(res.error) setForms(prev => prev.filter(x => x.id !== f.id)) toast.success('Form deleted') } return ( <> Forms & waivers
{forms.length === 0 ? ( No forms yet Build a custom form or a signable waiver. Members-only or public, your choice. ) : (
{forms.map(f => (
{f.title} {f.kind === 'waiver' && Waiver}

{f.visibility === 'members' ? 'Members-only (filled from the in-app Forms page)' : `/f/${spaceSlug}/${f.slug}`}

{VIS_LABEL[f.visibility] ?? f.visibility} {f.status}
{f.visibility !== 'members' && f.status === 'published' && ( )}
))}
)}
) }