tf-checkout-react 1.6.6-beta.3 → 1.6.6-beta.31

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 (110) hide show
  1. package/README.md +61 -40
  2. package/dist/adapters/customFields.d.ts +1 -0
  3. package/dist/api/checkout.d.ts +1 -0
  4. package/dist/api/common.d.ts +1 -0
  5. package/dist/api/index.d.ts +1 -0
  6. package/dist/api/preRegistrationComplete.d.ts +1 -1
  7. package/dist/components/addonsContainer/AddonComponent.d.ts +5 -1
  8. package/dist/components/addonsContainer/SimpleAddonsContainer.d.ts +17 -0
  9. package/dist/components/addonsContainer/index.d.ts +5 -1
  10. package/dist/components/billing-info-container/index.d.ts +8 -1
  11. package/dist/components/billing-info-container/utils.d.ts +25 -1
  12. package/dist/components/common/DatePickerField.d.ts +7 -1
  13. package/dist/components/countdown/index.d.ts +1 -1
  14. package/dist/components/forgotPasswordModal/index.d.ts +2 -1
  15. package/dist/components/myTicketsContainer/index.d.ts +3 -2
  16. package/dist/components/orderDetailsContainer/index.d.ts +7 -1
  17. package/dist/components/paymentContainer/OrderDetails.d.ts +8 -0
  18. package/dist/components/paymentContainer/handlePayment.d.ts +15 -0
  19. package/dist/components/paymentContainer/index.d.ts +10 -5
  20. package/dist/components/preRegistration/FieldsSection.d.ts +7 -1
  21. package/dist/components/preRegistration/PreRegistrationComplete.d.ts +6 -0
  22. package/dist/components/preRegistration/constants.d.ts +2 -2
  23. package/dist/components/preRegistration/index.d.ts +6 -0
  24. package/dist/components/resetPasswordContainer/index.d.ts +2 -2
  25. package/dist/components/stripePayment/index.d.ts +18 -3
  26. package/dist/components/ticketsContainer/InfoIcon.d.ts +5 -0
  27. package/dist/components/ticketsContainer/TicketsSection.d.ts +3 -2
  28. package/dist/components/ticketsContainer/TimeSlotsSection.d.ts +25 -0
  29. package/dist/components/ticketsContainer/index.d.ts +18 -5
  30. package/dist/components/timerWidget/index.d.ts +2 -1
  31. package/dist/constants/index.d.ts +5 -0
  32. package/dist/index.d.ts +4 -1
  33. package/dist/tf-checkout-react.cjs.development.js +5196 -3599
  34. package/dist/tf-checkout-react.cjs.development.js.map +1 -1
  35. package/dist/tf-checkout-react.cjs.production.min.js +1 -1
  36. package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
  37. package/dist/tf-checkout-react.esm.js +5199 -3605
  38. package/dist/tf-checkout-react.esm.js.map +1 -1
  39. package/dist/tf-checkout-styles.css +1 -1
  40. package/dist/types/add_on.d.ts +1 -0
  41. package/dist/types/checkoutPageConfigs.d.ts +1 -1
  42. package/dist/types/order-data.d.ts +2 -1
  43. package/dist/utils/auth.d.ts +8 -0
  44. package/dist/utils/customFields.d.ts +11 -0
  45. package/dist/utils/getDomain.d.ts +1 -1
  46. package/dist/utils/index.d.ts +1 -1
  47. package/dist/utils/setConfigs.d.ts +1 -0
  48. package/package.json +3 -2
  49. package/src/adapters/customFields.ts +7 -1
  50. package/src/api/auth.ts +2 -1
  51. package/src/api/checkout.ts +8 -4
  52. package/src/api/common.ts +49 -2
  53. package/src/api/interceptors.ts +7 -23
  54. package/src/api/preRegistrationComplete.ts +1 -1
  55. package/src/api/publicRequest.ts +10 -0
  56. package/src/components/addonsContainer/AddonComponent.tsx +71 -11
  57. package/src/components/addonsContainer/SimpleAddonsContainer.tsx +388 -0
  58. package/src/components/addonsContainer/index.tsx +189 -58
  59. package/src/components/billing-info-container/index.tsx +704 -390
  60. package/src/components/billing-info-container/{utils.ts → utils.tsx} +119 -0
  61. package/src/components/common/CheckboxField/index.tsx +1 -1
  62. package/src/components/common/DatePickerField.tsx +25 -10
  63. package/src/components/common/SnackbarAlert.tsx +32 -34
  64. package/src/components/confirmationContainer/index.tsx +1 -1
  65. package/src/components/countdown/index.tsx +22 -22
  66. package/src/components/delegationsContainer/IssueComponent.tsx +2 -1
  67. package/src/components/forgotPasswordModal/index.tsx +44 -13
  68. package/src/components/loginForm/index.tsx +1 -1
  69. package/src/components/loginModal/index.tsx +2 -2
  70. package/src/components/loginModal/style.css +3 -1
  71. package/src/components/myTicketsContainer/index.tsx +13 -9
  72. package/src/components/orderDetailsContainer/index.tsx +188 -173
  73. package/src/components/paymentContainer/OrderDetails.tsx +170 -0
  74. package/src/components/paymentContainer/handlePayment.ts +86 -0
  75. package/src/components/paymentContainer/index.tsx +253 -226
  76. package/src/components/paymentContainer/style.css +113 -0
  77. package/src/components/preRegistration/FieldsSection.tsx +8 -0
  78. package/src/components/preRegistration/PreRegistrationComplete.tsx +128 -118
  79. package/src/components/preRegistration/PreRegistrationInformations.tsx +21 -15
  80. package/src/components/preRegistration/constants.tsx +10 -4
  81. package/src/components/preRegistration/index.tsx +194 -174
  82. package/src/components/registerForm/constants.tsx +3 -1
  83. package/src/components/registerForm/index.tsx +3 -3
  84. package/src/components/resetPasswordContainer/index.tsx +12 -13
  85. package/src/components/seatMapContainer/TicketsSection.tsx +2 -2
  86. package/src/components/stripePayment/index.tsx +129 -24
  87. package/src/components/ticketsContainer/InfoIcon.tsx +35 -0
  88. package/src/components/ticketsContainer/PromoCodeSection.tsx +34 -28
  89. package/src/components/ticketsContainer/TicketRow.tsx +1 -1
  90. package/src/components/ticketsContainer/TicketsSection.tsx +178 -52
  91. package/src/components/ticketsContainer/TimeSlotsSection.tsx +120 -0
  92. package/src/components/ticketsContainer/index.tsx +209 -99
  93. package/src/components/timerWidget/index.tsx +15 -3
  94. package/src/constants/index.ts +2 -0
  95. package/src/hoc/CustomFields/index.tsx +9 -1
  96. package/src/index.ts +7 -2
  97. package/src/types/add_on.ts +1 -0
  98. package/src/types/api/common.d.ts +27 -0
  99. package/src/types/api/orders.d.ts +19 -3
  100. package/src/types/api/payment.d.ts +5 -2
  101. package/src/types/api/preRegistrationComplete.d.ts +2 -2
  102. package/src/types/checkoutPageConfigs.ts +1 -1
  103. package/src/types/order-data.ts +2 -1
  104. package/src/types/pre-registration-complete.d.ts +6 -1
  105. package/src/utils/auth.ts +32 -0
  106. package/src/utils/cookies.ts +42 -11
  107. package/src/utils/customFields.ts +22 -0
  108. package/src/utils/getDomain.ts +10 -4
  109. package/src/utils/index.ts +1 -1
  110. package/src/utils/setConfigs.ts +3 -1
