tf-checkout-react 1.7.30 → 2.0.0-beta.0
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/LICENSE +1 -1
- package/README.md +141 -1033
- package/dist/checkout.css +17 -0
- package/dist/index.d.mts +3930 -0
- package/dist/index.d.ts +3930 -30
- package/dist/index.esm.js +9123 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +9277 -6
- package/dist/index.js.map +1 -0
- package/dist/styles/addons.css +75 -0
- package/dist/styles/auth.css +294 -0
- package/dist/styles/billing.css +98 -0
- package/dist/styles/confirmation.css +51 -0
- package/dist/styles/foundation.css +146 -0
- package/dist/styles/payment.css +179 -0
- package/dist/styles/primitives.css +356 -0
- package/dist/styles/seat-map.css +46 -0
- package/dist/styles/tickets.css +285 -0
- package/dist/styles/verification-confirmation.css +258 -0
- package/package.json +93 -78
- package/src/.d.ts +1 -1
- package/src/CardInput.tsx +374 -0
- package/src/EmbeddedCheckout.tsx +400 -0
- package/src/ResumedCheckout.tsx +132 -0
- package/src/auth/AuthModal.tsx +231 -0
- package/src/auth/ForgotPasswordForm.tsx +93 -0
- package/src/auth/LoginForm.tsx +104 -0
- package/src/auth/PasswordInput.tsx +33 -0
- package/src/auth/RegisterForm.tsx +333 -0
- package/src/auth/ResetPasswordForm.tsx +112 -0
- package/src/auth/index.ts +5 -0
- package/src/checkout.css +17 -0
- package/src/configure.ts +29 -0
- package/src/confirmer.ts +439 -0
- package/src/index.ts +41 -30
- package/src/instance.ts +21 -0
- package/src/sections/AddOns.tsx +241 -0
- package/src/sections/BillingInfo.tsx +743 -0
- package/src/sections/Confirmation.tsx +146 -0
- package/src/sections/IDVerification.tsx +76 -0
- package/src/sections/OrderConfirmation.tsx +277 -0
- package/src/sections/OrderIDVerification.tsx +117 -0
- package/src/sections/OrderSummary.tsx +84 -0
- package/src/sections/Payment.tsx +541 -0
- package/src/sections/SeatMap.tsx +512 -0
- package/src/sections/Tickets.tsx +573 -0
- package/src/sections/billing/BillingAddressFields.tsx +138 -0
- package/src/sections/billing/BuyerField.tsx +75 -0
- package/src/sections/billing/TicketHoldersCard.tsx +119 -0
- package/src/sections/billing/types.ts +10 -0
- package/src/sections/index.ts +15 -0
- package/src/sections/seatMap.utils.ts +105 -0
- package/src/styles/addons.css +75 -0
- package/src/styles/auth.css +294 -0
- package/src/styles/billing.css +98 -0
- package/src/styles/confirmation.css +51 -0
- package/src/styles/foundation.css +146 -0
- package/src/styles/payment.css +179 -0
- package/src/styles/primitives.css +356 -0
- package/src/styles/seat-map.css +46 -0
- package/src/styles/tickets.css +285 -0
- package/src/styles/verification-confirmation.css +258 -0
- package/src/typings.d.ts +2 -2
- package/src/ui/Button.tsx +38 -0
- package/src/ui/Card.tsx +54 -0
- package/src/ui/CheckoutProvider.tsx +172 -0
- package/src/ui/CustomFields.tsx +195 -0
- package/src/ui/Field.tsx +114 -0
- package/src/ui/I18nProvider.tsx +36 -0
- package/src/ui/InstallmentPicker.tsx +69 -0
- package/src/ui/Loader.tsx +12 -0
- package/src/ui/PaymentMethods.tsx +133 -0
- package/src/ui/PriceLine.tsx +24 -0
- package/src/ui/QuantitySelect.tsx +50 -0
- package/src/ui/Stepper.tsx +36 -0
- package/src/ui/Timer.tsx +34 -0
- package/src/ui/TimerBanner.tsx +55 -0
- package/src/ui/cx.ts +3 -0
- package/src/ui/index.ts +54 -0
- package/src/ui/theme.ts +83 -0
- package/src/useCheckout.ts +35 -0
- package/src/xendit.ts +438 -0
- package/dist/adapters/customFields.d.ts +0 -12
- package/dist/adapters/index.d.ts +0 -1
- package/dist/api/auth.d.ts +0 -27
- package/dist/api/cart.d.ts +0 -2
- package/dist/api/checkout.d.ts +0 -3
- package/dist/api/common.d.ts +0 -11
- package/dist/api/guestTicketDelegation.d.ts +0 -47
- package/dist/api/index.d.ts +0 -82
- package/dist/api/interceptors.d.ts +0 -1
- package/dist/api/orders.d.ts +0 -2
- package/dist/api/payment.d.ts +0 -5
- package/dist/api/preRegistrationComplete.d.ts +0 -3
- package/dist/api/publicRequest.d.ts +0 -9
- package/dist/api/resale.d.ts +0 -5
- package/dist/components/account-settings/index.d.ts +0 -3
- package/dist/components/addonsContainer/AddonComponent.d.ts +0 -18
- package/dist/components/addonsContainer/SimpleAddonsContainer.d.ts +0 -20
- package/dist/components/addonsContainer/adapters/index.d.ts +0 -12
- package/dist/components/addonsContainer/index.d.ts +0 -22
- package/dist/components/addonsContainer/normalizers/index.d.ts +0 -1
- package/dist/components/addonsContainer/useAddons.d.ts +0 -23
- package/dist/components/addonsContainer/utils/index.d.ts +0 -16
- package/dist/components/billing-info-container/hooks/index.d.ts +0 -3
- package/dist/components/billing-info-container/hooks/usePaymentContext.d.ts +0 -5
- package/dist/components/billing-info-container/hooks/usePaymentRedirect.d.ts +0 -14
- package/dist/components/billing-info-container/hooks/useStripePayment.d.ts +0 -18
- package/dist/components/billing-info-container/index.d.ts +0 -69
- package/dist/components/billing-info-container/utils.d.ts +0 -59
- package/dist/components/common/Checkbox.d.ts +0 -11
- package/dist/components/common/CheckboxField/index.d.ts +0 -9
- package/dist/components/common/CopyField.d.ts +0 -12
- package/dist/components/common/CopyMessageModal.d.ts +0 -7
- package/dist/components/common/CustomField.d.ts +0 -26
- package/dist/components/common/DatePickerField.d.ts +0 -20
- package/dist/components/common/FieldSection/index.d.ts +0 -19
- package/dist/components/common/FieldSection/utils/index.d.ts +0 -8
- package/dist/components/common/FormikPhoneNumberField.d.ts +0 -11
- package/dist/components/common/Loader.d.ts +0 -2
- package/dist/components/common/ModalComponent/index.d.ts +0 -16
- package/dist/components/common/NativeSelectFeild/index.d.ts +0 -21
- package/dist/components/common/PhoneNumberField.d.ts +0 -14
- package/dist/components/common/PoweredBy.d.ts +0 -2
- package/dist/components/common/RadioField.d.ts +0 -11
- package/dist/components/common/RadioGroupField/index.d.ts +0 -17
- package/dist/components/common/RedirectModal.d.ts +0 -7
- package/dist/components/common/SelectField/index.d.ts +0 -19
- package/dist/components/common/SnackbarAlert.d.ts +0 -13
- package/dist/components/common/index.d.ts +0 -11
- package/dist/components/common/socials.d.ts +0 -10
- package/dist/components/confirmModal/index.d.ts +0 -10
- package/dist/components/confirmationContainer/config.d.ts +0 -1
- package/dist/components/confirmationContainer/index.d.ts +0 -46
- package/dist/components/confirmationContainer/social-buttons.d.ts +0 -16
- package/dist/components/countdown/index.d.ts +0 -14
- package/dist/components/delegationsContainer/IssueComponent.d.ts +0 -10
- package/dist/components/delegationsContainer/IssueTicketForm.d.ts +0 -9
- package/dist/components/delegationsContainer/TicketsAssignedTable.d.ts +0 -11
- package/dist/components/delegationsContainer/TicketsAvailableTable.d.ts +0 -11
- package/dist/components/delegationsContainer/index.d.ts +0 -10
- package/dist/components/forgotPasswordModal/index.d.ts +0 -12
- package/dist/components/idVerificationContainer/VerificationPendingModal.d.ts +0 -10
- package/dist/components/idVerificationContainer/constants.d.ts +0 -21
- package/dist/components/idVerificationContainer/index.d.ts +0 -16
- package/dist/components/index.d.ts +0 -12
- package/dist/components/loginForm/index.d.ts +0 -31
- package/dist/components/loginModal/SignUpForm.d.ts +0 -10
- package/dist/components/loginModal/constants.d.ts +0 -39
- package/dist/components/loginModal/index.d.ts +0 -22
- package/dist/components/myTicketsContainer/index.d.ts +0 -16
- package/dist/components/myTicketsContainer/row.d.ts +0 -3
- package/dist/components/myTicketsContainer/tableConfig.d.ts +0 -5
- package/dist/components/orderDetailsContainer/CustomFieldsForm.d.ts +0 -12
- package/dist/components/orderDetailsContainer/TicketHolderCustomFields.d.ts +0 -10
- package/dist/components/orderDetailsContainer/index.d.ts +0 -66
- package/dist/components/orderDetailsContainer/ticketsTable.d.ts +0 -46
- package/dist/components/orderDetailsContainer/utils/index.d.ts +0 -6
- package/dist/components/paymentContainer/OrderDetails.d.ts +0 -9
- package/dist/components/paymentContainer/PaymentPlanSection.d.ts +0 -10
- package/dist/components/paymentContainer/handlePayment.d.ts +0 -15
- package/dist/components/paymentContainer/index.d.ts +0 -39
- package/dist/components/preRegistration/FieldsSection.d.ts +0 -19
- package/dist/components/preRegistration/Influancers.d.ts +0 -2
- package/dist/components/preRegistration/PreRegistrationComplete.d.ts +0 -13
- package/dist/components/preRegistration/PreRegistrationInformations.d.ts +0 -2
- package/dist/components/preRegistration/Prewards.d.ts +0 -2
- package/dist/components/preRegistration/ShareOptions.d.ts +0 -2
- package/dist/components/preRegistration/constants.d.ts +0 -2
- package/dist/components/preRegistration/index.d.ts +0 -23
- package/dist/components/preRegistration/utils.d.ts +0 -12
- package/dist/components/registerForm/adapters/index.d.ts +0 -4
- package/dist/components/registerForm/constants.d.ts +0 -1
- package/dist/components/registerForm/index.d.ts +0 -16
- package/dist/components/registerModal/index.d.ts +0 -12
- package/dist/components/resetPasswordContainer/index.d.ts +0 -10
- package/dist/components/rsvpContainer/index.d.ts +0 -7
- package/dist/components/seatMapContainer/SeatMapComponent.d.ts +0 -8
- package/dist/components/seatMapContainer/TicketsSection.d.ts +0 -9
- package/dist/components/seatMapContainer/addToCart.d.ts +0 -14
- package/dist/components/seatMapContainer/index.d.ts +0 -2
- package/dist/components/seatMapContainer/utils.d.ts +0 -6
- package/dist/components/signupModal/index.d.ts +0 -12
- package/dist/components/ticketResale/index.d.ts +0 -12
- package/dist/components/ticketResaleModal/index.d.ts +0 -19
- package/dist/components/ticketsContainer/AccessCodeSection.d.ts +0 -7
- package/dist/components/ticketsContainer/InfoIcon.d.ts +0 -5
- package/dist/components/ticketsContainer/PromoCodeSection.d.ts +0 -15
- package/dist/components/ticketsContainer/ReferralLogic.d.ts +0 -5
- package/dist/components/ticketsContainer/TicketRow.d.ts +0 -13
- package/dist/components/ticketsContainer/TicketsSection.d.ts +0 -20
- package/dist/components/ticketsContainer/TimeSlotTicketRow.d.ts +0 -19
- package/dist/components/ticketsContainer/TimeSlotsSection.d.ts +0 -25
- package/dist/components/ticketsContainer/index.d.ts +0 -93
- package/dist/components/ticketsContainer/utils.d.ts +0 -13
- package/dist/components/timerWidget/index.d.ts +0 -16
- package/dist/components/waitingList/index.d.ts +0 -9
- package/dist/constants/index.d.ts +0 -7
- package/dist/env.d.ts +0 -16
- package/dist/hoc/CustomFields/index.d.ts +0 -3
- package/dist/hoc/index.d.ts +0 -1
- package/dist/hooks/index.d.ts +0 -1
- package/dist/hooks/useCookieListener.d.ts +0 -1
- package/dist/hooks/useEventListener.d.ts +0 -1
- package/dist/hooks/useLocalStorageListener.d.ts +0 -1
- package/dist/hooks/useOnline.d.ts +0 -1
- package/dist/hooks/usePixel.d.ts +0 -6
- package/dist/images/Polygon.png +0 -0
- package/dist/images/cross.svg +0 -44
- package/dist/images/done.svg +0 -3
- package/dist/images/edit.svg +0 -10
- package/dist/images/email.svg +0 -1
- package/dist/images/instagram.svg +0 -5
- package/dist/images/logo-ttf.png +0 -0
- package/dist/images/spotify.svg +0 -6
- package/dist/images/user.svg +0 -1
- package/dist/images/xmark.svg +0 -92
- package/dist/normalizers/index.d.ts +0 -4
- package/dist/tf-checkout-react.cjs.development.js +0 -16149
- package/dist/tf-checkout-react.cjs.development.js.map +0 -1
- package/dist/tf-checkout-react.cjs.production.min.js +0 -2
- package/dist/tf-checkout-react.cjs.production.min.js.map +0 -1
- package/dist/tf-checkout-react.esm.js +0 -16116
- package/dist/tf-checkout-react.esm.js.map +0 -1
- package/dist/tf-checkout-styles.css +0 -1
- package/dist/types/add_on.d.ts +0 -8
- package/dist/types/billing-info-data.d.ts +0 -27
- package/dist/types/checkoutPageConfigs.d.ts +0 -13
- package/dist/types/index.d.ts +0 -6
- package/dist/types/order-data.d.ts +0 -15
- package/dist/types/payment-field.d.ts +0 -6
- package/dist/types/payment-plan-configuration.d.ts +0 -18
- package/dist/types/referral-promotion.d.ts +0 -6
- package/dist/types/verification.d.ts +0 -12
- package/dist/utils/adaptStripeErrors.d.ts +0 -8
- package/dist/utils/auth.d.ts +0 -21
- package/dist/utils/cookies.d.ts +0 -3
- package/dist/utils/createCheckoutDataBodyWithDefaultHolder.d.ts +0 -23
- package/dist/utils/createMarkup.d.ts +0 -3
- package/dist/utils/customFields.d.ts +0 -35
- package/dist/utils/downloadPDF.d.ts +0 -1
- package/dist/utils/form.d.ts +0 -3
- package/dist/utils/formikErrorFocus.d.ts +0 -2
- package/dist/utils/getDomain.d.ts +0 -1
- package/dist/utils/getImage.d.ts +0 -1
- package/dist/utils/getQueryVariable.d.ts +0 -1
- package/dist/utils/htmlNodeFromString.d.ts +0 -1
- package/dist/utils/index.d.ts +0 -15
- package/dist/utils/isBrowser.d.ts +0 -1
- package/dist/utils/isValidNumber.d.ts +0 -1
- package/dist/utils/jsonUtils.d.ts +0 -1
- package/dist/utils/replaceVarInString.d.ts +0 -1
- package/dist/utils/setConfigs.d.ts +0 -11
- package/dist/utils/showZero.d.ts +0 -1
- package/dist/validators/index.d.ts +0 -8
- package/src/adapters/customFields.ts +0 -85
- package/src/adapters/index.ts +0 -1
- package/src/api/auth.ts +0 -88
- package/src/api/cart.ts +0 -28
- package/src/api/checkout.ts +0 -28
- package/src/api/common.ts +0 -190
- package/src/api/guestTicketDelegation.ts +0 -79
- package/src/api/index.ts +0 -346
- package/src/api/interceptors.ts +0 -77
- package/src/api/orders.ts +0 -30
- package/src/api/payment.ts +0 -77
- package/src/api/preRegistrationComplete.ts +0 -37
- package/src/api/publicRequest.ts +0 -47
- package/src/api/resale.ts +0 -28
- package/src/assets/images/Polygon.png +0 -0
- package/src/assets/images/cross.svg +0 -44
- package/src/assets/images/done.svg +0 -3
- package/src/assets/images/edit.svg +0 -10
- package/src/assets/images/email.svg +0 -1
- package/src/assets/images/instagram.svg +0 -5
- package/src/assets/images/logo-ttf.png +0 -0
- package/src/assets/images/spotify.svg +0 -6
- package/src/assets/images/user.svg +0 -1
- package/src/assets/images/xmark.svg +0 -92
- package/src/components/account-settings/index.tsx +0 -161
- package/src/components/account-settings/style.css +0 -200
- package/src/components/addonsContainer/AddonComponent.tsx +0 -204
- package/src/components/addonsContainer/SimpleAddonsContainer.tsx +0 -459
- package/src/components/addonsContainer/adapters/index.tsx +0 -62
- package/src/components/addonsContainer/index.tsx +0 -353
- package/src/components/addonsContainer/normalizers/index.ts +0 -5
- package/src/components/addonsContainer/useAddons.ts +0 -248
- package/src/components/addonsContainer/utils/index.tsx +0 -231
- package/src/components/billing-info-container/hooks/index.ts +0 -3
- package/src/components/billing-info-container/hooks/usePaymentContext.ts +0 -22
- package/src/components/billing-info-container/hooks/usePaymentRedirect.ts +0 -145
- package/src/components/billing-info-container/hooks/useStripePayment.ts +0 -119
- package/src/components/billing-info-container/index.tsx +0 -1695
- package/src/components/billing-info-container/style.css +0 -150
- package/src/components/billing-info-container/utils.tsx +0 -413
- package/src/components/common/Checkbox.tsx +0 -51
- package/src/components/common/CheckboxField/index.tsx +0 -41
- package/src/components/common/CopyField.tsx +0 -53
- package/src/components/common/CopyMessageModal.tsx +0 -34
- package/src/components/common/CustomField.tsx +0 -168
- package/src/components/common/DatePickerField.tsx +0 -126
- package/src/components/common/FieldSection/index.tsx +0 -141
- package/src/components/common/FieldSection/utils/index.tsx +0 -92
- package/src/components/common/FormikPhoneNumberField.tsx +0 -51
- package/src/components/common/Loader.tsx +0 -8
- package/src/components/common/ModalComponent/index.tsx +0 -68
- package/src/components/common/NativeSelectFeild/index.tsx +0 -86
- package/src/components/common/PhoneNumberField.tsx +0 -117
- package/src/components/common/PoweredBy.tsx +0 -15
- package/src/components/common/RadioField.tsx +0 -36
- package/src/components/common/RadioGroupField/index.tsx +0 -76
- package/src/components/common/RedirectModal.tsx +0 -43
- package/src/components/common/SelectField/index.tsx +0 -104
- package/src/components/common/SnackbarAlert.tsx +0 -52
- package/src/components/common/index.tsx +0 -11
- package/src/components/common/socials.tsx +0 -33
- package/src/components/confirmModal/index.tsx +0 -60
- package/src/components/confirmationContainer/config.ts +0 -79
- package/src/components/confirmationContainer/index.tsx +0 -349
- package/src/components/confirmationContainer/social-buttons.tsx +0 -149
- package/src/components/confirmationContainer/style.css +0 -206
- package/src/components/countdown/index.tsx +0 -100
- package/src/components/countdown/style.css +0 -10
- package/src/components/delegationsContainer/IssueComponent.tsx +0 -156
- package/src/components/delegationsContainer/IssueTicketForm.tsx +0 -109
- package/src/components/delegationsContainer/TicketsAssignedTable.tsx +0 -55
- package/src/components/delegationsContainer/TicketsAvailableTable.tsx +0 -54
- package/src/components/delegationsContainer/index.tsx +0 -83
- package/src/components/forgotPasswordModal/index.tsx +0 -138
- package/src/components/forgotPasswordModal/style.css +0 -47
- package/src/components/idVerificationContainer/VerificationPendingModal.tsx +0 -47
- package/src/components/idVerificationContainer/constants.ts +0 -27
- package/src/components/idVerificationContainer/index.tsx +0 -323
- package/src/components/index.ts +0 -12
- package/src/components/loginForm/index.tsx +0 -202
- package/src/components/loginModal/SignUpForm.tsx +0 -329
- package/src/components/loginModal/constants.ts +0 -46
- package/src/components/loginModal/index.tsx +0 -263
- package/src/components/loginModal/style.css +0 -116
- package/src/components/myTicketsContainer/index.tsx +0 -228
- package/src/components/myTicketsContainer/row.tsx +0 -46
- package/src/components/myTicketsContainer/style.css +0 -40
- package/src/components/myTicketsContainer/tableConfig.tsx +0 -80
- package/src/components/myTicketsContainer/types.d.ts +0 -41
- package/src/components/orderDetailsContainer/CustomFieldsForm.tsx +0 -75
- package/src/components/orderDetailsContainer/TicketHolderCustomFields.tsx +0 -100
- package/src/components/orderDetailsContainer/index.tsx +0 -586
- package/src/components/orderDetailsContainer/style.css +0 -77
- package/src/components/orderDetailsContainer/ticketsTable.tsx +0 -246
- package/src/components/orderDetailsContainer/utils/index.tsx +0 -55
- package/src/components/paymentContainer/OrderDetails.tsx +0 -277
- package/src/components/paymentContainer/PaymentPlanSection.tsx +0 -169
- package/src/components/paymentContainer/handlePayment.ts +0 -86
- package/src/components/paymentContainer/index.tsx +0 -643
- package/src/components/paymentContainer/style.css +0 -196
- package/src/components/preRegistration/FieldsSection.tsx +0 -150
- package/src/components/preRegistration/Influancers.tsx +0 -34
- package/src/components/preRegistration/PreRegistrationComplete.tsx +0 -186
- package/src/components/preRegistration/PreRegistrationInformations.tsx +0 -60
- package/src/components/preRegistration/Prewards.tsx +0 -41
- package/src/components/preRegistration/ShareOptions.tsx +0 -77
- package/src/components/preRegistration/constants.tsx +0 -169
- package/src/components/preRegistration/index.tsx +0 -330
- package/src/components/preRegistration/style.css +0 -3
- package/src/components/preRegistration/utils.ts +0 -163
- package/src/components/registerForm/adapters/index.tsx +0 -10
- package/src/components/registerForm/constants.tsx +0 -98
- package/src/components/registerForm/index.tsx +0 -188
- package/src/components/registerModal/index.tsx +0 -154
- package/src/components/registerModal/style.css +0 -18
- package/src/components/resetPasswordContainer/index.tsx +0 -102
- package/src/components/resetPasswordContainer/style.css +0 -36
- package/src/components/rsvpContainer/index.tsx +0 -126
- package/src/components/seatMapContainer/SeatMapComponent.tsx +0 -77
- package/src/components/seatMapContainer/TicketsSection.tsx +0 -286
- package/src/components/seatMapContainer/addToCart.ts +0 -66
- package/src/components/seatMapContainer/index.tsx +0 -443
- package/src/components/seatMapContainer/utils.ts +0 -133
- package/src/components/signupModal/index.tsx +0 -178
- package/src/components/signupModal/style.css +0 -58
- package/src/components/ticketResale/index.tsx +0 -86
- package/src/components/ticketResaleModal/index.tsx +0 -224
- package/src/components/ticketResaleModal/style.css +0 -28
- package/src/components/ticketsContainer/AccessCodeSection.tsx +0 -50
- package/src/components/ticketsContainer/InfoIcon.tsx +0 -35
- package/src/components/ticketsContainer/PromoCodeSection.tsx +0 -116
- package/src/components/ticketsContainer/ReferralLogic.tsx +0 -33
- package/src/components/ticketsContainer/TicketRow.tsx +0 -107
- package/src/components/ticketsContainer/TicketsSection.tsx +0 -350
- package/src/components/ticketsContainer/TimeSlotTicketRow.tsx +0 -243
- package/src/components/ticketsContainer/TimeSlotsSection.tsx +0 -194
- package/src/components/ticketsContainer/index.tsx +0 -986
- package/src/components/ticketsContainer/style.css +0 -178
- package/src/components/ticketsContainer/utils.ts +0 -35
- package/src/components/timerWidget/index.tsx +0 -97
- package/src/components/timerWidget/style.css +0 -35
- package/src/components/waitingList/index.tsx +0 -190
- package/src/components/waitingList/style.css +0 -27
- package/src/constants/index.ts +0 -3
- package/src/env.ts +0 -29
- package/src/hoc/CustomFields/index.tsx +0 -85
- package/src/hoc/index.ts +0 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useCookieListener.ts +0 -32
- package/src/hooks/useEventListener.ts +0 -32
- package/src/hooks/useLocalStorageListener.ts +0 -32
- package/src/hooks/useOnline.ts +0 -21
- package/src/hooks/usePixel.ts +0 -88
- package/src/normalizers/index.ts +0 -49
- package/src/types/add_on.ts +0 -8
- package/src/types/api/auth.d.ts +0 -63
- package/src/types/api/axiosResponse.d.ts +0 -6
- package/src/types/api/cart.d.ts +0 -73
- package/src/types/api/checkout.d.ts +0 -92
- package/src/types/api/common.d.ts +0 -153
- package/src/types/api/guestTicketDelegation.d.ts +0 -18
- package/src/types/api/orders.d.ts +0 -116
- package/src/types/api/payment.d.ts +0 -180
- package/src/types/api/preRegistration.d.ts +0 -11
- package/src/types/api/preRegistrationComplete.d.ts +0 -95
- package/src/types/api/ticketResale.d.ts +0 -13
- package/src/types/billing-info-data.ts +0 -37
- package/src/types/checkoutPageConfigs.ts +0 -13
- package/src/types/formFields.d.ts +0 -29
- package/src/types/index.ts +0 -6
- package/src/types/order-data.ts +0 -16
- package/src/types/payment-field.ts +0 -7
- package/src/types/payment-plan-configuration.ts +0 -19
- package/src/types/pre-registration-complete.d.ts +0 -47
- package/src/types/referral-promotion.ts +0 -7
- package/src/types/seatMap.d.ts +0 -159
- package/src/types/verification.ts +0 -12
- package/src/utils/adaptStripeErrors.ts +0 -26
- package/src/utils/auth.ts +0 -45
- package/src/utils/cookies.ts +0 -73
- package/src/utils/createCheckoutDataBodyWithDefaultHolder.ts +0 -81
- package/src/utils/createMarkup.ts +0 -1
- package/src/utils/customFields.ts +0 -80
- package/src/utils/downloadPDF.tsx +0 -42
- package/src/utils/form.ts +0 -34
- package/src/utils/formikErrorFocus.ts +0 -24
- package/src/utils/getDomain.ts +0 -21
- package/src/utils/getImage.ts +0 -14
- package/src/utils/getQueryVariable.ts +0 -13
- package/src/utils/htmlNodeFromString.ts +0 -6
- package/src/utils/index.ts +0 -15
- package/src/utils/isBrowser.ts +0 -2
- package/src/utils/isValidNumber.ts +0 -8
- package/src/utils/jsonUtils.ts +0 -8
- package/src/utils/replaceVarInString.ts +0 -9
- package/src/utils/setConfigs.ts +0 -24
- package/src/utils/showZero.tsx +0 -10
- package/src/validators/index.ts +0 -61
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<CheckoutProvider>` — wrap your checkout UI once. It:
|
|
3
|
+
* - provides the checkout to every section via context — so `<Tickets/>`,
|
|
4
|
+
* `<Payment/>`, … just read it, no prop-drilling. By default it runs
|
|
5
|
+
* `useCheckout()` for you (the web-wired engine: Stripe/Xendit + shared
|
|
6
|
+
* store); pass your own instance as `value` to bring your own;
|
|
7
|
+
* - applies the `theme` as `--tf-checkout-*` CSS variables on its root and
|
|
8
|
+
* scopes all styles under `.tf-checkout`.
|
|
9
|
+
*
|
|
10
|
+
* This is the single styling + context boundary shared by all three usage
|
|
11
|
+
* tiers: the batteries-included `<EmbeddedCheckout/>`, à-la-carte sections, and (via
|
|
12
|
+
* `value`) a consumer who already holds a `useCheckout()` of their own.
|
|
13
|
+
*
|
|
14
|
+
* Styles load automatically from the package entry point.
|
|
15
|
+
*/
|
|
16
|
+
import React, {
|
|
17
|
+
createContext,
|
|
18
|
+
useCallback,
|
|
19
|
+
useContext,
|
|
20
|
+
useEffect,
|
|
21
|
+
useRef,
|
|
22
|
+
useState,
|
|
23
|
+
type FC,
|
|
24
|
+
type ReactNode,
|
|
25
|
+
} from 'react'
|
|
26
|
+
|
|
27
|
+
import type { LocaleCode, Messages, UseCheckout } from 'tf-checkout-shared'
|
|
28
|
+
|
|
29
|
+
import { useCheckout } from '../useCheckout'
|
|
30
|
+
import { cx } from './cx'
|
|
31
|
+
import { I18nProvider } from './I18nProvider'
|
|
32
|
+
import { useInstallmentPicker } from './InstallmentPicker'
|
|
33
|
+
import { themeToVars, type CheckoutTheme } from './theme'
|
|
34
|
+
|
|
35
|
+
const CheckoutCtx = createContext<UseCheckout | null>(null)
|
|
36
|
+
const CheckoutValidationCtx = createContext<{
|
|
37
|
+
attempt: number
|
|
38
|
+
requestValidation: () => void
|
|
39
|
+
} | null>(null)
|
|
40
|
+
|
|
41
|
+
export interface CheckoutProviderProps {
|
|
42
|
+
/**
|
|
43
|
+
* Bring your own checkout instance (from a top-level `useCheckout()`). Omit
|
|
44
|
+
* and the provider runs `useCheckout()` itself. Either way the sections read
|
|
45
|
+
* the same shared cart (the engine store is a module singleton).
|
|
46
|
+
*/
|
|
47
|
+
value?: UseCheckout
|
|
48
|
+
/** Retheme via design tokens. */
|
|
49
|
+
theme?: CheckoutTheme
|
|
50
|
+
/**
|
|
51
|
+
* Language for the checkout's own copy. Defaults to `en-GB`, so omitting it
|
|
52
|
+
* leaves every existing consumer's rendering byte-for-byte unchanged.
|
|
53
|
+
*/
|
|
54
|
+
locale?: LocaleCode
|
|
55
|
+
/**
|
|
56
|
+
* Per-key overrides merged over the locale, for brands that need to reword
|
|
57
|
+
* individual strings without shipping a whole catalogue.
|
|
58
|
+
*/
|
|
59
|
+
messages?: Partial<Messages>
|
|
60
|
+
/** Extra class on the `.tf-checkout` root. */
|
|
61
|
+
className?: string
|
|
62
|
+
children: ReactNode
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The `.tf-checkout` root + context — given a resolved checkout instance. */
|
|
66
|
+
const CheckoutRoot: FC<{
|
|
67
|
+
checkout: UseCheckout
|
|
68
|
+
theme?: CheckoutTheme
|
|
69
|
+
className?: string
|
|
70
|
+
children: ReactNode
|
|
71
|
+
}> = ({ checkout, theme, className, children }) => {
|
|
72
|
+
const rootRef = useRef<HTMLDivElement | null>(null)
|
|
73
|
+
const [attempt, setAttempt] = useState(0)
|
|
74
|
+
const requestValidation = useCallback(() => setAttempt((current) => current + 1), [])
|
|
75
|
+
|
|
76
|
+
// Every section marks its own invalid controls. Keeping the navigation here
|
|
77
|
+
// makes validation work for EmbeddedCheckout and for consumers composing the
|
|
78
|
+
// sections themselves.
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (attempt === 0) return
|
|
81
|
+
const frame = window.requestAnimationFrame(() => {
|
|
82
|
+
const invalid = rootRef.current?.querySelector<HTMLElement>(
|
|
83
|
+
'[data-checkout-invalid="true"]'
|
|
84
|
+
)
|
|
85
|
+
if (!invalid) return
|
|
86
|
+
const behavior = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches
|
|
87
|
+
? 'auto'
|
|
88
|
+
: 'smooth'
|
|
89
|
+
invalid.scrollIntoView({ behavior, block: 'center' })
|
|
90
|
+
const focusTarget = invalid.matches('input, select, textarea, button')
|
|
91
|
+
? invalid
|
|
92
|
+
: invalid.querySelector<HTMLElement>('input, select, textarea, button')
|
|
93
|
+
focusTarget?.focus({ preventScroll: true })
|
|
94
|
+
})
|
|
95
|
+
return () => window.cancelAnimationFrame(frame)
|
|
96
|
+
}, [attempt])
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<CheckoutCtx.Provider value={checkout}>
|
|
100
|
+
<CheckoutValidationCtx.Provider value={{ attempt, requestValidation }}>
|
|
101
|
+
<div
|
|
102
|
+
ref={rootRef}
|
|
103
|
+
className={cx(
|
|
104
|
+
'tf-checkout',
|
|
105
|
+
// No colorScheme → auto-follow the OS/browser (prefers-color-scheme).
|
|
106
|
+
// Set it to force one: 'dark' → --dark, 'light' → --light (opt out of auto-dark).
|
|
107
|
+
theme?.colorScheme === 'dark' && 'tf-checkout--dark',
|
|
108
|
+
theme?.colorScheme === 'light' && 'tf-checkout--light',
|
|
109
|
+
className
|
|
110
|
+
)}
|
|
111
|
+
style={themeToVars(theme)}
|
|
112
|
+
>
|
|
113
|
+
{children}
|
|
114
|
+
</div>
|
|
115
|
+
</CheckoutValidationCtx.Provider>
|
|
116
|
+
</CheckoutCtx.Provider>
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Default path: the provider owns the `useCheckout()` call. Wires the MSI
|
|
121
|
+
* installment picker so Mexican card payments can split into installments. */
|
|
122
|
+
const SelfProvidedCheckout: FC<Omit<CheckoutProviderProps, 'value'>> = ({
|
|
123
|
+
children,
|
|
124
|
+
...rest
|
|
125
|
+
}) => {
|
|
126
|
+
const { onInstallmentOffers, picker } = useInstallmentPicker()
|
|
127
|
+
const checkout = useCheckout({ ports: { onInstallmentOffers } })
|
|
128
|
+
return (
|
|
129
|
+
<CheckoutRoot checkout={checkout} {...rest}>
|
|
130
|
+
{children}
|
|
131
|
+
{picker}
|
|
132
|
+
</CheckoutRoot>
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export const CheckoutProvider: FC<CheckoutProviderProps> = ({
|
|
137
|
+
value,
|
|
138
|
+
locale,
|
|
139
|
+
messages,
|
|
140
|
+
...rest
|
|
141
|
+
}) => (
|
|
142
|
+
// I18n wraps the whole checkout tree so every section can call `useT()`.
|
|
143
|
+
// Outside CheckoutRoot so the translator is in scope for the provider's own
|
|
144
|
+
// children as well as the sections.
|
|
145
|
+
<I18nProvider locale={locale} messages={messages}>
|
|
146
|
+
{
|
|
147
|
+
// `value` present ⇒ don't call `useCheckout()` at all (no second
|
|
148
|
+
// binding); absent ⇒ the self-providing branch owns it. The choice is
|
|
149
|
+
// static per mount, so the two branches never swap and violate the rules
|
|
150
|
+
// of hooks.
|
|
151
|
+
value ? <CheckoutRoot checkout={value} {...rest} /> : <SelfProvidedCheckout {...rest} />
|
|
152
|
+
}
|
|
153
|
+
</I18nProvider>
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
/** Read the shared checkout inside any component under `<CheckoutProvider>`. */
|
|
157
|
+
export const useCheckoutContext = (): UseCheckout => {
|
|
158
|
+
const ctx = useContext(CheckoutCtx)
|
|
159
|
+
if (!ctx) {
|
|
160
|
+
throw new Error('useCheckoutContext must be used within <CheckoutProvider>.')
|
|
161
|
+
}
|
|
162
|
+
return ctx
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Coordinate submit-attempt validation across separately composed sections. */
|
|
166
|
+
export const useCheckoutValidation = () => {
|
|
167
|
+
const ctx = useContext(CheckoutValidationCtx)
|
|
168
|
+
if (!ctx) {
|
|
169
|
+
throw new Error('useCheckoutValidation must be used within <CheckoutProvider>.')
|
|
170
|
+
}
|
|
171
|
+
return ctx
|
|
172
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-driven custom fields. The event describes what to collect
|
|
3
|
+
* (`EventCustomField[]`, order- / ticket- / add-on-scoped); these render it —
|
|
4
|
+
* text, textarea, phone, email, select, radio, checkbox, multi-select — and
|
|
5
|
+
* report values back. No per-brand form code: pass the group, hold the values.
|
|
6
|
+
*
|
|
7
|
+
* const [vals, setVals] = useState<CustomFieldValues>({})
|
|
8
|
+
* <CustomFieldGroupFields group={group} values={vals}
|
|
9
|
+
* onChange={(name, v) => setVals(s => ({ ...s, [name]: v }))} />
|
|
10
|
+
*/
|
|
11
|
+
import React, { type FC, type ReactNode } from 'react'
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
CustomFieldValues,
|
|
15
|
+
EventCustomField,
|
|
16
|
+
EventCustomFieldGroup,
|
|
17
|
+
} from 'tf-checkout-shared'
|
|
18
|
+
import { ticketFieldsFor } from 'tf-checkout-shared'
|
|
19
|
+
|
|
20
|
+
import { Checkbox, Field, Input, Select, Textarea } from './Field'
|
|
21
|
+
|
|
22
|
+
type FieldValue = string | string[]
|
|
23
|
+
|
|
24
|
+
const asString = (v: FieldValue | undefined): string =>
|
|
25
|
+
Array.isArray(v) ? (v[0] ?? '') : (v ?? '')
|
|
26
|
+
const asArray = (v: FieldValue | undefined): string[] =>
|
|
27
|
+
Array.isArray(v) ? v : v ? [v] : []
|
|
28
|
+
|
|
29
|
+
export interface CustomFieldInputProps {
|
|
30
|
+
field: EventCustomField
|
|
31
|
+
value: FieldValue | undefined
|
|
32
|
+
onChange: (value: FieldValue) => void
|
|
33
|
+
error?: ReactNode
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Render one custom field by its declared `type`. */
|
|
37
|
+
export const CustomFieldInput: FC<CustomFieldInputProps> = ({
|
|
38
|
+
field,
|
|
39
|
+
value,
|
|
40
|
+
onChange,
|
|
41
|
+
error,
|
|
42
|
+
}) => {
|
|
43
|
+
const label = `${field.label}${field.required ? ' *' : ''}`
|
|
44
|
+
const invalid = error != null
|
|
45
|
+
const desc = field.description ? (
|
|
46
|
+
<span className="tf-checkout-field__hint">{field.description}</span>
|
|
47
|
+
) : undefined
|
|
48
|
+
|
|
49
|
+
switch (field.type) {
|
|
50
|
+
case 'textarea':
|
|
51
|
+
return (
|
|
52
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
53
|
+
{desc}
|
|
54
|
+
<Textarea
|
|
55
|
+
value={asString(value)}
|
|
56
|
+
invalid={invalid}
|
|
57
|
+
aria-invalid={invalid}
|
|
58
|
+
onChange={(e) => onChange(e.target.value)}
|
|
59
|
+
/>
|
|
60
|
+
</Field>
|
|
61
|
+
)
|
|
62
|
+
case 'select':
|
|
63
|
+
return (
|
|
64
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
65
|
+
{desc}
|
|
66
|
+
<Select
|
|
67
|
+
value={asString(value)}
|
|
68
|
+
invalid={invalid}
|
|
69
|
+
aria-invalid={invalid}
|
|
70
|
+
onChange={(e) => onChange(e.target.value)}
|
|
71
|
+
>
|
|
72
|
+
<option value="">— select —</option>
|
|
73
|
+
{field.options.map((o) => (
|
|
74
|
+
<option key={o.id} value={o.value}>
|
|
75
|
+
{o.name}
|
|
76
|
+
</option>
|
|
77
|
+
))}
|
|
78
|
+
</Select>
|
|
79
|
+
</Field>
|
|
80
|
+
)
|
|
81
|
+
case 'radio':
|
|
82
|
+
return (
|
|
83
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
84
|
+
{desc}
|
|
85
|
+
<div className="tf-checkout-choices">
|
|
86
|
+
{field.options.map((o) => (
|
|
87
|
+
<label key={o.id} className="tf-checkout-choice">
|
|
88
|
+
<input
|
|
89
|
+
type="radio"
|
|
90
|
+
name={field.name}
|
|
91
|
+
checked={asString(value) === o.value}
|
|
92
|
+
onChange={() => onChange(o.value)}
|
|
93
|
+
/>
|
|
94
|
+
<span>{o.name}</span>
|
|
95
|
+
</label>
|
|
96
|
+
))}
|
|
97
|
+
</div>
|
|
98
|
+
</Field>
|
|
99
|
+
)
|
|
100
|
+
case 'select_multi': {
|
|
101
|
+
const picked = asArray(value)
|
|
102
|
+
const toggle = (v: string, on: boolean) =>
|
|
103
|
+
onChange(on ? [...picked, v] : picked.filter((x) => x !== v))
|
|
104
|
+
return (
|
|
105
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
106
|
+
{desc}
|
|
107
|
+
<div className="tf-checkout-choices">
|
|
108
|
+
{field.options.map((o) => (
|
|
109
|
+
<Checkbox
|
|
110
|
+
key={o.id}
|
|
111
|
+
checked={picked.includes(o.value)}
|
|
112
|
+
onChange={(e) => toggle(o.value, e.target.checked)}
|
|
113
|
+
label={o.name}
|
|
114
|
+
/>
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
</Field>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
case 'checkbox':
|
|
121
|
+
return (
|
|
122
|
+
<div
|
|
123
|
+
className={invalid ? 'tf-checkout-consent--error' : undefined}
|
|
124
|
+
data-checkout-invalid={invalid || undefined}
|
|
125
|
+
>
|
|
126
|
+
<Checkbox
|
|
127
|
+
checked={asString(value) === '1'}
|
|
128
|
+
aria-invalid={invalid}
|
|
129
|
+
onChange={(e) => onChange(e.target.checked ? '1' : '')}
|
|
130
|
+
label={label}
|
|
131
|
+
/>
|
|
132
|
+
{error != null && <div className="tf-checkout-consent__error">{error}</div>}
|
|
133
|
+
</div>
|
|
134
|
+
)
|
|
135
|
+
case 'image':
|
|
136
|
+
// File capture needs an upload rail the SDK doesn't own yet — surface it
|
|
137
|
+
// rather than silently dropping a required field.
|
|
138
|
+
return (
|
|
139
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
140
|
+
{desc}
|
|
141
|
+
<span className="tf-checkout-note">
|
|
142
|
+
Image upload isn’t supported in this build.
|
|
143
|
+
</span>
|
|
144
|
+
</Field>
|
|
145
|
+
)
|
|
146
|
+
default:
|
|
147
|
+
// text / phone / email
|
|
148
|
+
return (
|
|
149
|
+
<Field label={label} error={error} invalid={invalid}>
|
|
150
|
+
{desc}
|
|
151
|
+
<Input
|
|
152
|
+
type={
|
|
153
|
+
field.type === 'email' ? 'email' : field.type === 'phone' ? 'tel' : 'text'
|
|
154
|
+
}
|
|
155
|
+
value={asString(value)}
|
|
156
|
+
invalid={invalid}
|
|
157
|
+
aria-invalid={invalid}
|
|
158
|
+
onChange={(e) => onChange(e.target.value)}
|
|
159
|
+
/>
|
|
160
|
+
</Field>
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface CustomFieldGroupFieldsProps {
|
|
166
|
+
group: EventCustomFieldGroup
|
|
167
|
+
values: CustomFieldValues
|
|
168
|
+
onChange: (name: string, value: FieldValue) => void
|
|
169
|
+
/** Restrict to fields scoped to this holder's ticket type (ticket groups). */
|
|
170
|
+
ticketTypeId?: string
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Render every field in a group, wired to a values map. */
|
|
174
|
+
export const CustomFieldGroupFields: FC<CustomFieldGroupFieldsProps> = ({
|
|
175
|
+
group,
|
|
176
|
+
values,
|
|
177
|
+
onChange,
|
|
178
|
+
ticketTypeId,
|
|
179
|
+
}) => (
|
|
180
|
+
<>
|
|
181
|
+
{ticketFieldsFor(group.fields, ticketTypeId).map((f) => (
|
|
182
|
+
<CustomFieldInput
|
|
183
|
+
key={f.id}
|
|
184
|
+
field={f}
|
|
185
|
+
value={values[f.name]}
|
|
186
|
+
onChange={(v) => onChange(f.name, v)}
|
|
187
|
+
/>
|
|
188
|
+
))}
|
|
189
|
+
</>
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
/** True when every required field in the group has a non-empty value.
|
|
193
|
+
* Re-exported from the SDK so web, native and the engine preflight all apply
|
|
194
|
+
* one rule (including its "image uploads are server-authoritative" carve-out). */
|
|
195
|
+
export { customFieldsComplete } from 'tf-checkout-shared'
|
package/src/ui/Field.tsx
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
forwardRef,
|
|
3
|
+
type FC,
|
|
4
|
+
type InputHTMLAttributes,
|
|
5
|
+
type ReactNode,
|
|
6
|
+
type SelectHTMLAttributes,
|
|
7
|
+
type TextareaHTMLAttributes,
|
|
8
|
+
} from 'react'
|
|
9
|
+
|
|
10
|
+
import { cx } from './cx'
|
|
11
|
+
|
|
12
|
+
/** Labeled wrapper — owns the label + error row so controls stay consistent. */
|
|
13
|
+
export const Field: FC<{
|
|
14
|
+
label?: ReactNode
|
|
15
|
+
error?: ReactNode
|
|
16
|
+
invalid?: boolean
|
|
17
|
+
className?: string
|
|
18
|
+
children: ReactNode
|
|
19
|
+
}> = ({ label, error, invalid, className, children }) => (
|
|
20
|
+
<label
|
|
21
|
+
className={cx(
|
|
22
|
+
'tf-checkout-field',
|
|
23
|
+
invalid && 'tf-checkout-field--invalid',
|
|
24
|
+
className
|
|
25
|
+
)}
|
|
26
|
+
data-checkout-invalid={invalid || undefined}
|
|
27
|
+
>
|
|
28
|
+
{label != null && <span className="tf-checkout-field__label">{label}</span>}
|
|
29
|
+
{children}
|
|
30
|
+
{error != null && (
|
|
31
|
+
<span className="tf-checkout-field__error" role="alert">
|
|
32
|
+
{error}
|
|
33
|
+
</span>
|
|
34
|
+
)}
|
|
35
|
+
</label>
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
/** Lay out two fields side by side. */
|
|
39
|
+
export const FieldRow: FC<{ className?: string; children: ReactNode }> = ({
|
|
40
|
+
className,
|
|
41
|
+
children,
|
|
42
|
+
}) => (
|
|
43
|
+
<div className={cx('tf-checkout-field', 'tf-checkout-field--row', className)}>
|
|
44
|
+
{children}
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
49
|
+
invalid?: boolean
|
|
50
|
+
}
|
|
51
|
+
export const Input = forwardRef<HTMLInputElement, InputProps>(
|
|
52
|
+
({ invalid, className, ...rest }, ref) => (
|
|
53
|
+
<input
|
|
54
|
+
ref={ref}
|
|
55
|
+
className={cx(
|
|
56
|
+
'tf-checkout-input',
|
|
57
|
+
invalid && 'tf-checkout-input--invalid',
|
|
58
|
+
className
|
|
59
|
+
)}
|
|
60
|
+
{...rest}
|
|
61
|
+
/>
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
Input.displayName = 'Input'
|
|
65
|
+
|
|
66
|
+
export interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
67
|
+
invalid?: boolean
|
|
68
|
+
}
|
|
69
|
+
export const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|
70
|
+
({ invalid, className, ...rest }, ref) => (
|
|
71
|
+
<textarea
|
|
72
|
+
ref={ref}
|
|
73
|
+
className={cx(
|
|
74
|
+
'tf-checkout-input',
|
|
75
|
+
'tf-checkout-textarea',
|
|
76
|
+
invalid && 'tf-checkout-input--invalid',
|
|
77
|
+
className
|
|
78
|
+
)}
|
|
79
|
+
{...rest}
|
|
80
|
+
/>
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
Textarea.displayName = 'Textarea'
|
|
84
|
+
|
|
85
|
+
export interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
|
|
86
|
+
invalid?: boolean
|
|
87
|
+
}
|
|
88
|
+
export const Select = forwardRef<HTMLSelectElement, SelectProps>(
|
|
89
|
+
({ invalid, className, children, ...rest }, ref) => (
|
|
90
|
+
<select
|
|
91
|
+
ref={ref}
|
|
92
|
+
className={cx(
|
|
93
|
+
'tf-checkout-select',
|
|
94
|
+
invalid && 'tf-checkout-select--invalid',
|
|
95
|
+
className
|
|
96
|
+
)}
|
|
97
|
+
{...rest}
|
|
98
|
+
>
|
|
99
|
+
{children}
|
|
100
|
+
</select>
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
Select.displayName = 'Select'
|
|
104
|
+
|
|
105
|
+
export interface CheckboxProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
106
|
+
label?: ReactNode
|
|
107
|
+
}
|
|
108
|
+
/** A checkbox is its own label — don't wrap it in `<Field>`. */
|
|
109
|
+
export const Checkbox: FC<CheckboxProps> = ({ label, className, ...rest }) => (
|
|
110
|
+
<label className={cx('tf-checkout-checkbox', className)}>
|
|
111
|
+
<input type="checkbox" className="tf-checkout-checkbox__box" {...rest} />
|
|
112
|
+
{label != null && <span className="tf-checkout-checkbox__label">{label}</span>}
|
|
113
|
+
</label>
|
|
114
|
+
)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { createContext, useContext, useMemo, type FC, type ReactNode } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
createTranslator,
|
|
4
|
+
DEFAULT_LOCALE,
|
|
5
|
+
type LocaleCode,
|
|
6
|
+
type Messages,
|
|
7
|
+
type Translate,
|
|
8
|
+
} from 'tf-checkout-shared'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* React binding for the shared core's translator.
|
|
12
|
+
*
|
|
13
|
+
* The resolution itself lives in `tf-checkout-shared` so native gets the same
|
|
14
|
+
* behaviour; this file only carries it through React context.
|
|
15
|
+
*
|
|
16
|
+
* The default context value is a real English translator, not null, so any
|
|
17
|
+
* component calling `useT()` outside a provider still renders correct copy.
|
|
18
|
+
* That keeps this change backwards compatible: a host that never passes
|
|
19
|
+
* `locale` sees exactly the strings it saw before.
|
|
20
|
+
*/
|
|
21
|
+
const I18nCtx = createContext<Translate>(createTranslator({ locale: DEFAULT_LOCALE }))
|
|
22
|
+
|
|
23
|
+
export interface I18nProviderProps {
|
|
24
|
+
locale?: LocaleCode
|
|
25
|
+
/** Per-key overrides, merged over the locale. */
|
|
26
|
+
messages?: Partial<Messages>
|
|
27
|
+
children?: ReactNode
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const I18nProvider: FC<I18nProviderProps> = ({ locale, messages, children }) => {
|
|
31
|
+
const t = useMemo(() => createTranslator({ locale, messages }), [locale, messages])
|
|
32
|
+
return <I18nCtx.Provider value={t}>{children}</I18nCtx.Provider>
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Returns the active translator. Safe to call anywhere in the SDK tree. */
|
|
36
|
+
export const useT = (): Translate => useContext(I18nCtx)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MSI (meses sin intereses) picker. Mexican card payments can be split into
|
|
3
|
+
* interest-free installments: mid-payment the engine calls `onInstallmentOffers`
|
|
4
|
+
* with the available plans and waits for the buyer's choice. This hook bridges
|
|
5
|
+
* that callback to an overlay — `<CheckoutProvider>` wires it by default, so
|
|
6
|
+
* `<EmbeddedCheckout/>` gets MSI for free. Returns the port + the overlay to render.
|
|
7
|
+
*/
|
|
8
|
+
import React, { useCallback, useState } from 'react'
|
|
9
|
+
|
|
10
|
+
import type { InstallmentOffer } from 'tf-checkout-shared'
|
|
11
|
+
|
|
12
|
+
import { Button } from './Button'
|
|
13
|
+
|
|
14
|
+
export const useInstallmentPicker = () => {
|
|
15
|
+
const [pending, setPending] = useState<{
|
|
16
|
+
offers: InstallmentOffer[]
|
|
17
|
+
resolve: (o: InstallmentOffer | null) => void
|
|
18
|
+
} | null>(null)
|
|
19
|
+
|
|
20
|
+
// Stable across renders (useCheckout reads ports once) — resolves when the
|
|
21
|
+
// buyer picks a plan (or declines) below.
|
|
22
|
+
const onInstallmentOffers = useCallback(
|
|
23
|
+
(offers: InstallmentOffer[]) =>
|
|
24
|
+
new Promise<InstallmentOffer | null>((resolve) => setPending({ offers, resolve })),
|
|
25
|
+
[]
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
const choose = (o: InstallmentOffer | null) => {
|
|
29
|
+
pending?.resolve(o)
|
|
30
|
+
setPending(null)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const picker = pending ? (
|
|
34
|
+
<div
|
|
35
|
+
className="tf-checkout-installments"
|
|
36
|
+
role="dialog"
|
|
37
|
+
aria-label="Choose installments"
|
|
38
|
+
>
|
|
39
|
+
<div className="tf-checkout-installments__box">
|
|
40
|
+
<strong>Pay in installments?</strong>
|
|
41
|
+
<div className="tf-checkout-installments__list">
|
|
42
|
+
{pending.offers.map((o, i) => (
|
|
43
|
+
<button
|
|
44
|
+
key={i}
|
|
45
|
+
type="button"
|
|
46
|
+
className="tf-checkout-installments__opt"
|
|
47
|
+
onClick={() => choose(o)}
|
|
48
|
+
>
|
|
49
|
+
<span>
|
|
50
|
+
{o.count} × {o.per_installment_formatted ?? o.per_installment}
|
|
51
|
+
</span>
|
|
52
|
+
<span className="tf-checkout-installments__meta">
|
|
53
|
+
{o.total_formatted ? `${o.total_formatted} total` : ''}
|
|
54
|
+
{o.diff_from_original_formatted
|
|
55
|
+
? ` · ${o.diff_from_original_formatted}`
|
|
56
|
+
: ''}
|
|
57
|
+
</span>
|
|
58
|
+
</button>
|
|
59
|
+
))}
|
|
60
|
+
</div>
|
|
61
|
+
<Button variant="ghost" block onClick={() => choose(null)}>
|
|
62
|
+
Pay in full instead
|
|
63
|
+
</Button>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
) : null
|
|
67
|
+
|
|
68
|
+
return { onInstallmentOffers, picker }
|
|
69
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React, { type FC } from 'react'
|
|
2
|
+
|
|
3
|
+
import { cx } from './cx'
|
|
4
|
+
|
|
5
|
+
/** A spinner that inherits `currentColor` (so it works inside buttons/text). */
|
|
6
|
+
export const Loader: FC<{ className?: string }> = ({ className }) => (
|
|
7
|
+
<span
|
|
8
|
+
className={cx('tf-checkout-loader', className)}
|
|
9
|
+
role="status"
|
|
10
|
+
aria-label="Loading"
|
|
11
|
+
/>
|
|
12
|
+
)
|