tf-checkout-react 1.0.42 → 1.0.46

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 (45) hide show
  1. package/dist/api/index.d.ts +1 -0
  2. package/dist/components/billing-info-container/index.d.ts +22 -3
  3. package/dist/components/billing-info-container/utils.d.ts +2 -2
  4. package/dist/components/common/CheckboxField.d.ts +2 -2
  5. package/dist/components/confirmationContainer/index.d.ts +4 -1
  6. package/dist/components/loginModal/index.d.ts +8 -4
  7. package/dist/components/paymentContainer/index.d.ts +5 -1
  8. package/dist/components/registerModal/index.d.ts +3 -0
  9. package/dist/components/ticketsContainer/TicketRow.d.ts +10 -0
  10. package/dist/components/ticketsContainer/TicketsSection.d.ts +10 -0
  11. package/dist/components/ticketsContainer/index.d.ts +6 -1
  12. package/dist/components/ticketsContainer/utils.d.ts +4 -0
  13. package/dist/components/waitingList/index.d.ts +7 -0
  14. package/dist/index.d.ts +1 -0
  15. package/dist/tf-checkout-react.cjs.development.css +3 -2
  16. package/dist/tf-checkout-react.cjs.development.js +688 -203
  17. package/dist/tf-checkout-react.cjs.development.js.map +1 -1
  18. package/dist/tf-checkout-react.cjs.production.min.js +1 -1
  19. package/dist/tf-checkout-react.cjs.production.min.js.map +1 -1
  20. package/dist/tf-checkout-react.esm.js +693 -206
  21. package/dist/tf-checkout-react.esm.js.map +1 -1
  22. package/dist/types/billing-info-data.d.ts +2 -1
  23. package/dist/validators/index.d.ts +2 -1
  24. package/package.json +3 -1
  25. package/src/.DS_Store +0 -0
  26. package/src/api/index.ts +5 -3
  27. package/src/components/.DS_Store +0 -0
  28. package/src/components/billing-info-container/index.tsx +239 -63
  29. package/src/components/billing-info-container/style.css +15 -0
  30. package/src/components/billing-info-container/utils.ts +41 -13
  31. package/src/components/common/CheckboxField.tsx +3 -2
  32. package/src/components/common/CustomField.tsx +16 -1
  33. package/src/components/confirmationContainer/index.tsx +8 -3
  34. package/src/components/loginModal/index.tsx +46 -13
  35. package/src/components/paymentContainer/index.tsx +10 -0
  36. package/src/components/registerModal/index.tsx +20 -3
  37. package/src/components/ticketsContainer/TicketRow.tsx +86 -0
  38. package/src/components/ticketsContainer/TicketsSection.tsx +82 -0
  39. package/src/components/ticketsContainer/index.tsx +96 -210
  40. package/src/components/ticketsContainer/utils.ts +11 -0
  41. package/src/components/waitingList/index.tsx +162 -0
  42. package/src/components/waitingList/style.css +18 -0
  43. package/src/index.ts +2 -1
  44. package/src/types/billing-info-data.ts +2 -1
  45. package/src/validators/index.ts +9 -3
@@ -6,7 +6,7 @@ export interface IGroupItem {
6
6
  className?: string;
7
7
  required?: boolean;
8
8
  component?: ReactNode | JSX.Element | HTMLElement;
9
- onValidate: (value: any) => void;
9
+ onValidate?: (value: any) => void;
10
10
  [key: string]: any;
11
11
  }
