tf-checkout-react 1.0.71 → 1.0.75

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 (35) hide show
  1. package/dist/api/index.d.ts +1 -0
  2. package/dist/components/billing-info-container/index.d.ts +4 -2
  3. package/dist/components/common/CheckboxField.d.ts +1 -1
  4. package/dist/components/common/FormikPhoneNumberField.d.ts +1 -1
  5. package/dist/components/confirmationContainer/index.d.ts +2 -1
  6. package/dist/components/paymentContainer/index.d.ts +2 -1
  7. package/dist/components/stripePayment/index.d.ts +2 -1
  8. package/dist/components/ticketsContainer/PromoCodeSection.d.ts +12 -0
  9. package/dist/components/ticketsContainer/index.d.ts +2 -1
  10. package/dist/components/waitingList/index.d.ts +2 -1
  11. package/dist/env.d.ts +2 -2
  12. package/dist/images/done.svg +3 -0
  13. package/dist/tf-checkout-react.cjs.development.js +192 -122
  14. package/dist/tf-checkout-react.cjs.development.js.map +1 -1
  15. package/dist/tf-checkout-react.cjs.production.min.js +1 -1
  16. package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
  17. package/dist/tf-checkout-react.esm.js +197 -127
  18. package/dist/tf-checkout-react.esm.js.map +1 -1
  19. package/dist/tf-checkout-styles.css +1 -1
  20. package/dist/utils/setConfigs.d.ts +2 -1
  21. package/package.json +2 -2
  22. package/src/api/index.ts +6 -18
  23. package/src/assets/images/done.svg +3 -0
  24. package/src/components/billing-info-container/index.tsx +36 -21
  25. package/src/components/common/CheckboxField.tsx +1 -0
  26. package/src/components/common/FormikPhoneNumberField.tsx +1 -0
  27. package/src/components/confirmationContainer/index.tsx +59 -43
  28. package/src/components/paymentContainer/index.tsx +86 -45
  29. package/src/components/stripePayment/index.tsx +23 -15
  30. package/src/components/ticketsContainer/PromoCodeSection.tsx +82 -0
  31. package/src/components/ticketsContainer/index.tsx +51 -79
  32. package/src/components/ticketsContainer/style.css +6 -4
  33. package/src/components/waitingList/index.tsx +7 -4
  34. package/src/env.ts +4 -4
  35. package/src/utils/setConfigs.ts +7 -2
@@ -46,13 +46,14 @@ export interface ICheckoutForm {
46
46
  isLoading: any;
47
47
  handleSetLoading: (loading: any) => void;
48
48
  conditions: any;
49
+ disableZipSection: boolean;
49
50
  }
50
51
 
51
52
  interface AddressTypes {
52
53
  city: string;
53
54
  line1: string;
54
55
  state: string;
55
- postal_code: string;
56
+ postal_code?: string;
56
57
  }
57
58
 
