import CircularProgress from '@mui/material/CircularProgress' import Paper from '@mui/material/Paper' import Table from '@mui/material/Table' import TableBody from '@mui/material/TableBody' import TableCell from '@mui/material/TableCell' import TableContainer from '@mui/material/TableContainer' import TableHead from '@mui/material/TableHead' import TableRow from '@mui/material/TableRow' import _identity from 'lodash/identity' import _isEmpty from 'lodash/isEmpty' import _map from 'lodash/map' import React, { Fragment, useState } from 'react' import { downloadPDF } from '../../utils' import SnackbarAlert from '../common/SnackbarAlert' import { CustomFieldTypes } from './index' import { TicketHolderCustomFields } from './TicketHolderCustomFields' interface IAddOnTypes { name: string; groupName: string; status: string; } export interface ITicketTypes { add_ons?: IAddOnTypes[]; hash: string; ticket_type: string; holder_name: string; status: string; pdf_link: string; is_sellable: boolean; is_on_sale?: boolean; event_name: string; currency: string; ticket_type_hash: string; ticket_type_is_active?: boolean; canSellTicket?: boolean; retain_amount_on_sale: number | string; ticketsTitle: string; } export interface IActionColumns { download?: boolean; sell_ticket?: boolean; } interface TicketsTableTypes { canSellTicket?: boolean; tickets: ITicketTypes[]; columns: Array<{ id?: string | number; key: keyof ITicketTypes & keyof IActionColumns; label: string | number | null | undefined; }>; handleSellTicket: (ticket: ITicketTypes) => void; handleRemoveFromResale: (ticket: ITicketTypes) => void; handleTicketHoldersUpdate: (values: Record, ticketHash: string) => void; icon?: string; displayColumnNameInRow?: boolean; ticketsTitle?: string; ticketHoldersCustomFields?: Array; } type PdfDownload = { hash: string; loading: boolean; } const TicketsTable = ({ tickets = [], columns = [], icon = '', displayColumnNameInRow = false, canSellTicket = true, ticketsTitle = 'Your Tickets', ticketHoldersCustomFields = [], handleSellTicket = _identity, handleRemoveFromResale = _identity, handleTicketHoldersUpdate = _identity, }: TicketsTableTypes) => { const [pdfError, setPdfError] = useState(null) const [pdfDownload, setPdfDownload] = useState({ hash: '', loading: false, }) const getRow = (ticket: ITicketTypes) => _map(columns, (column, columnIndex) => { if (column.key === 'download') { const ticketIsDownloading = pdfDownload.loading && pdfDownload.hash === ticket.hash if (!ticket.pdf_link || ticket.status === 'Sold' || ticket.is_on_sale) return {null} return ( {Boolean(icon) && nodata} { if (ticketIsDownloading) { return } setPdfDownload({ hash: ticket.hash, loading: true }) try { const pdfDownloadError = await downloadPDF(ticket.pdf_link) if (pdfDownloadError) { setPdfError(pdfDownloadError?.message) } } catch (err) { if (err && typeof err === 'string') { setPdfError(err) } } finally { setPdfDownload({ hash: '', loading: false }) } }} > {ticketIsDownloading ? : 'Download'} ) } if (column.key === 'sell_ticket') { return ( {ticket.is_sellable && canSellTicket && ( handleSellTicket(ticket)} > Sell Ticket )} {ticket.is_on_sale && ( handleRemoveFromResale(ticket)} > Remove from Resale )} ) } return displayColumnNameInRow ? (
{column.label} {ticket[column.key]}
) : (
{ticket[column.key]}
) }) return (
setPdfError(null)} />

{ticketsTitle}

{displayColumnNameInRow ? null : ( {_map(columns, item => ( {item.label || ''} ))} )} {tickets.map((ticket: ITicketTypes, index: number) => { const holderCustomFields = ticketHoldersCustomFields.filter( (field: CustomFieldTypes) => field?.ticketHash === ticket?.hash ) return ( {getRow(ticket)} {!_isEmpty(holderCustomFields) && ( )} {!!ticket.add_ons?.length && (
Add-On Status {ticket.add_ons.map((add_on: IAddOnTypes, index: number) => ( {add_on.groupName && `${add_on.groupName}: `}{' '} {add_on.name} {add_on.status} ))}
)} ) })}
) } export default TicketsTable