12
12
  export interface IFieldData {
@@ -14,6 +14,7 @@ export interface IFieldData {
14
14
  groupClassname?: string;
15
15
  groupLabel?: string | JSX.Element | HTMLElement;
16
16
  groupLabelClassName?: string;
17
+ id: number;
17
18
  }
18
19
  export interface IBillingInfoData {
19
20
  id: number | string;
@@ -1,2 +1,3 @@
1
1
  export declare const combineValidators: (...validators: any) => (...value: any) => any;
2
- export declare const requiredValidator: (value?: string | number | undefined) => string;
2
+ export declare const requiredValidator: (value?: string | number | undefined, message?: string | undefined) => string;
3
+ export declare const emailValidator: (email: string) => "" | "Please enter a valid email address";
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.42",
2
+ "version": "1.0.46",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
@@ -66,7 +66,9 @@
66
66
  "dependencies": {
67
67
  "@emotion/react": "^11.5.0",
68
68
  "@emotion/styled": "^11.3.0",
69
+ "@mui/lab": "^5.0.0-alpha.55",
69
70
  "@mui/material": "5.1.0",
71
+ "@mui/styles": "^5.1.1",
70
72
  "@stripe/react-stripe-js": "^1.6.0",
71
73
  "@stripe/stripe-js": "^1.21.1",
72
74
  "autoprefixer": "^10.4.0",
package/src/.DS_Store ADDED
Binary file
package/src/api/index.ts CHANGED
@@ -19,7 +19,7 @@ if (
19
19
  window.location.origin !== 'https://www.houseofx.nyc' &&
20
20
  window.location.origin !== 'https://tickets-staging.houseofx.nyc'
21
21
  ) {
22
- //ttfHeaders['X-Source-Origin'] = 'houseofx.com'
22
+ ttfHeaders['X-Source-Origin'] = 'houseofx.nyc'
23
23
  }
24
24
 
25
25
  interface IPublicRequest extends AxiosInstance {
@@ -78,7 +78,7 @@ publicRequest.interceptors.request.use((config: AxiosRequestConfig) => {
78
78
  ) {
79
79
  const updatedHeaders = {
80
80
  ...config.headers,
81
- // 'X-Source-Origin': 'houseofx.com',
81
+ 'X-Source-Origin': 'houseofx.nyc',
82
82
  }
83
83
  config.headers = updatedHeaders
84
84
  }
@@ -215,4 +215,6 @@ export const getCountries = () => publicRequest.get('/countries/')
215
215
 
216
216
  export const getConfirmationData = (orderHash: string) => publicRequest.get(`/v1/order/${orderHash}/payment/complete`)
217
217
 
218
- export const getStates = (countryId: string) => publicRequest.get(`/countries/${countryId}/states/`)
218
+ export const getStates = (countryId: string) => publicRequest.get(`/countries/${countryId}/states/`)
219
+
220
+ export const addToWaitingList = (id: number, data: any) => publicRequest.post(`/v1/event/${id}/add_to_waiting_list`, data)
Binary file
@@ -1,4 +1,5 @@
1
1
  import React, { FC, useEffect, useState } from 'react'
2
+ import { AxiosError } from 'axios'
2
3
  import {
3
4
  Field,
4
5
  Form,
@@ -7,7 +8,7 @@ import {
7
8
  FormikProps,
8
9
  FormikValues,
9
10
  } from 'formik'
10
- import Button from '@mui/material/Button'
11
+ import LoadingButton from '@mui/lab/LoadingButton'
11
12
  import _identity from 'lodash/identity'
12
13
  import _map from 'lodash/map'
13
14
  import _get from 'lodash/get'
@@ -37,6 +38,7 @@ import {
37
38
  import { CustomField } from '../common/CustomField'
38
39
  import axios from 'axios'
39
40
  import { CheckboxField } from '../common/CheckboxField'
41
+ import { CircularProgress } from '@mui/material'
40
42
 
41
43
  // const TTFLOGO = require('./logo-ttf.png')
42
44
 
@@ -55,13 +57,45 @@ const getQueryVariable = (variable: string) => {
55
57
  }
56
58
 
57
59
  export interface IBillingInfoPage {
58
- data: IBillingInfoData[];
59
- handleSubmit: (
60
+ data?: IBillingInfoData[];
61
+ ticketHoldersFields?: IBillingInfoData;
62
+ handleSubmit?: (
60
63
  values: FormikValues,
61
64
  formikHelpers: FormikHelpers<FormikValues>,
62
65
  res?: any
63
66
  ) => void;
64
67
 
68
+ onRegisterSuccess?: (value: {
69
+ accessToken: string;
70
+ refreshToken: string;
71
+ }) => void;
72
+
73
+ onRegisterError?: (e: AxiosError) => void;
74
+
75
+ onSubmitError?: (e: AxiosError) => void;
76
+
77
+ onGetCartSuccess?: (res: any) => void;
78
+
79
+ onGetCartError?: (e: AxiosError) => void;
80
+
81
+ onGetCountriesSuccess?: (res: any) => void;
82
+
83
+ onGetCountriesError?: (e: AxiosError) => void;
84
+
85
+ onGetStatesSuccess?: (res: any) => void;
86
+
87
+ onGetStatesError?: (e: AxiosError) => void;
88
+
89
+ onGetProfileDataSuccess?: (res: any) => void;
90
+
91
+ onGetProfileDataError?: (e: AxiosError) => void;
92
+
93
+ onAuthorizeSuccess?: () => void;
94
+
95
+ onAuthorizeError?: (e: AxiosError) => void;
96
+
97
+ onLogin?: () => void;
98
+
65
99
  initialValues?: FormikValues;
66
100
  buttonName?: string;
67
101
  theme?: 'light' | 'dark';
@@ -73,7 +107,17 @@ const LogicRunner: FC<{
73
107
  setFieldValue: any;
74
108
  setValues: any;
75
109
  setUserValues: any;
76
- }> = ({ values, setStates, setFieldValue, setValues, setUserValues }) => {
110
+ onGetStatesSuccess: any;
111
+ onGetStatesError: any;
112
+ }> = ({
113
+ values,
114
+ setStates,
115
+ setFieldValue,
116
+ setValues,
117
+ setUserValues,
118
+ onGetStatesSuccess,
119
+ onGetStatesError,
120
+ }) => {
77
121
  useEffect(() => {
78
122
  const fetchStates = async () => {
79
123
  try {
@@ -84,7 +128,12 @@ const LogicRunner: FC<{
84
128
  }))
85
129
  setStates(mappedStates)
86
130
  setFieldValue('state', mappedStates[0]?.label ?? '')
87
- } catch (e) {}
131
+ onGetStatesSuccess(res.data)
132
+ } catch (e) {
133
+ if (axios.isAxiosError(e)) {
134
+ onGetStatesError(e)
135
+ }
136
+ }
88
137
  }
89
138
  fetchStates()
90
139
  }, [values.country, setStates, setFieldValue])
@@ -105,9 +154,6 @@ const LogicRunner: FC<{
105
154
  email: parsedData?.email || '',
106
155
  phone: parsedData?.phone || '',
107
156
  confirmEmail: '',
108
- holderFirstName: '',
109
- holderLastName: '',
110
- holderAge: '',
111
157
  state: parsedData?.state || '',
112
158
  street_address: parsedData?.street_address || '',
113
159
  country: parsedData?.country || 1,
@@ -119,9 +165,7 @@ const LogicRunner: FC<{
119
165
  }
120
166
  setValues(mappedValues)
121
167
  setUserValues(mappedValues)
122
- } catch (e) {
123
- console.log(e)
124
- }
168
+ } catch (e) {}
125
169
  }
126
170
  }
127
171
  }
@@ -135,10 +179,28 @@ const SectionContainer: FC = ({ children }) => <>{children}</>
135
179
 
136
180
  export const BillingInfoContainer = ({
137
181
  data = [],
182
+ ticketHoldersFields = {
183
+ id: 1,
184
+ fields: [],
185
+ },
138
186
  initialValues = {},
139
187
  buttonName = 'Submit',
140
188
  handleSubmit = _identity,
141
189
  theme = 'light',
190
+ onRegisterSuccess = () => {},
191
+ onRegisterError = () => {},
192
+ onSubmitError = () => {},
193
+ onGetCartSuccess = () => {},
194
+ onGetCartError = () => {},
195
+ onGetCountriesSuccess = () => {},
196
+ onGetCountriesError = () => {},
197
+ onGetStatesSuccess = () => {},
198
+ onGetStatesError = () => {},
199
+ onGetProfileDataSuccess = () => {},
200
+ onGetProfileDataError = () => {},
201
+ onAuthorizeSuccess = () => {},
202
+ onAuthorizeError = () => {},
203
+ onLogin = () => {},
142
204
  }: IBillingInfoPage) => {
143
205
  const userData =
144
206
  typeof window !== 'undefined' && window.localStorage.getItem('user_data')
@@ -156,6 +218,7 @@ export const BillingInfoContainer = ({
156
218
  const [alreadyHasUser, setAlreadyHasUser] = useState(false)
157
219
  const [userExpired, setUserExpired] = useState(false)
158
220
  const [showModalRegister, setShowModalRegister] = useState(false)
221
+ const [ticketsQuantity, setTicketsQuantity] = useState(1)
159
222
  const [userValues, setUserValues] = useState<any>({
160
223
  firstName: '',
161
224
  lastName: '',
@@ -183,13 +246,28 @@ export const BillingInfoContainer = ({
183
246
  const showTicketHolderName = getQueryVariable('names_required') === 'true'
184
247
  const optedInFieldValue: boolean = _get(cartInfoData, 'optedIn', false)
185
248
 
249
+ const getQuantity = (cart: any = []) => {
250
+ let qty: any = 0
251
+ cart.forEach((item: any) => {
252
+ qty += +item.quantity
253
+ })
254
+ return qty
255
+ }
186
256
  // fetch cart data
187
257
  const fetchCart = async () => {
188
258
  try {
189
259
  const res = await getCart()
190
260
  setCustomHeader(res)
191
- setCartInfo(_get(res, 'data.data.attributes'))
192
- } catch (e) {}
261
+ const cartInfo = _get(res, 'data.data.attributes')
262
+ setCartInfo(cartInfo)
263
+ const { cart = [] } = cartInfo
264
+ setTicketsQuantity(getQuantity(cart))
265
+ onGetCartSuccess(res.data)
266
+ } catch (e) {
267
+ if (axios.isAxiosError(e)) {
268
+ onGetCartError(e)
269
+ }
270
+ }
193
271
  }
194
272
 
195
273
  // fetch user data
@@ -204,8 +282,13 @@ export const BillingInfoContainer = ({
204
282
  'user_data',
205
283
  JSON.stringify(profileDataObj)
206
284
  )
285
+ onGetProfileDataSuccess(userDataResponse.data)
207
286
  }
208
- } catch (e) {}
287
+ } catch (e) {
288
+ if (axios.isAxiosError(e)) {
289
+ onGetProfileDataError(e)
290
+ }
291
+ }
209
292
  }
210
293
 
211
294
  useEffect(() => {
@@ -214,14 +297,21 @@ export const BillingInfoContainer = ({
214
297
 
215
298
  // fetch countries data
216
299
  const fetchCountries = async () => {
217
- const res = await getCountries()
218
- setCustomHeader(res)
219
- setCountries(
220
- _map(_get(res, 'data.data'), (item, key) => ({
221
- label: item,
222
- value: Number(key),
223
- }))
224
- )
300
+ try {
301
+ const res = await getCountries()
302
+ setCustomHeader(res)
303
+ setCountries(
304
+ _map(_get(res, 'data.data'), (item, key) => ({
305
+ label: item,
306
+ value: Number(key),
307
+ }))
308
+ )
309
+ onGetCountriesSuccess(res.data)
310
+ } catch (e) {
311
+ if (axios.isAxiosError(e)) {
312
+ onGetCountriesError(e)
313
+ }
314
+ }
225
315
  }
226
316
 
227
317
  if (!(countries && countries.length)) {
@@ -232,14 +322,18 @@ export const BillingInfoContainer = ({
232
322
  return (
233
323
  <>
234
324
  <Formik
235
- initialValues={getInitialValues(data, {
236
- ...initialValues,
237
- email: emailLogged,
238
- firstName: firstNameLogged,
239
- lastName: lastNameLogged,
240
- country: 1,
241
- brand_opt_in: optedInFieldValue,
242
- })}
325
+ initialValues={getInitialValues(
326
+ data,
327
+ {
328
+ ...initialValues,
329
+ email: emailLogged,
330
+ firstName: firstNameLogged,
331
+ lastName: lastNameLogged,
332
+ country: 1,
333
+ brand_opt_in: optedInFieldValue,
334
+ },
335
+ userValues
336
+ )}
243
337
  enableReinitialize={true}
244
338
  onSubmit={async (values, formikHelpers) => {
245
339
  try {
@@ -256,6 +350,7 @@ export const BillingInfoContainer = ({
256
350
  }
257
351
  }
258
352
  const checkoutBody = createCheckoutDataBody(
353
+ ticketsQuantity,
259
354
  values,
260
355
  { emailLogged, firstNameLogged, lastNameLogged },
261
356
  showDOB
@@ -266,12 +361,50 @@ export const BillingInfoContainer = ({
266
361
  }
267
362
 
268
363
  const bodyFormData = createRegisterFormData(values)
269
- const resRegister = await register(bodyFormData)
270
- const access_token_register = _get(
271
- resRegister,
272
- 'data.data.attributes.access_token'
273
- )
274
- handleSetAccessToken(access_token_register)
364
+
365
+ let access_token_register = null
366
+ try {
367
+ const resRegister = await register(bodyFormData)
368
+ access_token_register = _get(
369
+ resRegister,
370
+ 'data.data.attributes.access_token'
371
+ )
372
+ const refreshToken = _get(
373
+ resRegister,
374
+ 'data.data.attributes.refresh_token'
375
+ )
376
+ handleSetAccessToken(access_token_register)
377
+
378
+ const tokens = {
379
+ accessToken: access_token_register,
380
+ refreshToken,
381
+ }
382
+
383
+ onRegisterSuccess(tokens)
384
+ } catch (e) {
385
+ if (axios.isAxiosError(e)) {
386
+ const error = e?.response?.data?.message
387
+ if (_includes(error, 'You must be aged')) {
388
+ formikHelpers.setFieldError('holderAge', error)
389
+ }
390
+
391
+ if (error?.password) {
392
+ formikHelpers.setFieldError('password', error.password)
393
+ formikHelpers.setFieldError(
394
+ 'confirmPassword',
395
+ error.password
396
+ )
397
+ }
398
+
399
+ if (error?.email) {
400
+ setAlreadyHasUser(true)
401
+ setShowModalLogin(true)
402
+ }
403
+ onRegisterError(e)
404
+ }
405
+ return
406
+ }
407
+
275
408
  const profileData = await getProfileData(access_token_register)
276
409
  const profileSpecifiedData = _get(profileData, 'data.data')
277
410
  const profileDataObj = setLoggedUserData(profileSpecifiedData)
@@ -283,6 +416,7 @@ export const BillingInfoContainer = ({
283
416
  }
284
417
 
285
418
  const checkoutBody = createCheckoutDataBody(
419
+ ticketsQuantity,
286
420
  values,
287
421
  { emailLogged, firstNameLogged, lastNameLogged },
288
422
  showDOB
@@ -294,20 +428,6 @@ export const BillingInfoContainer = ({
294
428
  handleSubmit(values, formikHelpers as FormikHelpers<any>, res)
295
429
  } catch (e) {
296
430
  if (axios.isAxiosError(e)) {
297
- const error = e?.response?.data?.message
298
- if (_includes(error, 'You must be aged')) {
299
- formikHelpers.setFieldError('holderAge', error)
300
- }
301
-
302
- if (error?.password) {
303
- formikHelpers.setFieldError('password', error.password)
304
- formikHelpers.setFieldError('confirmPassword', error.password)
305
- }
306
-
307
- if (error?.email) {
308
- setAlreadyHasUser(true)
309
- setShowModalLogin(true)
310
- }
311
431
  if (e.response?.data.error === 'invalid_token') {
312
432
  if (typeof window !== 'undefined') {
313
433
  window.localStorage.removeItem('user_data')
@@ -316,6 +436,7 @@ export const BillingInfoContainer = ({
316
436
  setShowModalLogin(true)
317
437
  }
318
438
  }
439
+ onSubmitError(e)
319
440
  }
320
441
  }
321
442
  }}
@@ -328,6 +449,8 @@ export const BillingInfoContainer = ({
328
449
  setFieldValue={props.setFieldValue}
329
450
  setValues={props.setValues}
330
451
  setUserValues={setUserValues}
452
+ onGetStatesSuccess={onGetStatesSuccess}
453
+ onGetStatesError={onGetStatesError}
331
454
  />
332
455
  <div className={`billing-info-container ${theme}`}>
333
456
  {!isLoggedIn && (
@@ -341,6 +464,7 @@ export const BillingInfoContainer = ({
341
464
  className="login-register-button"
342
465
  type="button"
343
466
  onClick={() => {
467
+ onLogin()
344
468
  setShowModalLogin(true)
345
469
  }}
346
470
  >
@@ -364,7 +488,7 @@ export const BillingInfoContainer = ({
364
488
  return (
365
489
  <SectionContainer key={id}>
366
490
  <p className={labelClassName}>{label}</p>
367
- {_map(fields, (group, index) => {
491
+ {_map(fields, group => {
368
492
  const {
369
493
  groupClassname,
370
494
  groupItems,
@@ -372,7 +496,7 @@ export const BillingInfoContainer = ({
372
496
  groupLabelClassName,
373
497
  } = group
374
498
  return (
375
- <div key={index}>
499
+ <SectionContainer key={group.id}>
376
500
  {!isLoggedIn && (
377
501
  <div className={groupLabelClassName}>
378
502
  {groupLabel}
@@ -439,26 +563,72 @@ export const BillingInfoContainer = ({
439
563
  )
440
564
  )}
441
565
  </div>
442
- </div>
566
+ </SectionContainer>
443
567
  )
444
568
  })}
445
569
  </SectionContainer>
446
570
  )
447
571
  })}
448
- <div
449
- style={{
450
- display: 'flex',
451
- padding: 20,
452
- justifyContent: 'center',
453
- }}
454
- >
455
- <Button
572
+
573
+ {showTicketHolderName && (
574
+ <div>
575
+ <p>{ticketHoldersFields.label}</p>
576
+ {_map(new Array(ticketsQuantity), (_item, index) => (
577
+ <div key={index}>
578
+ <h5>Ticket {index + 1}</h5>
579
+ {_map(ticketHoldersFields.fields, group => {
580
+ const { groupClassname, groupItems } = group
581
+ return (
582
+ <div key={group.id}>
583
+ <div className={groupClassname}>
584
+ {_map(groupItems, element => (
585
+ <div
586
+ className={element.className}
587
+ key={`${element.name}-${index}`}
588
+ >
589
+ <Field
590
+ name={`${element.name}-${index}`}
591
+ key={`${element.name}-${index}`}
592
+ label={element.label}
593
+ type={element.type}
594
+ required={true}
595
+ component={
596
+ element.type === 'checkbox'
597
+ ? CheckboxField
598
+ : CustomField
599
+ }
600
+ validate={combineValidators(
601
+ element.required
602
+ ? requiredValidator
603
+ : () => {},
604
+ element.onValidate
605
+ ? element.onValidate
606
+ : () => {}
607
+ )}
608
+ />
609
+ </div>
610
+ ))}
611
+ </div>
612
+ </div>
613
+ )
614
+ })}
615
+ </div>
616
+ ))}
617
+ </div>
618
+ )}
619
+ <div className="button-container">
620
+ <LoadingButton
456
621
  type="submit"
457
622
  variant="contained"
458
623
  className="login-register-button"
624
+ loadingIndicator={
625
+ <CircularProgress color="inherit" size={26} />
626
+ }
627
+ loading={props.isSubmitting}
628
+ disabled={props.isSubmitting}
459
629
  >
460
630
  {buttonName}
461
- </Button>
631
+ </LoadingButton>
462
632
  </div>
463
633
  </div>
464
634
  </Form>
@@ -471,10 +641,14 @@ export const BillingInfoContainer = ({
471
641
  }}
472
642
  onLogin={() => {
473
643
  setShowModalLogin(false)
644
+ setUserExpired(false)
474
645
  }}
475
646
  alreadyHasUser={alreadyHasUser}
476
647
  userExpired={userExpired}
477
- setUserExpired={setUserExpired}
648
+ onAuthorizeSuccess={onAuthorizeSuccess}
649
+ onAuthorizeError={onAuthorizeError}
650
+ onGetProfileDataSuccess={onGetProfileDataSuccess}
651
+ onGetProfileDataError={onGetProfileDataError}
478
652
  />
479
653
  )}
480
654
  {showModalRegister && (
@@ -485,6 +659,8 @@ export const BillingInfoContainer = ({
485
659
  onRegister={() => {
486
660
  setShowModalRegister(false)
487
661
  }}
662
+ onGetProfileDataSuccess={onGetProfileDataSuccess}
663
+ onGetProfileDataError={onGetProfileDataError}
488
664
  />
489
665
  )}
490
666
  </>
@@ -1,3 +1,9 @@
1
+ .button-container {
2
+ display: flex;
3
+ padding: 20px;
4
+ justify-content: center;
5
+ }
6
+
1
7
  .billing-info-container {
2
8
  max-width: 800px;
3
9
  margin: 0 auto;
@@ -84,4 +90,13 @@ button {
84
90
  .login-register-block {
85
91
  display: flex;
86
92
  justify-content: space-between;
93
+ }
94
+
95
+ @media only screen and (max-width: 820px) {
96
+ .billing-info-container {
97
+ width: 90%;
98
+ }
99
+ .billing-info-container .main-header {
100
+ font-size: 1.5rem;
101
+ }
87
102
  }