'use client' import { useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { toast } from 'sonner' import { Plus, Trash2, Send, Loader2 } from 'lucide-react' interface InviteRow { name: string email: string } interface BulkInviteFormProps { onSubmit: (rows: InviteRow[]) => Promise isPending?: boolean submitLabel?: string } const emptyRow = (): InviteRow => ({ name: '', email: '' }) export function BulkInviteForm({ onSubmit, isPending = false, submitLabel = 'Send Invites', }: BulkInviteFormProps) { const [rows, setRows] = useState([emptyRow()]) const updateRow = (index: number, field: keyof InviteRow, value: string) => { setRows((prev) => prev.map((r, i) => (i === index ? { ...r, [field]: value } : r))) } const addRow = () => setRows((prev) => [...prev, emptyRow()]) const removeRow = (index: number) => { if (rows.length <= 1) return setRows((prev) => prev.filter((_, i) => i !== index)) } const validRows = rows.filter( (r) => r.email.trim() && r.email.includes('@') ) const handleSubmit = async () => { if (validRows.length === 0) { toast.error('Please enter at least one valid email address') return } const emails = validRows.map((r) => r.email.trim().toLowerCase()) const dupes = emails.filter((e, i) => emails.indexOf(e) !== i) if (dupes.length > 0) { toast.error(`Duplicate email: ${dupes[0]}`) return } await onSubmit(validRows.map((r) => ({ name: r.name.trim(), email: r.email.trim() }))) setRows([emptyRow()]) } return (
{rows.map((row, index) => (
{index === 0 && ( )} updateRow(index, 'name', e.target.value)} disabled={isPending} />
{index === 0 && ( )} updateRow(index, 'email', e.target.value)} disabled={isPending} />
))}
) }