import type { Dispatch, FormEvent, SetStateAction } from 'react'; import { Ticket } from '@/lib/api'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { BottomSheet } from '@/components/admin/MobileComponents'; import clsx from 'clsx'; import { CheckCircleIcon, EnvelopeIcon, PlusIcon, StarIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import type { AttendeeStatusFilter, AttendeeFormState, AddAtDoorFormState } from '../_types'; interface EventModalsProps { // counts + filter ticketsCount: number; pendingCount: number; confirmedCount: number; checkedInCount: number; cancelledCount: number; onHoldCount: number; statusFilter: AttendeeStatusFilter; setStatusFilter: (value: AttendeeStatusFilter) => void; // mobile filter sheet mobileFilterOpen: boolean; setMobileFilterOpen: (value: boolean) => void; // add ticket sheet showAddTicketSheet: boolean; setShowAddTicketSheet: (value: boolean) => void; // export sheets showExportSheet: boolean; setShowExportSheet: (value: boolean) => void; handleExportAttendees: (status: 'confirmed' | 'checked_in' | 'confirmed_pending' | 'all') => void; showTicketExportSheet: boolean; setShowTicketExportSheet: (value: boolean) => void; handleExportTickets: (status: 'confirmed' | 'checked_in' | 'all') => void; // add at door showAddAtDoorModal: boolean; setShowAddAtDoorModal: (value: boolean) => void; addAtDoorForm: AddAtDoorFormState; setAddAtDoorForm: Dispatch>; handleAddAtDoor: (e: FormEvent) => void; // manual ticket showManualTicketModal: boolean; setShowManualTicketModal: (value: boolean) => void; manualTicketForm: AttendeeFormState; setManualTicketForm: Dispatch>; handleManualTicket: (e: FormEvent) => void; // invite guest showInviteGuestModal: boolean; setShowInviteGuestModal: (value: boolean) => void; inviteGuestForm: AttendeeFormState; setInviteGuestForm: Dispatch>; handleInviteGuest: (e: FormEvent) => void; // shared submit flag submitting: boolean; // note modal showNoteModal: boolean; setShowNoteModal: (value: boolean) => void; selectedTicket: Ticket | null; setSelectedTicket: (value: Ticket | null) => void; noteText: string; setNoteText: (value: string) => void; handleSaveNote: () => void; // preview modal previewHtml: string | null; setPreviewHtml: (value: string | null) => void; } export function EventModals(props: EventModalsProps) { const { ticketsCount, pendingCount, confirmedCount, checkedInCount, cancelledCount, onHoldCount, statusFilter, setStatusFilter, mobileFilterOpen, setMobileFilterOpen, showAddTicketSheet, setShowAddTicketSheet, showExportSheet, setShowExportSheet, handleExportAttendees, showTicketExportSheet, setShowTicketExportSheet, handleExportTickets, showAddAtDoorModal, setShowAddAtDoorModal, addAtDoorForm, setAddAtDoorForm, handleAddAtDoor, showManualTicketModal, setShowManualTicketModal, manualTicketForm, setManualTicketForm, handleManualTicket, showInviteGuestModal, setShowInviteGuestModal, inviteGuestForm, setInviteGuestForm, handleInviteGuest, submitting, showNoteModal, setShowNoteModal, selectedTicket, setSelectedTicket, noteText, setNoteText, handleSaveNote, previewHtml, setPreviewHtml, } = props; return ( <> {/* Mobile filter bottom sheet */} setMobileFilterOpen(false)} title="Filter by Status" >
{[ { value: 'all', label: `All (${ticketsCount})` }, { value: 'pending', label: `Pending (${pendingCount})` }, { value: 'confirmed', label: `Confirmed (${confirmedCount})` }, { value: 'checked_in', label: `Checked In (${checkedInCount})` }, { value: 'cancelled', label: `Cancelled (${cancelledCount})` }, { value: 'on_hold', label: `On Hold (${onHoldCount})` }, ].map((option) => ( ))}
{/* Mobile FAB bottom sheet */} setShowAddTicketSheet(false)} title="Add Ticket" >
{/* Mobile export bottom sheet (attendees) */} setShowExportSheet(false)} title="Export Attendees" >
{[ { status: 'all' as const, label: 'Export All' }, { status: 'confirmed' as const, label: 'Export Confirmed' }, { status: 'checked_in' as const, label: 'Export Checked-in' }, { status: 'confirmed_pending' as const, label: 'Confirmed & Pending' }, ].map((opt) => ( ))}

Format: CSV

{/* Mobile export bottom sheet (tickets) */} setShowTicketExportSheet(false)} title="Export Tickets" >
{[ { status: 'all' as const, label: 'Export All' }, { status: 'confirmed' as const, label: 'Export Valid' }, { status: 'checked_in' as const, label: 'Export Checked-in' }, ].map((opt) => ( ))}

Format: CSV

{/* Add at Door Modal */} {showAddAtDoorModal && (
setShowAddAtDoorModal(false)} role="presentation" > e.stopPropagation()} >

Add Attendee at Door

setAddAtDoorForm({ ...addAtDoorForm, firstName: e.target.value })} className="w-full px-3 py-2.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" placeholder="First name" />
setAddAtDoorForm({ ...addAtDoorForm, lastName: e.target.value })} className="w-full px-3 py-2.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" placeholder="Last name" />
setAddAtDoorForm({ ...addAtDoorForm, email: e.target.value })} className="w-full px-3 py-2.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" placeholder="email@example.com" />
setAddAtDoorForm({ ...addAtDoorForm, phone: e.target.value })} className="w-full px-3 py-2.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" placeholder="+595 981 123456" />