58
59
  const CheckoutForm = ({
@@ -66,6 +67,7 @@ const CheckoutForm = ({
66
67
  isLoading = false,
67
68
  handleSetLoading = () => {},
68
69
  conditions = [],
70
+ disableZipSection,
69
71
  }: ICheckoutForm) => {
70
72
  const stripe = useStripe()
71
73
  const elements = useElements()
@@ -79,7 +81,7 @@ const CheckoutForm = ({
79
81
  try {
80
82
  event.preventDefault()
81
83
 
82
- if (!postalCode) {
84
+ if (!postalCode && !disableZipSection) {
83
85
  setStripeError('Please enter your zip code.')
84
86
  handleSetLoading(false)
85
87
  return
@@ -93,11 +95,15 @@ const CheckoutForm = ({
93
95
  }
94
96
 
95
97
  const card = elements.getElement(CardNumberElement)
98
+
96
99
  const address: AddressTypes = {
97
100
  city: billing_info.city,
98
101
  line1: billing_info.street_address,
99
102
  state: billing_info.state,
100
- postal_code: postalCode,
103
+ }
104
+
105
+ if (!disableZipSection) {
106
+ address.postal_code = postalCode
101
107
  }
102
108
 
103
109
  const paymentMethodReq = await stripe.createPaymentMethod({
@@ -185,7 +191,7 @@ const CheckoutForm = ({
185
191
  <label className="card_number_element">
186
192
  <span className="card_label_text">Card number</span>
187
193
  <CardNumberElement
188
- options={{ ...options, ...stripeCardOptions }}
194
+ options={{ ...options.style, ...stripeCardOptions }}
189
195
  onReady={_identity}
190
196
  onChange={_identity}
191
197
  onBlur={_identity}
@@ -194,21 +200,23 @@ const CheckoutForm = ({
194
200
  </label>
195
201
  <label className="expiration_element">
196
202
  <span className="card_label_text">Expiration date</span>
197
- <CardExpiryElement options={{ ...options, ...stripeCardOptions }} />
203
+ <CardExpiryElement options={{ ...options.style, ...stripeCardOptions }} />
198
204
  </label>
199
205
  <label className="cvc_element">
200
206
  <span className="card_label_text">CVC</span>
201
- <CardCvcElement options={{ ...options, ...stripeCardOptions }} />
202
- </label>
203
- <label className="zip_element">
204
- <p className="card_label_text">ZIP</p>
205
- <input
206
- type="text"
207
- value={postalCode}
208
- onChange={onChangePostalCode}
209
- placeholder="ZIP"
210
- />
207
+ <CardCvcElement options={{ ...options.style, ...stripeCardOptions }} />
211
208
  </label>
209
+ {!disableZipSection && (
210
+ <label className="zip_element">
211
+ <p className="card_label_text">ZIP</p>
212
+ <input
213
+ type="text"
214
+ value={postalCode}
215
+ onChange={onChangePostalCode}
216
+ placeholder="ZIP"
217
+ />
218
+ </label>
219
+ )}
212
220
  </div>
213
221
  {checkboxes?.map((checkbox: any) => (
214
222
  <div
@@ -0,0 +1,82 @@
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
+
6
+ export interface IPromoCodeSectionProps {
7
+ promoCode: string;
8
+ promoCodeIsApplied: boolean;
9
+ showPromoInput: boolean;
10
+ isPromotionsEnabled: boolean;
11
+ isAllTicketsSoldOut: boolean;
12
+
13
+ setPromoCode: (value: string) => void;
14
+ setPromoCodeUpdated: (value: string) => void;
15
+ setShowPromoInput: (value: boolean) => void;
16
+ }
17
+
18
+ export const PromoCodeSection = ({
19
+ promoCode,
20
+ promoCodeIsApplied,
21
+ showPromoInput,
22
+ isPromotionsEnabled,
23
+ isAllTicketsSoldOut,
24
+ setPromoCode,
25
+ setPromoCodeUpdated,
26
+ setShowPromoInput,
27
+ }: IPromoCodeSectionProps) => {
28
+
29
+ return (
30
+ <div >
31
+ {promoCodeIsApplied ? (
32
+ <div className="alert-info">
33
+ <SVG
34
+ src={getImage('done.svg')}
35
+ preProcessor={(code) => code.replace(/fill=".*?"/g, 'fill="currentColor"')}
36
+ />
37
+ <p>PROMO CODE APPLIED SUCCESSFULLY</p>
38
+ </div>
39
+ ) : null}
40
+ {showPromoInput && (
41
+ <div className="promo-code-block">
42
+ <input
43
+ placeholder="Promo Code"
44
+ onChange={e => {
45
+ setPromoCode(e.target.value)
46
+ }}
47
+ onKeyPress={event => {
48
+ if (event.key === 'Enter') {
49
+ setPromoCodeUpdated(promoCode)
50
+ }
51
+ }}
52
+ />
53
+ <Button
54
+ className="promo-apply-button"
55
+ placeholder="Promo Code"
56
+ onClick={() => {
57
+ setPromoCodeUpdated(promoCode)
58
+ }}
59
+ >
60
+ Apply
61
+ </Button>
62
+ </div>
63
+ )}
64
+ {isPromotionsEnabled && !showPromoInput && isAllTicketsSoldOut && (
65
+ <p className="promo-code-text">
66
+ Access code needed
67
+ </p>
68
+ )}
69
+ {isPromotionsEnabled && !showPromoInput ? (
70
+ <Button
71
+ className="promo-code-button"
72
+ placeholder="Promo Codes"
73
+ onClick={() => {
74
+ setShowPromoInput(true)
75
+ }}
76
+ >
77
+ Got a promo code? Click here
78
+ </Button>
79
+ ) : null}
80
+ </div>
81
+ )
82
+ }
@@ -12,6 +12,7 @@ import Button from 'react-bootstrap/Button'
12
12
  import jwt_decode from 'jwt-decode'
13
13
  import { TicketsSection } from './TicketsSection'
14
14
  import WaitingList from '../waitingList'
15
+ import { PromoCodeSection } from './PromoCodeSection'
15
16
 
16
17
  function Loader() {
17
18
  return (
@@ -39,6 +40,7 @@ export interface IGetTickets {
39
40
 
40
41
  theme?: 'light' | 'dark';
41
42
  queryPromoCode?: string;
43
+ isPromotionsEnabled?: boolean;
42
44
  }
43
45
 
44
46
  export interface ITicket {
@@ -55,11 +57,12 @@ export const TicketsContainer = ({
55
57
  eventId,
56
58
  onAddToCartSuccess,
57
59
  contentStyle = {},
58
- onAddToCartError = () => {},
59
- onGetTicketsSuccess = () => {},
60
- onGetTicketsError = () => {},
60
+ onAddToCartError = () => { },
61
+ onGetTicketsSuccess = () => { },
62
+ onGetTicketsError = () => { },
61
63
  theme = 'light',
62
- queryPromoCode = ''
64
+ queryPromoCode = '',
65
+ isPromotionsEnabled = true,
63
66
  }: IGetTickets) => {
64
67
  const [selectedTickets, setSelectedTickets] = useState(
65
68
  {} as ISelectedTickets
@@ -181,82 +184,51 @@ export const TicketsContainer = ({
181
184
  {isLoading ? (
182
185
  <Loader />
183
186
  ) : (
184
- <>
185
- {showWaitingList ? (
186
- <WaitingList tickets={tickets} eventId={eventId} />
187
- ) : (
188
- <div>
189
- <TicketsSection
190
- ticketsList={tickets}
191
- selectedTickets={selectedTickets}
192
- handleTicketSelect={handleTicketSelect}
193
- promoCodeIsApplied={promoCodeIsApplied}
194
- />
195
- {promoCodeIsApplied ? (
196
- <div className="alert-info">
197
- Your promo code was applied successfully.
198
- </div>
199
- ) : null}
200
- {showPromoInput && (
201
- <div className="promo-code-block">
202
- <input
203
- placeholder="Promo Code"
204
- onChange={e => {
205
- setPromoCode(e.target.value)
206
- }}
207
- onKeyPress={event => {
208
- if (event.key === 'Enter') {
209
- setPromoCodeUpdated(promoCode)
210
- }
211
- }}
212
- />
213
- <Button
214
- className="promo-apply-button"
215
- placeholder="Promo Code"
216
- onClick={() => {
217
- setPromoCodeUpdated(promoCode)
218
- }}
219
- >
220
- Apply
221
- </Button>
222
- </div>
223
- )}
224
- {!showPromoInput && !isAllTicketsSoldOut ? (
225
- <Button
226
- className="promo-code-button"
227
- placeholder="Promo Codes"
228
- onClick={() => {
229
- setShowPromoInput(true)
230
- }}
231
- >
232
- Got a promo code? Click here
233
- </Button>
234
- ) : null}
235
- <div className="test v1.0.19" style={{ display: 'none' }} />
236
- {!isAllTicketsSoldOut && (
237
- <Button
238
- aria-hidden={true}
239
- className={`book-button ${
240
- handleBookIsLoading ||
241
- _isEmpty(selectedTickets) ||
242
- Object.values(selectedTickets)[0] === 0
243
- ? 'disabled'
244
- : ''
245
- }`}
246
- onClick={
247
- !handleBookIsLoading &&
248
- !_isEmpty(selectedTickets) &&
249
- Object.values(selectedTickets)[0] > 0
250
- ? handleBook
251
- : () => {}
252
- }
253
- >
254
- {getTicketsLabel || 'GET TICKETS'}
255
- </Button>
256
- )}
257
- </div>
187
+ <div>
188
+ <TicketsSection
189
+ ticketsList={tickets}
190
+ selectedTickets={selectedTickets}
191
+ handleTicketSelect={handleTicketSelect}
192
+ promoCodeIsApplied={promoCodeIsApplied}
193
+ />
194
+ {showWaitingList && (
195
+ <WaitingList
196
+ tickets={tickets}
197
+ eventId={eventId}
198
+ isPromotionsEnabled={isPromotionsEnabled}
199
+ />
258
200
  )}
259
- </>
201
+ <PromoCodeSection
202
+ promoCode={promoCode}
203
+ promoCodeIsApplied={promoCodeIsApplied}
204
+ showPromoInput={showPromoInput}
205
+ setPromoCode={setPromoCode}
206
+ setPromoCodeUpdated={setPromoCodeUpdated}
207
+ setShowPromoInput={setShowPromoInput}
208
+ isPromotionsEnabled={isPromotionsEnabled}
209
+ isAllTicketsSoldOut={isAllTicketsSoldOut}
210
+ />
211
+ {!isAllTicketsSoldOut && (
212
+ <Button
213
+ aria-hidden={true}
214
+ className={`book-button ${handleBookIsLoading ||
215
+ _isEmpty(selectedTickets) ||
216
+ Object.values(selectedTickets)[0] === 0
217
+ ? 'disabled'
218
+ : ''
219
+ }`}
220
+ onClick={
221
+ !handleBookIsLoading &&
222
+ !_isEmpty(selectedTickets) &&
223
+ Object.values(selectedTickets)[0] > 0
224
+ ? handleBook
225
+ : () => { }
226
+ }
227
+ >
228
+ {getTicketsLabel || 'GET TICKETS'}
229
+ </Button>
230
+ )}
231
+ </div>
260
232
  )}
261
233
  </div>
262
234
  )
@@ -57,7 +57,6 @@ body {
57
57
  }
58
58
  .event-detail__tier-price {
59
59
  font-family: Inter-Bold;
60
- font-weight: 700;
61
60
  font-size: 1.5rem;
62
61
  line-height: 1;
63
62
  color: #000;
@@ -70,7 +69,6 @@ body {
70
69
 
71
70
  .event-detail__tier-price .fees {
72
71
  font-size: 14px;
73
- font-weight: normal;
74
72
  text-align: left;
75
73
  margin-top: 4px;
76
74
  }
@@ -84,16 +82,20 @@ body {
84
82
 
85
83
  .alert-info {
86
84
  border: 1px solid #fbeed5;
87
- text-align: center;
88
85
  padding: 8px 15px;
89
86
  background-color: #d9edf7;
90
87
  border-color: #bce8f1;
91
88
  color: #3a87ad;
92
89
  font-size: 1em;
93
- margin-bottom: 20px;
94
90
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
95
91
  border-radius: 4px;
96
92
  margin: 0px 35px;
93
+ display: flex;
94
+ justify-content: center;
95
+ align-items: center;
96
+ }
97
+ .alert-info svg {
98
+ margin-right: 4px;
97
99
  }
98
100
 
99
101
  .event-detail__tier-state {
@@ -16,6 +16,7 @@ import './style.css'
16
16
  interface WaitingListProps {
17
17
  tickets: any;
18
18
  eventId: number;
19
+ isPromotionsEnabled: boolean;
19
20
  }
20
21
 
21
22
  interface WaitingListFields {
@@ -34,7 +35,7 @@ const generateQuantity = (n: number) => {
34
35
  return quantityList
35
36
  }
36
37
 
37
- const WaitingList = ({ tickets = {}, eventId }: WaitingListProps) => {
38
+ const WaitingList = ({ tickets = {}, eventId, isPromotionsEnabled }: WaitingListProps) => {
38
39
  const [showSuccessMessage, setShowSuccessMessage] = useState(false)
39
40
  const [loading, setLoading] = useState(false)
40
41
  const ticketTypesList = Object.values(tickets).map((d: any) => ({
@@ -72,9 +73,11 @@ const WaitingList = ({ tickets = {}, eventId }: WaitingListProps) => {
72
73
  </div>
73
74
  ) : (
74
75
  <>
75
- <p className="no-tickets-text">
76
- No tickets are currently available for this event.
77
- </p>
76
+ {!isPromotionsEnabled && (
77
+ <p className="no-tickets-text">
78
+ No tickets are currently available for this event.
79
+ </p>
80
+ )}
78
81
  <h2>WAITING LIST</h2>
79
82
  <Formik
80
83
  initialValues={{
package/src/env.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // preview
2
- export const ENV_TEST = {
2
+ export const ENV = {
3
3
  EVENT_ID: 162,
4
- BASE_URL: 'https://preview.ttf.fluxtech.me/api',
4
+ BASE_URL: 'https://preview.ttf.fluxtech.me',
5
5
  CLIENT_ID: '4792a61f2fcb49197ab4c2d2f44df570',
6
6
  CLIENT_SECRET: 'b89c191eff22fdcf84ac9bfd88d005355a151ec2c83b26b9',
7
7
  STRIPE_PUBLISHABLE_KEY:
@@ -9,9 +9,9 @@ export const ENV_TEST = {
9
9
  }
10
10
 
11
11
  // prod
12
- export const ENV = {
12
+ export const ENV_PROD = {
13
13
  EVENT_ID: 9766,
14
- BASE_URL: 'https://www.ticketfairy.com/api',
14
+ BASE_URL: 'https://www.ticketfairy.com',
15
15
  CLIENT_ID: 'e9d8f8922797b4621e562255afe90dbf',
16
16
  CLIENT_SECRET: 'b89c191eff22fdcf84ac9bfd88d005355a151ec2c83b26b9',
17
17
  STRIPE_PUBLISHABLE_KEY:
@@ -1,13 +1,14 @@
1
1
  import _forEach from 'lodash/forEach'
2
- import { publicRequest } from '../api'
2
+ import { publicRequest, setXSourceOrigin } from '../api'
3
3
 
4
4
  interface IConfigs {
5
5
  BASE_URL: string;
6
6
  CLIENT_ID: string;
7
7
  CLIENT_SECRET: string;
8
8
  STRIPE_PUBLISHABLE_KEY: string;
9
+ X_SOURCE_ORIGIN: string;
9
10
 
10
- [key: string]: string;
11
+ [key: string]: string | number;
11
12
  }
12
13
 
13
14
  export const CONFIGS: IConfigs = {} as IConfigs
@@ -18,4 +19,8 @@ export const setConfigs = (configs: IConfigs) => {
18
19
  })
19
20
 
20
21
  publicRequest.setBaseUrl(CONFIGS.BASE_URL)
22
+
23
+ if (CONFIGS.X_SOURCE_ORIGIN) {
24
+ setXSourceOrigin(CONFIGS.X_SOURCE_ORIGIN)
25
+ }
21
26
  }