import _maxBy from 'lodash/maxBy'
import React from 'react'
import { Text, View } from 'react-native'
import { Dropdown } from '../../../components'
import { IDropdownItem } from '../../../components/dropdown/types'
import { priceWithCurrency } from '../../../helpers/StringsHelper'
import { CartListItemStyles as s } from './styles'
import { ITicketListItemProps } from './types'
const TicketListItem = ({
ticket,
ticketNumber,
onSelectTicketItem,
selectedTicket,
styles,
texts,
}: ITicketListItemProps) => {
const soldOutText = texts?.soldOut || 'SOLD OUT'
const salesNotStartedText = texts?.salesNotStarted || 'Sales not started'
const salesEnded = texts?.salesEnded || 'Sales ended'
const feesIncludedText = texts?.inclFees || '(incl. Fees)'
const feesExcludedText = texts?.exclFees || '(excl. Fees)'
const freeText = texts?.free || 'Free'
const ticketText = texts?.ticket || 'Ticket'
const isSoldOut = ticket.sold_out || !ticket.displayTicket || ticket.soldOut
const isSalesClosed = !ticket.salesStarted || ticket.salesEnded
const customSoldOutMessage = texts?.soldOut || 'SOLD OUT'
const soldOutMessage = ticket.soldOutMessage
? `${ticket.soldOutMessage}`.toUpperCase()
: customSoldOutMessage
const ticketsClosedMessage = !ticket.salesStarted ? salesNotStartedText : salesEnded
const getSelectOptions = (
maxCount: number = 10,
minCount: number = 1,
multiplier: number = 1
) => {
const options = [{ label: '0', value: 0 }]
for (let i = minCount; i <= Math.min(50, maxCount); i += multiplier) {
options.push({ label: i.toString(), value: i })
}
return options
}
const dropdownOptions = getSelectOptions(
ticket.maxQuantity,
ticket.minQuantity,
ticket.multiplier
)
const handleOnSelectItem = (item: IDropdownItem) => {
onSelectTicketItem({ ...ticket, selectedOption: item })
}
const selectedOption: IDropdownItem =
selectedTicket && ticket.id === selectedTicket.id && selectedTicket.selectedOption
? selectedTicket.selectedOption
: { label: '0', value: 0 }
const feesIncluded = ticket.feeIncluded ? feesIncludedText : feesExcludedText
const showOldPrice = ticket.price !== ticket.oldPrice
const isTicketFree = +ticket.price === 0
const ticketPrice = isSoldOut
? soldOutText
: isTicketFree
? freeText
: priceWithCurrency(ticket.price.toFixed(2).toString(), ticket.priceSymbol)
const maximumOption = _maxBy(dropdownOptions, (o) => o.value)?.value
let rightContent = <>>
if (ticket.soldOut || ticket.sold_out || !ticket.displayTicket) {
rightContent = {soldOutMessage}
}
if (ticket.displayTicket) {
rightContent = isSalesClosed ? (
{ticketsClosedMessage}
) : maximumOption && maximumOption > 0 ? (
) : (
<>>
)
}
return (
{ticket.displayName.toUpperCase() || `${ticketText} ${ticketNumber}`}
{isSoldOut ? (
{soldOutMessage}
) : (
<>
{showOldPrice && (
{priceWithCurrency(ticket.oldPrice?.toString(), ticket.priceSymbol)}
)}
{ticketPrice}
{feesIncluded.toUpperCase()}
>
)}
{!isSalesClosed && !isSoldOut && (
{rightContent}
)}
)
}
export default TicketListItem