tf-checkout-react 1.0.102 → 1.0.105

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/components/common/RedirectModal.d.ts +7 -0
  2. package/dist/components/ticketsContainer/TicketsSection.d.ts +2 -1
  3. package/dist/components/ticketsContainer/index.d.ts +2 -1
  4. package/dist/images/done.svg +3 -3
  5. package/dist/index.d.ts +1 -0
  6. package/dist/tf-checkout-react.cjs.development.js +71 -25
  7. package/dist/tf-checkout-react.cjs.development.js.map +1 -1
  8. package/dist/tf-checkout-react.cjs.production.min.js +1 -1
  9. package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
  10. package/dist/tf-checkout-react.esm.js +71 -26
  11. package/dist/tf-checkout-react.esm.js.map +1 -1
  12. package/package.json +89 -89
  13. package/src/.d.ts +2 -2
  14. package/src/api/index.ts +293 -278
  15. package/src/assets/images/done.svg +3 -3
  16. package/src/components/billing-info-container/index.tsx +796 -796
  17. package/src/components/billing-info-container/style.css +105 -105
  18. package/src/components/billing-info-container/utils.ts +224 -224
  19. package/src/components/common/CheckboxField.tsx +41 -41
  20. package/src/components/common/CustomField.tsx +84 -84
  21. package/src/components/common/FormikPhoneNumberField.tsx +51 -51
  22. package/src/components/common/Loader.tsx +9 -9
  23. package/src/components/common/RadioField.tsx +35 -35
  24. package/src/components/common/RedirectModal.tsx +43 -0
  25. package/src/components/common/SelectField.tsx +80 -80
  26. package/src/components/common/SnackbarAlert.tsx +53 -53
  27. package/src/components/common/index.tsx +4 -4
  28. package/src/components/confirmModal/index.tsx +51 -51
  29. package/src/components/confirmModal/style.css +21 -21
  30. package/src/components/confirmationContainer/config.ts +72 -72
  31. package/src/components/confirmationContainer/index.tsx +197 -197
  32. package/src/components/confirmationContainer/social-buttons.tsx +94 -94
  33. package/src/components/confirmationContainer/style.css +202 -202
  34. package/src/components/countdown/index.tsx +89 -89
  35. package/src/components/countdown/style.css +9 -9
  36. package/src/components/index.ts +7 -7
  37. package/src/components/loginModal/index.tsx +209 -209
  38. package/src/components/loginModal/style.css +71 -71
  39. package/src/components/myTicketsContainer/index.tsx +196 -196
  40. package/src/components/myTicketsContainer/row.tsx +41 -41
  41. package/src/components/myTicketsContainer/style.css +39 -39
  42. package/src/components/myTicketsContainer/tableConfig.tsx +34 -34
  43. package/src/components/orderDetailsContainer/index.tsx +249 -249
  44. package/src/components/orderDetailsContainer/style.css +72 -72
  45. package/src/components/orderDetailsContainer/ticketsTable.tsx +124 -124
  46. package/src/components/paymentContainer/index.tsx +284 -284
  47. package/src/components/registerModal/index.tsx +190 -190
  48. package/src/components/stripePayment/index.tsx +253 -253
  49. package/src/components/stripePayment/style.css +59 -59
  50. package/src/components/ticketResale/index.tsx +56 -56
  51. package/src/components/ticketResaleModal/index.tsx +210 -210
  52. package/src/components/ticketResaleModal/style.css +28 -28
  53. package/src/components/ticketsContainer/PromoCodeSection.tsx +99 -99
  54. package/src/components/ticketsContainer/ReferralLogic.tsx +33 -33
  55. package/src/components/ticketsContainer/TicketRow.tsx +83 -83
  56. package/src/components/ticketsContainer/TicketsSection.tsx +85 -81
  57. package/src/components/ticketsContainer/index.tsx +430 -430
  58. package/src/components/ticketsContainer/style.css +181 -181
  59. package/src/components/ticketsContainer/utils.ts +11 -11
  60. package/src/components/timerWidget/index.tsx +70 -70
  61. package/src/components/timerWidget/style.css +26 -26
  62. package/src/components/waitingList/index.tsx +178 -178
  63. package/src/components/waitingList/style.css +26 -26
  64. package/src/env.ts +20 -20
  65. package/src/index.ts +14 -13
  66. package/src/normalizers/index.ts +45 -45
  67. package/src/types/billing-info-data.ts +37 -37
  68. package/src/types/payment-field.ts +7 -7
  69. package/src/types/referral-promotion.ts +7 -7
  70. package/src/utils/createCheckoutDataBodyWithDefaultHolder.ts +59 -59
  71. package/src/utils/downloadPDF.tsx +30 -30
  72. package/src/utils/formikErrorFocus.ts +24 -24
  73. package/src/utils/getImage.ts +14 -14
  74. package/src/utils/getQueryVariable.ts +13 -13
  75. package/src/utils/index.ts +5 -5
  76. package/src/utils/setConfigs.ts +26 -26
  77. package/src/utils/showZero.tsx +10 -10
  78. package/src/validators/index.ts +20 -20
  79. package/src/.DS_Store +0 -0
  80. package/src/components/.DS_Store +0 -0
