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/dist/components/addonsContainer/index.d.ts +2 -1
- package/dist/components/ticketsContainer/TicketsSection.d.ts +1 -1
- package/dist/tf-checkout-react.cjs.development.js +43 -12
- package/dist/tf-checkout-react.cjs.development.js.map +1 -1
- package/dist/tf-checkout-react.cjs.production.min.js +1 -1
- package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
- package/dist/tf-checkout-react.esm.js +43 -12
- package/dist/tf-checkout-react.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/components/addonsContainer/index.tsx +31 -12
- package/src/components/ticketsContainer/TicketsSection.tsx +38 -31
- package/src/.DS_Store +0 -0
- package/src/components/.DS_Store +0 -0
- package/src/components/common/dist/PhoneNumberField.js +0 -96
package/package.json
CHANGED
|
@@ -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' :
|
|
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
|
-
<
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
<div
|
|
56
|
-
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
</
|
|
89
|
+
</React.Fragment>
|
|
83
90
|
)
|
|
84
91
|
})}
|
|
85
92
|
</>
|
package/src/.DS_Store
DELETED
|
Binary file
|
package/src/components/.DS_Store
DELETED
|
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
|
-
};
|