import { useState } from 'react'; import { Participant } from '@/types/calendar'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { UserPlus, Trash2, User, Pencil, Check, X, AlertCircle } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { getAvatarColor } from '@/lib/utils'; interface ParticipantManagerProps { participants: Participant[]; onAddParticipant: (participant: { name: string; email: string; timezone: string; icsLink: string }) => void; onRemoveParticipant: (id: string) => void; onUpdateParticipant?: (id: string, data: { timezone?: string; ics_url?: string }) => Promise; } export const ParticipantManager = ({ participants, onAddParticipant, onRemoveParticipant, onUpdateParticipant, }: ParticipantManagerProps) => { const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [icsLink, setIcsLink] = useState(''); // Edit state const [editingId, setEditingId] = useState(null); const [editIcsLink, setEditIcsLink] = useState(''); const [isUpdating, setIsUpdating] = useState(false); const { toast } = useToast(); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!name.trim() || !email.trim()) { toast({ title: "Missing fields", description: "Please fill in name and email", variant: "destructive", }); return; } onAddParticipant({ name: name.trim(), email: email.trim(), timezone: 'America/Toronto', icsLink: icsLink.trim() || '' }); setName(''); setEmail(''); setIcsLink(''); toast({ title: "Participant added", description: `${name} has been added successfully`, }); }; const startEditing = (participant: Participant) => { setEditingId(participant.id); setEditIcsLink(participant.icsLink || ''); }; const cancelEditing = () => { setEditingId(null); setEditIcsLink(''); }; const saveEditing = async (participantId: string) => { if (!onUpdateParticipant) return; setIsUpdating(true); try { await onUpdateParticipant(participantId, { ics_url: editIcsLink || undefined, }); toast({ title: "Participant updated", description: "Changes saved successfully", }); setEditingId(null); } catch (error) { toast({ title: "Update failed", description: error instanceof Error ? error.message : "Unknown error", variant: "destructive", }); } finally { setIsUpdating(false); } }; const getInitials = (name: string) => { return name .split(' ') .map((n) => n[0]) .join('') .toUpperCase() .slice(0, 2); }; return (
{/* Add Participant Form */}

Add Participant

setName(e.target.value)} className="bg-background" />
setEmail(e.target.value)} className="bg-background" />
setIcsLink(e.target.value)} className="bg-background" />
{/* Participants List */}

Participants ({participants.length})

{participants.length === 0 ? (

No participants yet. Add someone above to get started.

) : (
{participants.map((participant) => (
{editingId === participant.id ? ( // Edit mode
{getInitials(participant.name)}
{participant.name}
{participant.email}
setEditIcsLink(e.target.value)} placeholder="https://..." className="bg-card" />
) : ( // View mode
{getInitials(participant.name)}
{participant.name}
{participant.email} {participant.icsLink ? ( ICS linked ) : ( No calendar linked )}
{onUpdateParticipant && ( )}
)}
))}
)}
); };