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 || ''}
)}
{/* Preview Modal */}
{previewHtml && (
Email Preview
)}
>
);
}