import { Ticket } from '@/lib/api'; import { parseDate, EVENT_TIMEZONE } from '@/lib/utils'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { Dropdown, DropdownItem, MoreMenu } from '@/components/admin/MobileComponents'; import { MagnifyingGlassIcon, ChevronDownIcon, ArrowDownTrayIcon, ArrowUturnLeftIcon, } from '@heroicons/react/24/outline'; import type { TicketStatusFilter } from '../_types'; interface TicketsTabProps { locale: string; confirmedTickets: Ticket[]; filteredConfirmedTickets: Ticket[]; ticketSearchQuery: string; setTicketSearchQuery: (value: string) => void; ticketStatusFilter: TicketStatusFilter; setTicketStatusFilter: (value: TicketStatusFilter) => void; confirmedCount: number; checkedInCount: number; exporting: boolean; showTicketExportDropdown: boolean; setShowTicketExportDropdown: (value: boolean) => void; handleExportTickets: (status: 'confirmed' | 'checked_in' | 'all') => void; handleCheckin: (ticketId: string) => void; handleRemoveCheckin: (ticketId: string) => void; setShowTicketExportSheet: (value: boolean) => void; } export function TicketsTab({ locale, confirmedTickets, filteredConfirmedTickets, ticketSearchQuery, setTicketSearchQuery, ticketStatusFilter, setTicketStatusFilter, confirmedCount, checkedInCount, exporting, showTicketExportDropdown, setShowTicketExportDropdown, handleExportTickets, handleCheckin, handleRemoveCheckin, setShowTicketExportSheet, }: TicketsTabProps) { return (
{/* Desktop toolbar */}
setTicketSearchQuery(e.target.value)} className="w-full pl-9 pr-3 py-1.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" />
Export } > handleExportTickets('all')}>Export All handleExportTickets('confirmed')}>Export Valid handleExportTickets('checked_in')}>Export Checked-in
Format: CSV
{(ticketSearchQuery || ticketStatusFilter !== 'all') && (
Showing {filteredConfirmedTickets.length} of {confirmedTickets.length}
)} {/* Mobile toolbar */}
setTicketSearchQuery(e.target.value)} className="w-full pl-9 pr-3 py-2.5 text-sm rounded-btn border border-secondary-light-gray focus:outline-none focus:ring-2 focus:ring-primary-yellow" />
{/* Desktop: Dense table */}
{filteredConfirmedTickets.length === 0 ? ( ) : ( filteredConfirmedTickets.map((ticket) => ( )) )}
Attendee Status Check-in Actions
{confirmedTickets.length === 0 ? 'No confirmed tickets yet' : 'No tickets match the current filters'}

{ticket.attendeeFirstName} {ticket.attendeeLastName || ''}

{ticket.bookingId && ( Group booking )}
{ticket.status === 'confirmed' ? ( Valid ) : ( Checked In )} {ticket.checkinAt ? ( parseDate(ticket.checkinAt).toLocaleString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', timeZone: EVENT_TIMEZONE, }) ) : ( )}
{ticket.status === 'confirmed' && ( )} {ticket.status === 'checked_in' && ( )}
ID: {ticket.id.slice(0, 8)}...
{ticket.bookingId && (
Booking: {ticket.bookingId.slice(0, 8)}...
)}
{/* Mobile: Card layout */}
{filteredConfirmedTickets.length === 0 ? (
{confirmedTickets.length === 0 ? 'No confirmed tickets yet' : 'No tickets match the current filters'}
) : ( filteredConfirmedTickets.map((ticket) => (

{ticket.attendeeFirstName} {ticket.attendeeLastName || ''}

{ticket.bookingId &&

Group booking

}
{ticket.status === 'confirmed' ? ( Valid ) : ( Checked In )}

{ticket.checkinAt ? `Checked in ${parseDate(ticket.checkinAt).toLocaleString(locale === 'es' ? 'es-ES' : 'en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', timeZone: EVENT_TIMEZONE })}` : 'Not checked in'}

{ticket.status === 'confirmed' && ( )} {ticket.status === 'checked_in' && ( )}
)) )}
); }