@@ -1,10 +1,22 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import './style.css'
2
3
 
4
+ import _get from 'lodash/get'
3
5
  import _sortBy from 'lodash/sortBy'
4
- import React, { ReactNode } from 'react'
6
+ import React, { ReactNode, useState } from 'react'
7
+ import { Tooltip } from 'react-tooltip'
5
8
 
9
+ import { FEES_STYLES } from '../../constants'
10
+ import { CONFIGS } from '../../utils'
11
+ import InfoIcon from './InfoIcon'
6
12
  import { TicketRow } from './TicketRow'
7
13
 
14
+ function decodeHTML(html: string): string {
15
+ const textArea = document.createElement('textarea')
16
+ textArea.innerHTML = html
17
+ return textArea.value
18
+ }
19
+
8
20
  interface ITicketsSectionProps {
9
21
  event: any;
10
22
  ticketsList: any;
@@ -17,12 +29,13 @@ interface ITicketsSectionProps {
17
29
  ticketsHeaderComponent?: ReactNode;
18
30
  tableTicketsHeaderComponent?: ReactNode;
19
31
  showGroupNameBlock?: boolean;
20
- currencySybmol?: string;
32
+ currencySymbol?: string;
21
33
  isSeatMapAllowed?: boolean;
34
+ descriptionTrigger?: 'click' | 'hover';
22
35
  }
23
36
 
24
37
  export const TicketsSection = ({
25
- event = { currency: {} },
38
+ event,
26
39
  ticketsList,
27
40
  selectedTickets,
28
41
  handleTicketSelect,
@@ -32,26 +45,36 @@ export const TicketsSection = ({
32
45
  hideTicketsHeader,
33
46
  hideTableTicketsHeader,
34
47
  showGroupNameBlock,
35
- currencySybmol,
48
+ currencySymbol,
36
49
  isSeatMapAllowed,
37
50
  tableTickets,
51
+ descriptionTrigger = 'click',
38
52
  }: ITicketsSectionProps) => {
39
- const {
40
- currency: { symbol },
41
- } = event
53
+ const symbol = _get(event, 'currency.symbol')
42
54
  const sortedTicketsList = sortBySoldOut
43
55
  ? _sortBy(_sortBy(ticketsList, 'sortOrder'), 'soldOut')
44
56
  : _sortBy(ticketsList, 'sortOrder')
45
57
  const showGroup = !!sortedTicketsList.find(ticket => ticket.groupName)
46
- const priceSymbol = currencySybmol ? currencySybmol : symbol
58
+ const priceSymbol = currencySymbol || symbol
59
+
60
+ const [visibleDescription, setVisibleDescription] = useState<string | null>(null)
61
+
62
+ const handleDescriptionToggle = (ticketId: string) => {
63
+ setVisibleDescription(current => (current === ticketId ? null : ticketId))
64
+ }
65
+
47
66
  return (
48
67
  <>
49
68
  {!hideTicketsHeader && ticketsHeaderComponent}
50
69
  {sortedTicketsList.map((ticket, i, arr) => {
51
- const ticketPrice = `${priceSymbol} ${(+ticket.price).toFixed(2)}`
70
+ const ticketPriceWithoutFees = `${priceSymbol} ${(+ticket.cost).toFixed(2)}`
71
+ const ticketPriceWithFees = `${priceSymbol} ${(+ticket.price).toFixed(2)}`
52
72
  const ticketOldPrice = `${priceSymbol} ${(+ticket.oldPrice).toFixed(2)}`
53
73
 
54
- const isSoldOut = ticket.sold_out || !ticket.displayTicket || ticket.soldOut
74
+ const isSoldOut =
75
+ ticket.sold_out ||
76
+ !(ticket.displayTicket || ticket.slotGroupId) ||
77
+ ticket.soldOut
55
78
  const ticketSelect = (event: any) => {
56
79
  const { value } = event.target
57
80
  handleTicketSelect(ticket.id, value)
@@ -67,7 +90,9 @@ export const TicketsSection = ({
67
90
  ? 'SOLD OUT'
68
91
  : ticketIsFree
69
92
  ? 'FREE'
70
- : ticketPrice
93
+ : CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH
94
+ ? ticketPriceWithoutFees
95
+ : ticketPriceWithFees
71
96
  const isNewGroupTicket = ticket?.groupName !== arr[i - 1]?.groupName
72
97
 
73
98
  return (
@@ -77,9 +102,48 @@ export const TicketsSection = ({
77
102
  {ticket.groupName || ''}
78
103
  </div>
79
104
  ) : null}
80
- <div className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}>
105
+ <div
106
+ className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
107
+ id={ticket.id || ticket.name}
108
+ >
81
109
  <div className="event-detail__tier-name">
82
110
  {ticket.displayName || ticket.name}
111
+ {ticket.descriptionRich && (
112
+ <>
113
+ <span
114
+ aria-hidden
115
+ className="info-icon"
116
+ onClick={
117
+ descriptionTrigger === 'click'
118
+ ? () => handleDescriptionToggle(ticket.id)
119
+ : undefined
120
+ }
121
+ onMouseEnter={
122
+ descriptionTrigger === 'hover'
123
+ ? () => setVisibleDescription(ticket.id)
124
+ : undefined
125
+ }
126
+ onMouseLeave={
127
+ descriptionTrigger === 'hover'
128
+ ? () => setVisibleDescription(null)
129
+ : undefined
130
+ }
131
+ data-tooltip-id={`tooltip-${ticket.id}`}
132
+ data-tooltip-content="View ticket info"
133
+ style={{
134
+ marginLeft: 8,
135
+ cursor: 'pointer',
136
+ display: 'flex',
137
+ }}
138
+ >
139
+ <InfoIcon />
140
+ </span>
141
+
142
+ <Tooltip id={`tooltip-${ticket.id}`} place="top">
143
+ {ticket.description || 'No description available'}
144
+ </Tooltip>
145
+ </>
146
+ )}
83
147
  </div>
84
148
  <div className="event-tickets-container">
85
149
  <div className="event-detail__tier-price">
@@ -87,7 +151,10 @@ export const TicketsSection = ({
87
151
  <p className={isSoldOut ? 'sold-out' : ''}>{ticketPriceElem}</p>
88
152
  {!isSoldOut && !ticketIsFree && (
89
153
  <p className="fees">
90
- {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
154
+ {CONFIGS.FEES_STYLE === FEES_STYLES.TRADITIONAL &&
155
+ (ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)')}
156
+ {CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH &&
157
+ `(${ticketPriceWithFees} with fees)`}
91
158
  </p>
92
159
  )}
93
160
  </div>
@@ -101,16 +168,29 @@ export const TicketsSection = ({
101
168
  />
102
169
  </div>
103
170
  </div>
171
+ {visibleDescription === ticket.id && (
172
+ <div className="ticket-description">
173
+ <div
174
+ dangerouslySetInnerHTML={{
175
+ __html: decodeHTML(ticket.descriptionRich),
176
+ }}
177
+ />
178
+ </div>
179
+ )}
104
180
  </div>
105
181
  </React.Fragment>
106
182
  )
107
183
  })}
108
184
  {!hideTableTicketsHeader && tableTicketsHeaderComponent}
109
185
  {tableTickets.map((ticket: any, i: any, arr: any) => {
110
- const ticketPrice = `${priceSymbol} ${(+ticket.price).toFixed(2)}`
186
+ const ticketPriceWithoutFees = `${priceSymbol} ${(+ticket.cost).toFixed(2)}`
187
+ const ticketPriceWithFees = `${priceSymbol} ${(+ticket.price).toFixed(2)}`
111
188
  const ticketOldPrice = `${priceSymbol} ${(+ticket.oldPrice).toFixed(2)}`
112
189
 
113
- const isSoldOut = ticket.sold_out || !ticket.displayTicket || ticket.soldOut
190
+ const isSoldOut =
191
+ ticket.sold_out ||
192
+ !(ticket.displayTicket || ticket.slotGroupId) ||
193
+ ticket.soldOut
114
194
  const ticketSelect = (event: any) => {
115
195
  const { value } = event.target
116
196
  handleTicketSelect(ticket.id, value, true)
@@ -126,49 +206,95 @@ export const TicketsSection = ({
126
206
  ? 'SOLD OUT'
127
207
  : ticketIsFree
128
208
  ? 'FREE'
129
- : ticketPrice
209
+ : CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH
210
+ ? ticketPriceWithoutFees
211
+ : ticketPriceWithFees
130
212
  const isNewGroupTicket = ticket?.groupName !== arr[i - 1]?.groupName
131
213
 
132
214
  return (
133
- <>
134
- <React.Fragment key={ticket.id || ticket.name}>
135
- {showGroupNameBlock && showGroup && isNewGroupTicket ? (
136
- <div className="event-detail__tier group-title">
137
- {ticket.groupName || ''}
138
- </div>
139
- ) : null}
140
- <div className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}>
141
- <div className="event-detail__tier-name">
142
- {ticket.displayName || ticket.name}
215
+ <React.Fragment key={ticket.id || ticket.name}>
216
+ {showGroupNameBlock && showGroup && isNewGroupTicket ? (
217
+ <div className="event-detail__tier group-title">
218
+ {ticket.groupName || ''}
219
+ </div>
220
+ ) : null}
221
+ <div
222
+ className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
223
+ id={ticket.id || ticket.name}
224
+ >
225
+ <div className="event-detail__tier-name">
226
+ {ticket.displayName || ticket.name}
227
+ {ticket.descriptionRich && (
228
+ <>
229
+ <span
230
+ aria-hidden
231
+ className="info-icon"
232
+ onClick={
233
+ descriptionTrigger === 'click'
234
+ ? () => handleDescriptionToggle(ticket.id)
235
+ : undefined
236
+ }
237
+ onMouseEnter={
238
+ descriptionTrigger === 'hover'
239
+ ? () => setVisibleDescription(ticket.id)
240
+ : undefined
241
+ }
242
+ onMouseLeave={
243
+ descriptionTrigger === 'hover'
244
+ ? () => setVisibleDescription(null)
245
+ : undefined
246
+ }
247
+ style={{ marginLeft: 8, cursor: 'pointer', display: 'flex' }}
248
+ data-tooltip-id={`tooltip-${ticket.id}`}
249
+ data-tooltip-content="View ticket info"
250
+ >
251
+ <InfoIcon />
252
+ </span>
253
+ <Tooltip id={`tooltip-${ticket.id}`} place="top">
254
+ {ticket.description || 'No description available'}
255
+ </Tooltip>
256
+ </>
257
+ )}
258
+ </div>
259
+ <div className="event-tickets-container">
260
+ <div className="event-detail__tier-price">
261
+ {ticketIsDiscounted && <p className="old-price">{ticketOldPrice}</p>}
262
+ <p className={isSoldOut ? 'sold-out' : ''}>{ticketPriceElem}</p>
263
+ {!isSoldOut && !ticketIsFree && (
264
+ <p className="fees">
265
+ {CONFIGS.FEES_STYLE === FEES_STYLES.TRADITIONAL &&
266
+ (ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)')}
267
+ {CONFIGS.FEES_STYLE === FEES_STYLES.DISPLAY_BOTH &&
268
+ `(${ticketPriceWithFees} with fees)`}
269
+ </p>
270
+ )}
271
+ {ticket.depositPercent && (
272
+ <p className="deposits">{ticket.depositPercent + '% DEPOSIT'}</p>
273
+ )}
143
274
  </div>
144
- <div className="event-tickets-container">
145
- <div className="event-detail__tier-price">
146
- {ticketIsDiscounted && <p className="old-price">{ticketOldPrice}</p>}
147
- <p className={isSoldOut ? 'sold-out' : ''}>{ticketPriceElem}</p>
148
- {!isSoldOut && !ticketIsFree && (
149
- <p className="fees">
150
- {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
151
- </p>
152
- )}
153
- {ticket.depositPercent && (
154
- <p className="deposits">{ticket.depositPercent + '% DEPOSIT'}</p>
155
- )}
156
- </div>
157
- <div className="event-detail__tier-state" style={{ minWidth: 55 }}>
158
- <TicketRow
159
- tableType={true}
160
- ticketTier={ticket}
161
- prevTicketTier={arr[i - 1]}
162
- selectedTickets={selectedTickets}
163
- handleTicketSelect={ticketSelect}
164
- isSeatMapAllowed={isSeatMapAllowed}
165
- event={event}
166
- />
167
- </div>
275
+ <div className="event-detail__tier-state" style={{ minWidth: 55 }}>
276
+ <TicketRow
277
+ tableType={true}
278
+ ticketTier={ticket}
279
+ prevTicketTier={arr[i - 1]}
280
+ selectedTickets={selectedTickets}
281
+ handleTicketSelect={ticketSelect}
282
+ isSeatMapAllowed={isSeatMapAllowed}
283
+ event={event}
284
+ />
168
285
  </div>
169
286
  </div>
170
- </React.Fragment>
171
- </>
287
+ {visibleDescription === ticket.id && (
288
+ <div className="ticket-description">
289
+ <div
290
+ dangerouslySetInnerHTML={{
291
+ __html: decodeHTML(ticket.descriptionRich),
292
+ }}
293
+ />
294
+ </div>
295
+ )}
296
+ </div>
297
+ </React.Fragment>
172
298
  )
173
299
  })}
174
300
  </>
@@ -0,0 +1,120 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { Box, CircularProgress, TextField } from '@mui/material'
3
+ import { LocalizationProvider, StaticDatePicker as DatePicker } from '@mui/x-date-pickers'
4
+ import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
5
+ import _isEmpty from 'lodash/isEmpty'
6
+ import _map from 'lodash/map'
7
+ import moment from 'moment-timezone'
8
+ import React, { ReactNode, useState } from 'react'
9
+
10
+ import { TicketsSection } from './TicketsSection'
11
+
12
+ interface Props {
13
+ event: any;
14
+ eventId: number;
15
+ availableDates: string[];
16
+ selectedDate: string | null;
17
+ timeSlotGroups: { [key: string]: any[] };
18
+ setTimeSlotGroups: (value: { [key: string]: any[] }) => void;
19
+ setSelectedDate: (value: string | null) => void;
20
+ getTimeSlots: (date: string | null, type?: string) => Promise<void>;
21
+
22
+ selectedTickets: any;
23
+ handleTicketSelect: any;
24
+ sortBySoldOut: boolean;
25
+ hideTicketsHeader: boolean;
26
+ ticketsHeaderComponent?: ReactNode;
27
+ showGroupNameBlock?: boolean;
28
+ currencySymbol?: string;
29
+ isSeatMapAllowed?: boolean;
30
+ }
31
+
32
+ const TimeSlotsSection: React.FC<Props> = ({
33
+ event,
34
+ availableDates,
35
+ selectedDate,
36
+ timeSlotGroups,
37
+ setSelectedDate,
38
+ getTimeSlots,
39
+ selectedTickets,
40
+ handleTicketSelect,
41
+ sortBySoldOut,
42
+ hideTicketsHeader,
43
+ ticketsHeaderComponent,
44
+ showGroupNameBlock,
45
+ currencySymbol,
46
+ isSeatMapAllowed,
47
+ }) => {
48
+ const [loading, setLoading] = useState(false)
49
+
50
+ const handleDateChange = async (date: string | null) => {
51
+ setSelectedDate(date)
52
+ if (date) {
53
+ setLoading(true)
54
+ try {
55
+ await getTimeSlots(date)
56
+ } catch (error) {
57
+ console.error('Error fetching time slots:', error)
58
+ } finally {
59
+ setLoading(false)
60
+ }
61
+ }
62
+ }
63
+
64
+ const isDateDisabled = (date: string) => {
65
+ const formattedDate = moment(date).format('YYYY-MM-DD')
66
+ return !availableDates.includes(formattedDate)
67
+ }
68
+
69
+ return (
70
+ <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
71
+ <LocalizationProvider dateAdapter={AdapterMoment}>
72
+ <DatePicker
73
+ value={selectedDate}
74
+ onChange={handleDateChange}
75
+ shouldDisableDate={isDateDisabled}
76
+ renderInput={params => <TextField {...params} />}
77
+ showToolbar={false}
78
+ componentsProps={{ actionBar: { actions: [] } }}
79
+ disablePast
80
+ />
81
+ </LocalizationProvider>
82
+ {loading ? (
83
+ <CircularProgress sx={{ marginTop: 2 }} />
84
+ ) : (
85
+ <Box
86
+ sx={{
87
+ marginTop: 2,
88
+ width: '100%',
89
+ display: 'flex',
90
+ flexDirection: 'column',
91
+ gap: 2,
92
+ }}
93
+ >
94
+ {_map(Object.keys(timeSlotGroups).sort(), timeKey => (
95
+ <div key={timeKey} className="time-slot-block">
96
+ <div className="time-slot-date">{moment(timeKey).format('hh:mm A')}</div>
97
+ <TicketsSection
98
+ event={event}
99
+ ticketsList={timeSlotGroups[timeKey]}
100
+ tableTickets={[]}
101
+ selectedTickets={selectedTickets}
102
+ handleTicketSelect={handleTicketSelect}
103
+ sortBySoldOut={sortBySoldOut}
104
+ ticketsHeaderComponent={ticketsHeaderComponent}
105
+ tableTicketsHeaderComponent={null}
106
+ hideTableTicketsHeader={true}
107
+ hideTicketsHeader={hideTicketsHeader || _isEmpty(timeSlotGroups[timeKey])}
108
+ showGroupNameBlock={showGroupNameBlock}
109
+ currencySymbol={currencySymbol}
110
+ isSeatMapAllowed={isSeatMapAllowed}
111
+ />
112
+ </div>
113
+ ))}
114
+ </Box>
115
+ )}
116
+ </Box>
117
+ )
118
+ }
119
+
120
+ export default TimeSlotsSection