tf-checkout-react 1.3.24 → 1.3.26

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.
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.3.24",
2
+ "version": "1.3.26",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -2,9 +2,10 @@
2
2
 
3
3
  import { CircularProgress } from '@mui/material'
4
4
  import { Form, Formik } from 'formik'
5
+ import { isEqual } from 'lodash'
5
6
  import _get from 'lodash/get'
6
7
  import _identity from 'lodash/identity'
7
- import React, { useEffect, useState } from 'react'
8
+ import React, { useEffect, useRef, useState } from 'react'
8
9
 
9
10
  import {
10
11
  getAddons,
@@ -42,6 +43,7 @@ export interface IAddonContainterProps {
42
43
  onConfirmSelectionSuccess?: (res: any) => void;
43
44
  onConfirmSelectionError?: (error: any) => void;
44
45
  onCountdownFinish?: () => void;
46
+ samePageBilling?: boolean;
45
47
  }
46
48
 
47
49
  export interface ObjectLiteral {
@@ -59,7 +61,9 @@ export const AddonsContainter = ({
59
61
  onConfirmSelectionSuccess = _identity,
60
62
  onConfirmSelectionError = _identity,
61
63
  onCountdownFinish = _identity,
64
+ samePageBilling = false,
62
65
  }: IAddonContainterProps) => {
66
+ const valuesRef = useRef<any>(null)
63
67
  const eventId = getQueryVariable('event_id')
64
68
  const [addons, setAddons] = useState<any>([])
65
69
  const [addonsOptions, setAddonsOptions] = useState<any>({})
@@ -212,7 +216,7 @@ export const AddonsContainter = ({
212
216
  const collectOptionalWalletAddress = pageConfigsData.collect_optional_wallet_address ?? false
213
217
  const collectMandatoryWalletAddress = pageConfigsData.collect_mandatory_wallet_address ?? false
214
218
 
215
- if (skipBillingPage && enableBillingInfoAutoCreate) {
219
+ if (skipBillingPage && enableBillingInfoAutoCreate && !samePageBilling) {
216
220
  const ticketsQuantity = window.localStorage.getItem('quantity')
217
221
  const userData = JSON.parse(
218
222
  window.localStorage.getItem('user_data') || '{}'
@@ -293,6 +297,8 @@ export const AddonsContainter = ({
293
297
  )
294
298
  }
295
299
 
300
+ const flagHasAddOn = getQueryVariable('hasAddOn') === 'true'
301
+
296
302
  return (
297
303
  <>
298
304
  {!!cartExpirationTime && enableTimer && (
@@ -304,11 +310,11 @@ export const AddonsContainter = ({
304
310
  }}
305
311
  />
306
312
  )}
307
- <div className={`${classNamePrefix}_container`}>
313
+ {samePageBilling && !flagHasAddOn ? null : <div className={`${classNamePrefix}_container`}>
308
314
  <div className={`${classNamePrefix}_block`}>
309
315
  <div className={`${classNamePrefix}_line_block`}>
310
316
  <p className={`${classNamePrefix}_info_title`}>Get Your Tickets</p>
311
- <button
317
+ {samePageBilling ? null : <button
312
318
  type="button"
313
319
  className={`${classNamePrefix}_skip`}
314
320
  onClick={() => {
@@ -317,7 +323,7 @@ export const AddonsContainter = ({
317
323
  }}
318
324
  >
319
325
  Skip
320
- </button>
326
+ </button>}
321
327
  </div>
322
328
  <div className={`${classNamePrefix}_title`}>UPGRADES & ADD-ONS</div>
323
329
  <div className={`${classNamePrefix}_subtitle`}>
@@ -330,6 +336,9 @@ export const AddonsContainter = ({
330
336
  }}
331
337
  >
332
338
  {({ values }) => {
339
+ if (!isEqual(values, valuesRef.current)) {
340
+ valuesRef.current = values
341
+ }
333
342
  const isConfirmDisabled = !isAtLeastOneAddonSelected(values)
334
343
 
335
344
  return (
@@ -396,9 +405,14 @@ export const AddonsContainter = ({
396
405
  data={variant}
397
406
  selectOptions={addonsOptions[variant.id]}
398
407
  classNamePrefix={classNamePrefix}
399
- handleAddonChange={(id, value) =>
408
+ handleAddonChange={(id, value) => {
400
409
  onFieldChange(id, value, addon)
401
- }
410
+ if (samePageBilling) {
411
+ setTimeout(() => {
412
+ handleConfirm(valuesRef.current)
413
+ }, 100)
414
+ }
415
+ }}
402
416
  />
403
417
  ))
404
418
  ) : (
@@ -408,16 +422,21 @@ export const AddonsContainter = ({
408
422
  data={addon}
409
423
  selectOptions={addonsOptions[addon.id]}
410
424
  classNamePrefix={classNamePrefix}
411
- handleAddonChange={(id, value) =>
425
+ handleAddonChange={(id, value) => {
412
426
  onFieldChange(id, value, addon)
413
- }
427
+ if (samePageBilling) {
428
+ setTimeout(() => {
429
+ handleConfirm(valuesRef.current)
430
+ }, 100)
431
+ }
432
+ }}
414
433
  />
415
434
  )}
416
435
  </div>
417
436
  </div>
418
437
  )
419
438
  })}
420
- <button
439
+ {samePageBilling ? null : <button
421
440
  type="submit"
422
441
  className={`${
423
442
  isConfirmDisabled
@@ -427,14 +446,14 @@ export const AddonsContainter = ({
427
446
  disabled={isConfirmDisabled}
428
447
  >
429
448
  CONFIRM SELECTION
430
- </button>
449
+ </button>}
431
450
  </>
432
451
  </Form>
433
452
  )
434
453
  }}
435
454
  </Formik>
436
455
  </div>
437
- </div>
456
+ </div>}
438
457
  </>
439
458
  )
440
459
  }
@@ -1,7 +1,8 @@
1
- import React, { ReactNode } from 'react'
2
1
  import './style.css'
3
2
 
4
3
  import _sortBy from 'lodash/sortBy'
4
+ import React, { ReactNode } from 'react'
5
+
5
6
  import { TicketRow } from './TicketRow'
6
7
 
7
8
  interface ITicketsSectionProps {
@@ -24,6 +25,7 @@ export const TicketsSection = ({
24
25
  const sortedTicketsList = sortBySoldOut
25
26
  ? _sortBy(_sortBy(ticketsList, 'sortOrder'), 'soldOut')
26
27
  : _sortBy(ticketsList, 'sortOrder')
28
+ const showGroup = !!sortedTicketsList.find(ticket => ticket.groupName)
27
29
  return (
28
30
  <>
29
31
  {!hideTicketsHeader && ticketsHeaderComponent}
@@ -45,41 +47,46 @@ export const TicketsSection = ({
45
47
  }
46
48
 
47
49
  const ticketIsFree = +ticket.price === 0
48
- const ticketPrice = isSoldOut ? 'SOLD OUT' : ticketIsFree ? 'FREE' : `$ ${(+ticket.price).toFixed(2)}`
50
+ const ticketPrice = isSoldOut ? 'SOLD OUT' : ticketIsFree ? 'FREE' : ${(+ticket.price).toFixed(2)}`
51
+ const isNewGroupTicket = ticket?.groupName !== arr[i-1]?.groupName
49
52
 
50
53
  return (
51
- <div
52
- key={ticket.id || ticket.name}
53
- className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
54
- >
55
- <div className="event-detail__tier-name">
56
- {ticket.displayName || ticket.name}
57
- </div>
58
- <div className="event-tickets-container">
59
- <div className="event-detail__tier-price">
60
- {ticketIsDiscounted && (
61
- <p className="old-price">$ {(+ticket.oldPrice).toFixed(2)}</p>
62
- )}
63
- <p className={isSoldOut ? 'sold-out' : ''}>{ticketPrice}</p>
64
- {!isSoldOut && !ticketIsFree && (
65
- <p className="fees">
66
- {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
67
- </p>
68
- )}
54
+ <React.Fragment key={ticket.id || ticket.name}>
55
+ {showGroup && isNewGroupTicket ? (
56
+ <div className='event-detail__tier group-title'>{ticket.groupName || ''}</div>
57
+ ) : null}
58
+ <div
59
+ className={`event-detail__tier ${isSoldOut ? 'disabled' : ''}`}
60
+ >
61
+ <div className="event-detail__tier-name">
62
+ {ticket.displayName || ticket.name}
69
63
  </div>
70
- <div
71
- className="event-detail__tier-state"
72
- style={{ minWidth: 55 }}
73
- >
74
- <TicketRow
75
- ticketTier={ticket}
76
- prevTicketTier={arr[i - 1]}
77
- selectedTickets={selectedTickets}
78
- handleTicketSelect={ticketSelect}
79
- />
64
+ <div className="event-tickets-container">
65
+ <div className="event-detail__tier-price">
66
+ {ticketIsDiscounted && (
67
+ <p className="old-price">£ {(+ticket.oldPrice).toFixed(2)}</p>
68
+ )}
69
+ <p className={isSoldOut ? 'sold-out' : ''}>{ticketPrice}</p>
70
+ {!isSoldOut && !ticketIsFree && (
71
+ <p className="fees">
72
+ {ticket.feeIncluded ? '(incl. Fees)' : '(excl. Fees)'}
73
+ </p>
74
+ )}
75
+ </div>
76
+ <div
77
+ className="event-detail__tier-state"
78
+ style={{ minWidth: 55 }}
79
+ >
80
+ <TicketRow
81
+ ticketTier={ticket}
82
+ prevTicketTier={arr[i - 1]}
83
+ selectedTickets={selectedTickets}
84
+ handleTicketSelect={ticketSelect}
85
+ />
86
+ </div>
80
87
  </div>
81
88
  </div>
82
- </div>
89
+ </React.Fragment>
83
90
  )
84
91
  })}
85
92
  </>
package/src/.DS_Store DELETED
Binary file
Binary file
@@ -1,96 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- exports.__esModule = true;
50
- exports.PhoneNumberField = void 0;
51
- var TextField_1 = require("@mui/material/TextField");
52
- var debounce_1 = require("lodash/debounce");
53
- var get_1 = require("lodash/get");
54
- var react_1 = require("react");
55
- var api_1 = require("../../api");
56
- exports.PhoneNumberField = function (_a) {
57
- var label = _a.label, _b = _a.type, type = _b === void 0 ? 'text' : _b, field = _a.field, _c = _a.form, errors = _c.errors, setFieldError = _c.setFieldError, setStatus = _c.setStatus;
58
- var error = get_1["default"](errors, field.name);
59
- // eslint-disable-next-line react-hooks/exhaustive-deps
60
- var debounceCb = react_1.useCallback(debounce_1["default"](function (cb) { return void cb(); }, 1000), []);
61
- react_1.useEffect(function () {
62
- var _a;
63
- if (field.value) {
64
- setStatus((_a = {}, _a[field.name] = true, _a));
65
- }
66
- debounceCb(function () { return __awaiter(void 0, void 0, void 0, function () {
67
- var error_1, message;
68
- var _a;
69
- return __generator(this, function (_b) {
70
- switch (_b.label) {
71
- case 0:
72
- _b.trys.push([0, 3, 4, 5]);
73
- if (!field.value) return [3 /*break*/, 2];
74
- return [4 /*yield*/, api_1.validatePhoneNumber(field.value)];
75
- case 1:
76
- _b.sent();
77
- _b.label = 2;
78
- case 2:
79
- setFieldError(field.name, '');
80
- return [3 /*break*/, 5];
81
- case 3:
82
- error_1 = _b.sent();
83
- message = get_1["default"](error_1, 'response.data.message', 'Invalid phone number');
84
- setFieldError(field.name, message);
85
- return [3 /*break*/, 5];
86
- case 4:
87
- setStatus((_a = {}, _a[field.name] = false, _a));
88
- return [7 /*endfinally*/];
89
- case 5: return [2 /*return*/];
90
- }
91
- });
92
- }); });
93
- // eslint-disable-next-line
94
- }, [field.value]);
95
- return (react_1["default"].createElement(TextField_1["default"], __assign({}, field, { id: field.name, label: label, type: type, fullWidth: true, error: !!error, helperText: error, value: field.value || '', inputProps: { pattern: '[+0-9]/d+' } })));
96
- };