@@ -1,99 +1,99 @@
1
- import React from 'react'
2
- import Button from 'react-bootstrap/Button'
3
- import SVG from 'react-inlinesvg'
4
- import { getImage } from '../../utils/getImage'
5
- import { Loader } from '../common/index'
6
-
7
- export interface IPromoCodeSectionProps {
8
- promoCode: string;
9
- promoCodeIsApplied: boolean;
10
- showPromoInput: boolean;
11
- isPromotionsEnabled: boolean;
12
- isAllTicketsSoldOut: boolean;
13
- isAccessCodeEnabled?: boolean;
14
- isPromoLoading?: boolean;
15
- setPromoCode: (value: string) => void;
16
- setPromoCodeUpdated: (value: string) => void;
17
- setShowPromoInput: (value: boolean) => void;
18
- }
19
-
20
- export const PromoCodeSection = ({
21
- promoCode,
22
- promoCodeIsApplied,
23
- showPromoInput,
24
- isPromotionsEnabled,
25
- setPromoCode,
26
- setPromoCodeUpdated,
27
- setShowPromoInput,
28
- isAccessCodeEnabled,
29
- isPromoLoading,
30
- }: IPromoCodeSectionProps) => {
31
- const isPromoCodeHasValue = !!promoCode.trim()
32
-
33
- const renderInputField = () => {
34
- return (
35
- <div className="promo-code-block">
36
- <div className="promo-code-block">
37
- <p className="promo-code-text">
38
- { isAccessCodeEnabled ? 'Access code required' : 'Promo code'}
39
- </p>
40
-
41
- </div>
42
- <input
43
- className="promo-code-input"
44
- placeholder=""
45
- onChange={e => {
46
- setPromoCode(e.target.value)
47
- }}
48
- onKeyPress={event => {
49
- if (event.key === 'Enter' && isPromoCodeHasValue) {
50
- setPromoCodeUpdated(promoCode)
51
- setShowPromoInput(false)
52
- }
53
- }}
54
- />
55
- <Button
56
- className="promo-submit-button"
57
- onClick={() => {
58
- if (isPromoCodeHasValue) {
59
- setPromoCodeUpdated(promoCode)
60
- setShowPromoInput(false)
61
- }
62
- }}
63
- >
64
- {isAccessCodeEnabled ? 'ENTER' : 'APPLY'}
65
- </Button>
66
- </div>
67
- )
68
- }
69
-
70
- return isPromoLoading ? <Loader /> : (
71
- <div >
72
- {promoCodeIsApplied ? (
73
- <div className="alert-info">
74
- <SVG
75
- src={getImage('done.svg')}
76
- preProcessor={(code) => code.replace(/fill=".*?"/g, 'fill="currentColor"')}
77
- />
78
- <p className="promo-code-success">PROMO CODE APPLIED SUCCESSFULLY</p>
79
- </div>
80
- ) : null}
81
- {showPromoInput && (
82
- renderInputField()
83
- )}
84
- {isPromotionsEnabled && !showPromoInput && !isAccessCodeEnabled ? (
85
- <Button
86
- className="promo-code-button"
87
- placeholder="Promo Codes"
88
- onClick={() => {
89
- setShowPromoInput(true)
90
- }}
91
- >
92
- Got a promo code? Click here
93
- </Button>
94
- ) : !isPromotionsEnabled && !showPromoInput && isAccessCodeEnabled && !promoCodeIsApplied ? renderInputField() :
95
- null
96
- }
97
- </div>
98
- )
99
- }
1
+ import React from 'react'
2
+ import Button from 'react-bootstrap/Button'
3
+ import SVG from 'react-inlinesvg'
4
+ import { getImage } from '../../utils/getImage'
5
+ import { Loader } from '../common/index'
6
+
7
+ export interface IPromoCodeSectionProps {
8
+ promoCode: string;
9
+ promoCodeIsApplied: boolean;
10
+ showPromoInput: boolean;
11
+ isPromotionsEnabled: boolean;
12
+ isAllTicketsSoldOut: boolean;
13
+ isAccessCodeEnabled?: boolean;
14
+ isPromoLoading?: boolean;
15
+ setPromoCode: (value: string) => void;
16
+ setPromoCodeUpdated: (value: string) => void;
17
+ setShowPromoInput: (value: boolean) => void;
18
+ }
19
+
20
+ export const PromoCodeSection = ({
21
+ promoCode,
22
+ promoCodeIsApplied,
23
+ showPromoInput,
24
+ isPromotionsEnabled,
25
+ setPromoCode,
26
+ setPromoCodeUpdated,
27
+ setShowPromoInput,
28
+ isAccessCodeEnabled,
29
+ isPromoLoading,
30
+ }: IPromoCodeSectionProps) => {
31
+ const isPromoCodeHasValue = !!promoCode.trim()
32
+
33
+ const renderInputField = () => {
34
+ return (
35
+ <div className="promo-code-block">
36
+ <div className="promo-code-block">
37
+ <p className="promo-code-text">
38
+ { isAccessCodeEnabled ? 'Access code required' : 'Promo code'}
39
+ </p>
40
+
41
+ </div>
42
+ <input
43
+ className="promo-code-input"
44
+ placeholder=""
45
+ onChange={e => {
46
+ setPromoCode(e.target.value)
47
+ }}
48
+ onKeyPress={event => {
49
+ if (event.key === 'Enter' && isPromoCodeHasValue) {
50
+ setPromoCodeUpdated(promoCode)
51
+ setShowPromoInput(false)
52
+ }
53
+ }}
54
+ />
55
+ <Button
56
+ className="promo-submit-button"
57
+ onClick={() => {
58
+ if (isPromoCodeHasValue) {
59
+ setPromoCodeUpdated(promoCode)
60
+ setShowPromoInput(false)
61
+ }
62
+ }}
63
+ >
64
+ {isAccessCodeEnabled ? 'ENTER' : 'APPLY'}
65
+ </Button>
66
+ </div>
67
+ )
68
+ }
69
+
70
+ return isPromoLoading ? <Loader /> : (
71
+ <div >
72
+ {promoCodeIsApplied ? (
73
+ <div className="alert-info">
74
+ <SVG
75
+ src={getImage('done.svg')}
76
+ preProcessor={(code) => code.replace(/fill=".*?"/g, 'fill="currentColor"')}
77
+ />
78
+ <p className="promo-code-success">PROMO CODE APPLIED SUCCESSFULLY</p>
79
+ </div>
80
+ ) : null}
81
+ {showPromoInput && (
82
+ renderInputField()
83
+ )}
84
+ {isPromotionsEnabled && !showPromoInput && !isAccessCodeEnabled ? (
85
+ <Button
86
+ className="promo-code-button"
87
+ placeholder="Promo Codes"
88
+ onClick={() => {
89
+ setShowPromoInput(true)
90
+ }}
91
+ >
92
+ Got a promo code? Click here
93
+ </Button>
94
+ ) : !isPromotionsEnabled && !showPromoInput && isAccessCodeEnabled && !promoCodeIsApplied ? renderInputField() :
95
+ null
96
+ }
97
+ </div>
98
+ )
99
+ }
@@ -1,33 +1,33 @@
1
- import { useEffect } from 'react'
2
- import { postReferralVisits } from '../../api'
3
-
4
- interface IReferralLogicProps {
5
- eventId: string | number;
6
- }
7
-
8
- export const ReferralLogic = (props: IReferralLogicProps) => {
9
- const { eventId } = props
10
- const isWindowDefined = typeof window !== 'undefined'
11
-
12
- useEffect(() => {
13
- if (isWindowDefined) {
14
- const params: URLSearchParams = new URL(`${window.location}`).searchParams
15
- const referralId = params.get('ttf_r') || ''
16
- const isAlreadyCounted = !!localStorage.getItem('referral_key')
17
-
18
- if (referralId && eventId && !isAlreadyCounted) {
19
- (async () => {
20
- try {
21
- await postReferralVisits(`${eventId}`, referralId)
22
- localStorage.setItem(
23
- 'referral_key',
24
- [eventId, '.', referralId].join('')
25
- )
26
- } catch (error) {}
27
- })()
28
- }
29
- }
30
- }, [])
31
-
32
- return null
33
- }
1
+ import { useEffect } from 'react'
2
+ import { postReferralVisits } from '../../api'
3
+
4
+ interface IReferralLogicProps {
5
+ eventId: string | number;
6
+ }
7
+
8
+ export const ReferralLogic = (props: IReferralLogicProps) => {
9
+ const { eventId } = props
10
+ const isWindowDefined = typeof window !== 'undefined'
11
+
12
+ useEffect(() => {
13
+ if (isWindowDefined) {
14
+ const params: URLSearchParams = new URL(`${window.location}`).searchParams
15
+ const referralId = params.get('ttf_r') || ''
16
+ const isAlreadyCounted = !!localStorage.getItem('referral_key')
17
+
18
+ if (referralId && eventId && !isAlreadyCounted) {
19
+ (async () => {
20
+ try {
21
+ await postReferralVisits(`${eventId}`, referralId)
22
+ localStorage.setItem(
23
+ 'referral_key',
24
+ [eventId, '.', referralId].join('')
25
+ )
26
+ } catch (error) {}
27
+ })()
28
+ }
29
+ }
30
+ }, [])
31
+
32
+ return null
33
+ }
@@ -1,83 +1,83 @@
1
- import React from 'react'
2
- import './style.css'
3
- import _has from 'lodash/has'
4
- import _get from 'lodash/get'
5
- import Box from '@mui/material/Box'
6
- import FormControl from '@mui/material/FormControl'
7
- import MenuItem from '@mui/material/MenuItem'
8
- import Select from '@mui/material/Select'
9
-
10
- import { getTicketSelectOptions } from './utils'
11
-
12
- interface ITicketRowProps {
13
- ticketTier: any;
14
- prevTicketTier: any;
15
- selectedTickets: any;
16
- handleTicketSelect: any;
17
- }
18
-
19
- export const TicketRow = ({
20
- ticketTier,
21
- prevTicketTier,
22
- selectedTickets,
23
- handleTicketSelect,
24
- }: ITicketRowProps) => {
25
- const soldOutMessage = ticketTier.soldOutMessage
26
- ? `${ticketTier.soldOutMessage}`.toUpperCase()
27
- : 'SOLD OUT'
28
- const isSalesClosed = !ticketTier.salesStarted || ticketTier.salesEnded
29
- const options = getTicketSelectOptions(
30
- ticketTier.maxQuantity,
31
- ticketTier.minQuantity,
32
- ticketTier.multiplier
33
- )
34
- const ticketsClosedMessage = !ticketTier.salesStarted ? 'Sales not started' : 'Sales Ended'
35
-
36
- const onSaleContent = isSalesClosed ? ticketsClosedMessage : (
37
- <div className="get-tickets">
38
- <Box className="get-tickets__selectbox">
39
- <FormControl fullWidth>
40
- <Select
41
- sx={{
42
- borderRadius: 0,
43
- }}
44
- value={
45
- selectedTickets[ticketTier.id]
46
- ? selectedTickets[ticketTier.id]
47
- : 0
48
- }
49
- onChange={handleTicketSelect}
50
- displayEmpty
51
- inputProps={{ 'aria-label': 'Without label' }}
52
- MenuProps={{
53
- PaperProps: {
54
- sx: { maxHeight: 150 },
55
- className: 'get-tickets-paper',
56
- },
57
- }}
58
- >
59
- {options.map((option, index) => (
60
- <MenuItem key={index} value={option.value}>
61
- {option.value}
62
- </MenuItem>
63
- ))}
64
- </Select>
65
- </FormControl>
66
- </Box>
67
- </div>
68
- )
69
-
70
- let returnValue: any = ''
71
-
72
- if (ticketTier.sold_out || !ticketTier.displayTicket || ticketTier.soldOut) {
73
- returnValue = soldOutMessage
74
- }
75
- if (ticketTier.displayTicket) {
76
- returnValue = onSaleContent
77
- }
78
- if (_get(prevTicketTier, 'in_stock')) {
79
- returnValue = 'SOON'
80
- }
81
-
82
- return <>{returnValue} </>
83
- }
1
+ import React from 'react'
2
+ import './style.css'
3
+ import _has from 'lodash/has'
4
+ import _get from 'lodash/get'
5
+ import Box from '@mui/material/Box'
6
+ import FormControl from '@mui/material/FormControl'
7
+ import MenuItem from '@mui/material/MenuItem'
8
+ import Select from '@mui/material/Select'
9
+
10
+ import { getTicketSelectOptions } from './utils'
11
+
12
+ interface ITicketRowProps {
13
+ ticketTier: any;
14
+ prevTicketTier: any;
15
+ selectedTickets: any;
16
+ handleTicketSelect: any;
17
+ }
18
+
19
+ export const TicketRow = ({
20
+ ticketTier,
21
+ prevTicketTier,
22
+ selectedTickets,
23
+ handleTicketSelect,
24
+ }: ITicketRowProps) => {
25
+ const soldOutMessage = ticketTier.soldOutMessage
26
+ ? `${ticketTier.soldOutMessage}`.toUpperCase()
27
+ : 'SOLD OUT'
28
+ const isSalesClosed = !ticketTier.salesStarted || ticketTier.salesEnded
29
+ const options = getTicketSelectOptions(
30
+ ticketTier.maxQuantity,
31
+ ticketTier.minQuantity,
32
+ ticketTier.multiplier
33
+ )
34
+ const ticketsClosedMessage = !ticketTier.salesStarted ? 'Sales not started' : 'Sales Ended'
35
+
36
+ const onSaleContent = isSalesClosed ? ticketsClosedMessage : (
37
+ <div className="get-tickets">
38
+ <Box className="get-tickets__selectbox">
39
+ <FormControl fullWidth>
40
+ <Select
41
+ sx={{
42
+ borderRadius: 0,
43
+ }}
44
+ value={
45
+ selectedTickets[ticketTier.id]
46
+ ? selectedTickets[ticketTier.id]
47
+ : 0
48
+ }
49
+ onChange={handleTicketSelect}
50
+ displayEmpty
51
+ inputProps={{ 'aria-label': 'Without label' }}
52
+ MenuProps={{
53
+ PaperProps: {
54
+ sx: { maxHeight: 150 },
55
+ className: 'get-tickets-paper',
56
+ },
57
+ }}
58
+ >
59
+ {options.map((option, index) => (
60
+ <MenuItem key={index} value={option.value}>
61
+ {option.value}
62
+ </MenuItem>
63
+ ))}
64
+ </Select>
65
+ </FormControl>
66
+ </Box>
67
+ </div>
68
+ )
69
+
70
+ let returnValue: any = ''
71
+
72
+ if (ticketTier.sold_out || !ticketTier.displayTicket || ticketTier.soldOut) {
73
+ returnValue = soldOutMessage
74
+ }
75
+ if (ticketTier.displayTicket) {
76
+ returnValue = onSaleContent
77
+ }
78
+ if (_get(prevTicketTier, 'in_stock')) {
79
+ returnValue = 'SOON'
80
+ }
81
+
82
+ return <>{returnValue} </>
83
+ }
@@ -1,81 +1,85 @@
1
- import React from 'react'
2
- import './style.css'
3
-
4
- import _sortBy from 'lodash/sortBy'
5
- import { TicketRow } from './TicketRow'
6
-
7
- interface ITicketsSectionProps {
8
- ticketsList: any;
9
- selectedTickets: any;
10
- handleTicketSelect: any;
11
- promoCodeIsApplied: boolean;
12
- }
13
-
14
- export const TicketsSection = ({
15
- ticketsList,
16
- selectedTickets,
17
- handleTicketSelect,
18
- promoCodeIsApplied,
19
- }: ITicketsSectionProps) => {
20
- const sortedTicketsList = _sortBy(ticketsList, 'sortOrder')
21
- return (
22
- <>
23
- {sortedTicketsList.map((ticket, i, arr) => {
24
- const isSoldOut =
25
- ticket.sold_out || !ticket.displayTicket || ticket.soldOut
26
- const ticketSelect = (event: any) => {
27
- const { value } = event.target
28
- handleTicketSelect(ticket.id, value)
29
- }
30
-
31
- let ticketIsDiscounted = false
32
- if (
33
- ticket.oldPrice &&
34
- promoCodeIsApplied &&
35
- !isSoldOut &&
36
- ticket.oldPrice !== ticket.price
37
- ) {
38
- ticketIsDiscounted = true
39
- }
40
-
41
- const ticketIsFree = (+ticket.cost || +ticket.price) === 0
42
- const ticketPrice = isSoldOut ? 'SOLD OUT' : ticketIsFree ? 'FREE' : `$ ${(+ticket.cost || +ticket.price).toFixed(2)}`
43
-
44
- return (
45
- <div
46
- key={ticket.id || ticket.name}
47
- className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
48
- >
49
- <div className="event-detail__tier-name">
50
- {ticket.displayName || ticket.name}
51
- </div>
52
- <div className="event-tickets-container">
53
- <div className="event-detail__tier-price">
54
- {ticketIsDiscounted && (
55
- <p className="old-price">$ {(+ticket.oldPrice).toFixed(2)}</p>
56
- )}
57
- <p>{ticketPrice}</p>
58
- {!isSoldOut && !ticketIsFree && (
59
- <p className="fees">
60
- {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
61
- </p>
62
- )}
63
- </div>
64
- <div
65
- className="event-detail__tier-state"
66
- style={{ minWidth: 55 }}
67
- >
68
- <TicketRow
69
- ticketTier={ticket}
70
- prevTicketTier={arr[i - 1]}
71
- selectedTickets={selectedTickets}
72
- handleTicketSelect={ticketSelect}
73
- />
74
- </div>
75
- </div>
76
- </div>
77
- )
78
- })}
79
- </>
80
- )
81
- }
1
+ import React from 'react'
2
+ import './style.css'
3
+
4
+ import _sortBy from 'lodash/sortBy'
5
+ import { TicketRow } from './TicketRow'
6
+
7
+ interface ITicketsSectionProps {
8
+ ticketsList: any;
9
+ selectedTickets: any;
10
+ handleTicketSelect: any;
11
+ promoCodeIsApplied: boolean;
12
+ sortBySoldOut: boolean;
13
+ }
14
+
15
+ export const TicketsSection = ({
16
+ ticketsList,
17
+ selectedTickets,
18
+ handleTicketSelect,
19
+ promoCodeIsApplied,
20
+ sortBySoldOut,
21
+ }: ITicketsSectionProps) => {
22
+ const sortedTicketsList = sortBySoldOut
23
+ ? _sortBy(_sortBy(ticketsList, 'sortOrder'), 'soldOut')
24
+ : _sortBy(ticketsList, 'sortOrder')
25
+ return (
26
+ <>
27
+ {sortedTicketsList.map((ticket, i, arr) => {
28
+ const isSoldOut =
29
+ ticket.sold_out || !ticket.displayTicket || ticket.soldOut
30
+ const ticketSelect = (event: any) => {
31
+ const { value } = event.target
32
+ handleTicketSelect(ticket.id, value)
33
+ }
34
+
35
+ let ticketIsDiscounted = false
36
+ if (
37
+ ticket.oldPrice &&
38
+ promoCodeIsApplied &&
39
+ !isSoldOut &&
40
+ ticket.oldPrice !== ticket.price
41
+ ) {
42
+ ticketIsDiscounted = true
43
+ }
44
+
45
+ const ticketIsFree = (+ticket.cost || +ticket.price) === 0
46
+ const ticketPrice = isSoldOut ? 'SOLD OUT' : ticketIsFree ? 'FREE' : `$ ${(+ticket.cost || +ticket.price).toFixed(2)}`
47
+
48
+ return (
49
+ <div
50
+ key={ticket.id || ticket.name}
51
+ className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
52
+ >
53
+ <div className="event-detail__tier-name">
54
+ {ticket.displayName || ticket.name}
55
+ </div>
56
+ <div className="event-tickets-container">
57
+ <div className="event-detail__tier-price">
58
+ {ticketIsDiscounted && (
59
+ <p className="old-price">$ {(+ticket.oldPrice).toFixed(2)}</p>
60
+ )}
61
+ <p>{ticketPrice}</p>
62
+ {!isSoldOut && !ticketIsFree && (
63
+ <p className="fees">
64
+ {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
65
+ </p>
66
+ )}
67
+ </div>
68
+ <div
69
+ className="event-detail__tier-state"
70
+ style={{ minWidth: 55 }}
71
+ >
72
+ <TicketRow
73
+ ticketTier={ticket}
74
+ prevTicketTier={arr[i - 1]}
75
+ selectedTickets={selectedTickets}
76
+ handleTicketSelect={ticketSelect}
77
+ />
78
+ </div>
79
+ </div>
80
+ </div>
81
+ )
82
+ })}
83
+ </>
84
+ )
85
+ }