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 { BanknotesIcon, CheckCircleIcon, EnvelopeIcon, StarIcon, XMarkIcon, } from '@heroicons/react/24/outline'; import type { AttendeeStatusFilter, AddTicketType } 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; openAddTicket: (type: AddTicketType) => 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; // 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, openAddTicket, showExportSheet, setShowExportSheet, handleExportAttendees, showTicketExportSheet, setShowTicketExportSheet, handleExportTickets, 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

{/* Note Modal */} {showNoteModal && selectedTicket && (

Admin Note

{selectedTicket.attendeeFirstName} {selectedTicket.attendeeLastName || ''}