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.
Files changed (453) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +141 -1033
  3. package/dist/checkout.css +17 -0
  4. package/dist/index.d.mts +3930 -0
  5. package/dist/index.d.ts +3930 -30
  6. package/dist/index.esm.js +9123 -0
  7. package/dist/index.esm.js.map +1 -0
  8. package/dist/index.js +9277 -6
  9. package/dist/index.js.map +1 -0
  10. package/dist/styles/addons.css +75 -0
  11. package/dist/styles/auth.css +294 -0
  12. package/dist/styles/billing.css +98 -0
  13. package/dist/styles/confirmation.css +51 -0
  14. package/dist/styles/foundation.css +146 -0
  15. package/dist/styles/payment.css +179 -0
  16. package/dist/styles/primitives.css +356 -0
  17. package/dist/styles/seat-map.css +46 -0
  18. package/dist/styles/tickets.css +285 -0
  19. package/dist/styles/verification-confirmation.css +258 -0
  20. package/package.json +93 -78
  21. package/src/.d.ts +1 -1
  22. package/src/CardInput.tsx +374 -0
  23. package/src/EmbeddedCheckout.tsx +400 -0
  24. package/src/ResumedCheckout.tsx +132 -0
  25. package/src/auth/AuthModal.tsx +231 -0
  26. package/src/auth/ForgotPasswordForm.tsx +93 -0
  27. package/src/auth/LoginForm.tsx +104 -0
  28. package/src/auth/PasswordInput.tsx +33 -0
  29. package/src/auth/RegisterForm.tsx +333 -0
  30. package/src/auth/ResetPasswordForm.tsx +112 -0
  31. package/src/auth/index.ts +5 -0
  32. package/src/checkout.css +17 -0
  33. package/src/configure.ts +29 -0
  34. package/src/confirmer.ts +439 -0
  35. package/src/index.ts +41 -30
  36. package/src/instance.ts +21 -0
  37. package/src/sections/AddOns.tsx +241 -0
  38. package/src/sections/BillingInfo.tsx +743 -0
  39. package/src/sections/Confirmation.tsx +146 -0
  40. package/src/sections/IDVerification.tsx +76 -0
  41. package/src/sections/OrderConfirmation.tsx +277 -0
  42. package/src/sections/OrderIDVerification.tsx +117 -0
  43. package/src/sections/OrderSummary.tsx +84 -0
  44. package/src/sections/Payment.tsx +541 -0
  45. package/src/sections/SeatMap.tsx +512 -0
  46. package/src/sections/Tickets.tsx +573 -0
  47. package/src/sections/billing/BillingAddressFields.tsx +138 -0
  48. package/src/sections/billing/BuyerField.tsx +75 -0
  49. package/src/sections/billing/TicketHoldersCard.tsx +119 -0
  50. package/src/sections/billing/types.ts +10 -0
  51. package/src/sections/index.ts +15 -0
  52. package/src/sections/seatMap.utils.ts +105 -0
  53. package/src/styles/addons.css +75 -0
  54. package/src/styles/auth.css +294 -0
  55. package/src/styles/billing.css +98 -0
  56. package/src/styles/confirmation.css +51 -0
  57. package/src/styles/foundation.css +146 -0
  58. package/src/styles/payment.css +179 -0
  59. package/src/styles/primitives.css +356 -0
  60. package/src/styles/seat-map.css +46 -0
  61. package/src/styles/tickets.css +285 -0
  62. package/src/styles/verification-confirmation.css +258 -0
  63. package/src/typings.d.ts +2 -2
  64. package/src/ui/Button.tsx +38 -0
  65. package/src/ui/Card.tsx +54 -0
  66. package/src/ui/CheckoutProvider.tsx +172 -0
  67. package/src/ui/CustomFields.tsx +195 -0
  68. package/src/ui/Field.tsx +114 -0
  69. package/src/ui/I18nProvider.tsx +36 -0
  70. package/src/ui/InstallmentPicker.tsx +69 -0
  71. package/src/ui/Loader.tsx +12 -0
  72. package/src/ui/PaymentMethods.tsx +133 -0
  73. package/src/ui/PriceLine.tsx +24 -0
  74. package/src/ui/QuantitySelect.tsx +50 -0
  75. package/src/ui/Stepper.tsx +36 -0
  76. package/src/ui/Timer.tsx +34 -0
  77. package/src/ui/TimerBanner.tsx +55 -0
  78. package/src/ui/cx.ts +3 -0
  79. package/src/ui/index.ts +54 -0
  80. package/src/ui/theme.ts +83 -0
  81. package/src/useCheckout.ts +35 -0
  82. package/src/xendit.ts +438 -0
  83. package/dist/adapters/customFields.d.ts +0 -12
  84. package/dist/adapters/index.d.ts +0 -1
  85. package/dist/api/auth.d.ts +0 -27
  86. package/dist/api/cart.d.ts +0 -2
  87. package/dist/api/checkout.d.ts +0 -3
  88. package/dist/api/common.d.ts +0 -11
  89. package/dist/api/guestTicketDelegation.d.ts +0 -47
  90. package/dist/api/index.d.ts +0 -82
  91. package/dist/api/interceptors.d.ts +0 -1
  92. package/dist/api/orders.d.ts +0 -2
  93. package/dist/api/payment.d.ts +0 -5
  94. package/dist/api/preRegistrationComplete.d.ts +0 -3
  95. package/dist/api/publicRequest.d.ts +0 -9
  96. package/dist/api/resale.d.ts +0 -5
  97. package/dist/components/account-settings/index.d.ts +0 -3
  98. package/dist/components/addonsContainer/AddonComponent.d.ts +0 -18
  99. package/dist/components/addonsContainer/SimpleAddonsContainer.d.ts +0 -20
  100. package/dist/components/addonsContainer/adapters/index.d.ts +0 -12
  101. package/dist/components/addonsContainer/index.d.ts +0 -22
  102. package/dist/components/addonsContainer/normalizers/index.d.ts +0 -1
  103. package/dist/components/addonsContainer/useAddons.d.ts +0 -23
  104. package/dist/components/addonsContainer/utils/index.d.ts +0 -16
  105. package/dist/components/billing-info-container/hooks/index.d.ts +0 -3
  106. package/dist/components/billing-info-container/hooks/usePaymentContext.d.ts +0 -5
  107. package/dist/components/billing-info-container/hooks/usePaymentRedirect.d.ts +0 -14
  108. package/dist/components/billing-info-container/hooks/useStripePayment.d.ts +0 -18
  109. package/dist/components/billing-info-container/index.d.ts +0 -69
  110. package/dist/components/billing-info-container/utils.d.ts +0 -59
  111. package/dist/components/common/Checkbox.d.ts +0 -11
  112. package/dist/components/common/CheckboxField/index.d.ts +0 -9
  113. package/dist/components/common/CopyField.d.ts +0 -12
  114. package/dist/components/common/CopyMessageModal.d.ts +0 -7
  115. package/dist/components/common/CustomField.d.ts +0 -26
  116. package/dist/components/common/DatePickerField.d.ts +0 -20
  117. package/dist/components/common/FieldSection/index.d.ts +0 -19
  118. package/dist/components/common/FieldSection/utils/index.d.ts +0 -8
  119. package/dist/components/common/FormikPhoneNumberField.d.ts +0 -11
  120. package/dist/components/common/Loader.d.ts +0 -2
  121. package/dist/components/common/ModalComponent/index.d.ts +0 -16
  122. package/dist/components/common/NativeSelectFeild/index.d.ts +0 -21
  123. package/dist/components/common/PhoneNumberField.d.ts +0 -14
  124. package/dist/components/common/PoweredBy.d.ts +0 -2
  125. package/dist/components/common/RadioField.d.ts +0 -11
  126. package/dist/components/common/RadioGroupField/index.d.ts +0 -17
  127. package/dist/components/common/RedirectModal.d.ts +0 -7
  128. package/dist/components/common/SelectField/index.d.ts +0 -19
  129. package/dist/components/common/SnackbarAlert.d.ts +0 -13
  130. package/dist/components/common/index.d.ts +0 -11
  131. package/dist/components/common/socials.d.ts +0 -10
  132. package/dist/components/confirmModal/index.d.ts +0 -10
  133. package/dist/components/confirmationContainer/config.d.ts +0 -1
  134. package/dist/components/confirmationContainer/index.d.ts +0 -46
  135. package/dist/components/confirmationContainer/social-buttons.d.ts +0 -16
  136. package/dist/components/countdown/index.d.ts +0 -14
  137. package/dist/components/delegationsContainer/IssueComponent.d.ts +0 -10
  138. package/dist/components/delegationsContainer/IssueTicketForm.d.ts +0 -9
  139. package/dist/components/delegationsContainer/TicketsAssignedTable.d.ts +0 -11
  140. package/dist/components/delegationsContainer/TicketsAvailableTable.d.ts +0 -11
  141. package/dist/components/delegationsContainer/index.d.ts +0 -10
  142. package/dist/components/forgotPasswordModal/index.d.ts +0 -12
  143. package/dist/components/idVerificationContainer/VerificationPendingModal.d.ts +0 -10
  144. package/dist/components/idVerificationContainer/constants.d.ts +0 -21
  145. package/dist/components/idVerificationContainer/index.d.ts +0 -16
  146. package/dist/components/index.d.ts +0 -12
  147. package/dist/components/loginForm/index.d.ts +0 -31
  148. package/dist/components/loginModal/SignUpForm.d.ts +0 -10
  149. package/dist/components/loginModal/constants.d.ts +0 -39
  150. package/dist/components/loginModal/index.d.ts +0 -22
  151. package/dist/components/myTicketsContainer/index.d.ts +0 -16
  152. package/dist/components/myTicketsContainer/row.d.ts +0 -3
  153. package/dist/components/myTicketsContainer/tableConfig.d.ts +0 -5
  154. package/dist/components/orderDetailsContainer/CustomFieldsForm.d.ts +0 -12
  155. package/dist/components/orderDetailsContainer/TicketHolderCustomFields.d.ts +0 -10
  156. package/dist/components/orderDetailsContainer/index.d.ts +0 -66
  157. package/dist/components/orderDetailsContainer/ticketsTable.d.ts +0 -46
  158. package/dist/components/orderDetailsContainer/utils/index.d.ts +0 -6
  159. package/dist/components/paymentContainer/OrderDetails.d.ts +0 -9
  160. package/dist/components/paymentContainer/PaymentPlanSection.d.ts +0 -10
  161. package/dist/components/paymentContainer/handlePayment.d.ts +0 -15
  162. package/dist/components/paymentContainer/index.d.ts +0 -39
  163. package/dist/components/preRegistration/FieldsSection.d.ts +0 -19
  164. package/dist/components/preRegistration/Influancers.d.ts +0 -2
  165. package/dist/components/preRegistration/PreRegistrationComplete.d.ts +0 -13
  166. package/dist/components/preRegistration/PreRegistrationInformations.d.ts +0 -2
  167. package/dist/components/preRegistration/Prewards.d.ts +0 -2
  168. package/dist/components/preRegistration/ShareOptions.d.ts +0 -2
  169. package/dist/components/preRegistration/constants.d.ts +0 -2
  170. package/dist/components/preRegistration/index.d.ts +0 -23
  171. package/dist/components/preRegistration/utils.d.ts +0 -12
  172. package/dist/components/registerForm/adapters/index.d.ts +0 -4
  173. package/dist/components/registerForm/constants.d.ts +0 -1
  174. package/dist/components/registerForm/index.d.ts +0 -16
  175. package/dist/components/registerModal/index.d.ts +0 -12
  176. package/dist/components/resetPasswordContainer/index.d.ts +0 -10
  177. package/dist/components/rsvpContainer/index.d.ts +0 -7
  178. package/dist/components/seatMapContainer/SeatMapComponent.d.ts +0 -8
  179. package/dist/components/seatMapContainer/TicketsSection.d.ts +0 -9
  180. package/dist/components/seatMapContainer/addToCart.d.ts +0 -14
  181. package/dist/components/seatMapContainer/index.d.ts +0 -2
  182. package/dist/components/seatMapContainer/utils.d.ts +0 -6
  183. package/dist/components/signupModal/index.d.ts +0 -12
  184. package/dist/components/ticketResale/index.d.ts +0 -12
  185. package/dist/components/ticketResaleModal/index.d.ts +0 -19
  186. package/dist/components/ticketsContainer/AccessCodeSection.d.ts +0 -7
  187. package/dist/components/ticketsContainer/InfoIcon.d.ts +0 -5
  188. package/dist/components/ticketsContainer/PromoCodeSection.d.ts +0 -15
  189. package/dist/components/ticketsContainer/ReferralLogic.d.ts +0 -5
  190. package/dist/components/ticketsContainer/TicketRow.d.ts +0 -13
  191. package/dist/components/ticketsContainer/TicketsSection.d.ts +0 -20
  192. package/dist/components/ticketsContainer/TimeSlotTicketRow.d.ts +0 -19
  193. package/dist/components/ticketsContainer/TimeSlotsSection.d.ts +0 -25
  194. package/dist/components/ticketsContainer/index.d.ts +0 -93
  195. package/dist/components/ticketsContainer/utils.d.ts +0 -13
  196. package/dist/components/timerWidget/index.d.ts +0 -16
  197. package/dist/components/waitingList/index.d.ts +0 -9
  198. package/dist/constants/index.d.ts +0 -7
  199. package/dist/env.d.ts +0 -16
  200. package/dist/hoc/CustomFields/index.d.ts +0 -3
  201. package/dist/hoc/index.d.ts +0 -1
  202. package/dist/hooks/index.d.ts +0 -1
  203. package/dist/hooks/useCookieListener.d.ts +0 -1
  204. package/dist/hooks/useEventListener.d.ts +0 -1
  205. package/dist/hooks/useLocalStorageListener.d.ts +0 -1
  206. package/dist/hooks/useOnline.d.ts +0 -1
  207. package/dist/hooks/usePixel.d.ts +0 -6
  208. package/dist/images/Polygon.png +0 -0
  209. package/dist/images/cross.svg +0 -44
  210. package/dist/images/done.svg +0 -3
  211. package/dist/images/edit.svg +0 -10
  212. package/dist/images/email.svg +0 -1
  213. package/dist/images/instagram.svg +0 -5
  214. package/dist/images/logo-ttf.png +0 -0
  215. package/dist/images/spotify.svg +0 -6
  216. package/dist/images/user.svg +0 -1
  217. package/dist/images/xmark.svg +0 -92
  218. package/dist/normalizers/index.d.ts +0 -4
  219. package/dist/tf-checkout-react.cjs.development.js +0 -16149
  220. package/dist/tf-checkout-react.cjs.development.js.map +0 -1
  221. package/dist/tf-checkout-react.cjs.production.min.js +0 -2
  222. package/dist/tf-checkout-react.cjs.production.min.js.map +0 -1
  223. package/dist/tf-checkout-react.esm.js +0 -16116
  224. package/dist/tf-checkout-react.esm.js.map +0 -1
  225. package/dist/tf-checkout-styles.css +0 -1
  226. package/dist/types/add_on.d.ts +0 -8
  227. package/dist/types/billing-info-data.d.ts +0 -27
  228. package/dist/types/checkoutPageConfigs.d.ts +0 -13
  229. package/dist/types/index.d.ts +0 -6
  230. package/dist/types/order-data.d.ts +0 -15
  231. package/dist/types/payment-field.d.ts +0 -6
  232. package/dist/types/payment-plan-configuration.d.ts +0 -18
  233. package/dist/types/referral-promotion.d.ts +0 -6
  234. package/dist/types/verification.d.ts +0 -12
  235. package/dist/utils/adaptStripeErrors.d.ts +0 -8
  236. package/dist/utils/auth.d.ts +0 -21
  237. package/dist/utils/cookies.d.ts +0 -3
  238. package/dist/utils/createCheckoutDataBodyWithDefaultHolder.d.ts +0 -23
  239. package/dist/utils/createMarkup.d.ts +0 -3
  240. package/dist/utils/customFields.d.ts +0 -35
  241. package/dist/utils/downloadPDF.d.ts +0 -1
  242. package/dist/utils/form.d.ts +0 -3
  243. package/dist/utils/formikErrorFocus.d.ts +0 -2
  244. package/dist/utils/getDomain.d.ts +0 -1
  245. package/dist/utils/getImage.d.ts +0 -1
  246. package/dist/utils/getQueryVariable.d.ts +0 -1
  247. package/dist/utils/htmlNodeFromString.d.ts +0 -1
  248. package/dist/utils/index.d.ts +0 -15
  249. package/dist/utils/isBrowser.d.ts +0 -1
  250. package/dist/utils/isValidNumber.d.ts +0 -1
  251. package/dist/utils/jsonUtils.d.ts +0 -1
  252. package/dist/utils/replaceVarInString.d.ts +0 -1
  253. package/dist/utils/setConfigs.d.ts +0 -11
  254. package/dist/utils/showZero.d.ts +0 -1
  255. package/dist/validators/index.d.ts +0 -8
  256. package/src/adapters/customFields.ts +0 -85
  257. package/src/adapters/index.ts +0 -1
  258. package/src/api/auth.ts +0 -88
  259. package/src/api/cart.ts +0 -28
  260. package/src/api/checkout.ts +0 -28
  261. package/src/api/common.ts +0 -190
  262. package/src/api/guestTicketDelegation.ts +0 -79
  263. package/src/api/index.ts +0 -346
  264. package/src/api/interceptors.ts +0 -77
  265. package/src/api/orders.ts +0 -30
  266. package/src/api/payment.ts +0 -77
  267. package/src/api/preRegistrationComplete.ts +0 -37
  268. package/src/api/publicRequest.ts +0 -47
  269. package/src/api/resale.ts +0 -28
  270. package/src/assets/images/Polygon.png +0 -0
  271. package/src/assets/images/cross.svg +0 -44
  272. package/src/assets/images/done.svg +0 -3
  273. package/src/assets/images/edit.svg +0 -10
  274. package/src/assets/images/email.svg +0 -1
  275. package/src/assets/images/instagram.svg +0 -5
  276. package/src/assets/images/logo-ttf.png +0 -0
  277. package/src/assets/images/spotify.svg +0 -6
  278. package/src/assets/images/user.svg +0 -1
  279. package/src/assets/images/xmark.svg +0 -92
  280. package/src/components/account-settings/index.tsx +0 -161
  281. package/src/components/account-settings/style.css +0 -200
  282. package/src/components/addonsContainer/AddonComponent.tsx +0 -204
  283. package/src/components/addonsContainer/SimpleAddonsContainer.tsx +0 -459
  284. package/src/components/addonsContainer/adapters/index.tsx +0 -62
  285. package/src/components/addonsContainer/index.tsx +0 -353
  286. package/src/components/addonsContainer/normalizers/index.ts +0 -5
  287. package/src/components/addonsContainer/useAddons.ts +0 -248
  288. package/src/components/addonsContainer/utils/index.tsx +0 -231
  289. package/src/components/billing-info-container/hooks/index.ts +0 -3
  290. package/src/components/billing-info-container/hooks/usePaymentContext.ts +0 -22
  291. package/src/components/billing-info-container/hooks/usePaymentRedirect.ts +0 -145
  292. package/src/components/billing-info-container/hooks/useStripePayment.ts +0 -119
  293. package/src/components/billing-info-container/index.tsx +0 -1695
  294. package/src/components/billing-info-container/style.css +0 -150
  295. package/src/components/billing-info-container/utils.tsx +0 -413
  296. package/src/components/common/Checkbox.tsx +0 -51
  297. package/src/components/common/CheckboxField/index.tsx +0 -41
  298. package/src/components/common/CopyField.tsx +0 -53
  299. package/src/components/common/CopyMessageModal.tsx +0 -34
  300. package/src/components/common/CustomField.tsx +0 -168
  301. package/src/components/common/DatePickerField.tsx +0 -126
  302. package/src/components/common/FieldSection/index.tsx +0 -141
  303. package/src/components/common/FieldSection/utils/index.tsx +0 -92
  304. package/src/components/common/FormikPhoneNumberField.tsx +0 -51
  305. package/src/components/common/Loader.tsx +0 -8
  306. package/src/components/common/ModalComponent/index.tsx +0 -68
  307. package/src/components/common/NativeSelectFeild/index.tsx +0 -86
  308. package/src/components/common/PhoneNumberField.tsx +0 -117
  309. package/src/components/common/PoweredBy.tsx +0 -15
  310. package/src/components/common/RadioField.tsx +0 -36
  311. package/src/components/common/RadioGroupField/index.tsx +0 -76
  312. package/src/components/common/RedirectModal.tsx +0 -43
  313. package/src/components/common/SelectField/index.tsx +0 -104
  314. package/src/components/common/SnackbarAlert.tsx +0 -52
  315. package/src/components/common/index.tsx +0 -11
  316. package/src/components/common/socials.tsx +0 -33
  317. package/src/components/confirmModal/index.tsx +0 -60
  318. package/src/components/confirmationContainer/config.ts +0 -79
  319. package/src/components/confirmationContainer/index.tsx +0 -349
  320. package/src/components/confirmationContainer/social-buttons.tsx +0 -149
  321. package/src/components/confirmationContainer/style.css +0 -206
  322. package/src/components/countdown/index.tsx +0 -100
  323. package/src/components/countdown/style.css +0 -10
  324. package/src/components/delegationsContainer/IssueComponent.tsx +0 -156
  325. package/src/components/delegationsContainer/IssueTicketForm.tsx +0 -109
  326. package/src/components/delegationsContainer/TicketsAssignedTable.tsx +0 -55
  327. package/src/components/delegationsContainer/TicketsAvailableTable.tsx +0 -54
  328. package/src/components/delegationsContainer/index.tsx +0 -83
  329. package/src/components/forgotPasswordModal/index.tsx +0 -138
  330. package/src/components/forgotPasswordModal/style.css +0 -47
  331. package/src/components/idVerificationContainer/VerificationPendingModal.tsx +0 -47
  332. package/src/components/idVerificationContainer/constants.ts +0 -27
  333. package/src/components/idVerificationContainer/index.tsx +0 -323
  334. package/src/components/index.ts +0 -12
  335. package/src/components/loginForm/index.tsx +0 -202
  336. package/src/components/loginModal/SignUpForm.tsx +0 -329
  337. package/src/components/loginModal/constants.ts +0 -46
  338. package/src/components/loginModal/index.tsx +0 -263
  339. package/src/components/loginModal/style.css +0 -116
  340. package/src/components/myTicketsContainer/index.tsx +0 -228
  341. package/src/components/myTicketsContainer/row.tsx +0 -46
  342. package/src/components/myTicketsContainer/style.css +0 -40
  343. package/src/components/myTicketsContainer/tableConfig.tsx +0 -80
  344. package/src/components/myTicketsContainer/types.d.ts +0 -41
  345. package/src/components/orderDetailsContainer/CustomFieldsForm.tsx +0 -75
  346. package/src/components/orderDetailsContainer/TicketHolderCustomFields.tsx +0 -100
  347. package/src/components/orderDetailsContainer/index.tsx +0 -586
  348. package/src/components/orderDetailsContainer/style.css +0 -77
  349. package/src/components/orderDetailsContainer/ticketsTable.tsx +0 -246
  350. package/src/components/orderDetailsContainer/utils/index.tsx +0 -55
  351. package/src/components/paymentContainer/OrderDetails.tsx +0 -277
  352. package/src/components/paymentContainer/PaymentPlanSection.tsx +0 -169
  353. package/src/components/paymentContainer/handlePayment.ts +0 -86
  354. package/src/components/paymentContainer/index.tsx +0 -643
  355. package/src/components/paymentContainer/style.css +0 -196
  356. package/src/components/preRegistration/FieldsSection.tsx +0 -150
  357. package/src/components/preRegistration/Influancers.tsx +0 -34
  358. package/src/components/preRegistration/PreRegistrationComplete.tsx +0 -186
  359. package/src/components/preRegistration/PreRegistrationInformations.tsx +0 -60
  360. package/src/components/preRegistration/Prewards.tsx +0 -41
  361. package/src/components/preRegistration/ShareOptions.tsx +0 -77
  362. package/src/components/preRegistration/constants.tsx +0 -169
  363. package/src/components/preRegistration/index.tsx +0 -330
  364. package/src/components/preRegistration/style.css +0 -3
  365. package/src/components/preRegistration/utils.ts +0 -163
  366. package/src/components/registerForm/adapters/index.tsx +0 -10
  367. package/src/components/registerForm/constants.tsx +0 -98
  368. package/src/components/registerForm/index.tsx +0 -188
  369. package/src/components/registerModal/index.tsx +0 -154
  370. package/src/components/registerModal/style.css +0 -18
  371. package/src/components/resetPasswordContainer/index.tsx +0 -102
  372. package/src/components/resetPasswordContainer/style.css +0 -36
  373. package/src/components/rsvpContainer/index.tsx +0 -126
  374. package/src/components/seatMapContainer/SeatMapComponent.tsx +0 -77
  375. package/src/components/seatMapContainer/TicketsSection.tsx +0 -286
  376. package/src/components/seatMapContainer/addToCart.ts +0 -66
  377. package/src/components/seatMapContainer/index.tsx +0 -443
  378. package/src/components/seatMapContainer/utils.ts +0 -133
  379. package/src/components/signupModal/index.tsx +0 -178
  380. package/src/components/signupModal/style.css +0 -58
  381. package/src/components/ticketResale/index.tsx +0 -86
  382. package/src/components/ticketResaleModal/index.tsx +0 -224
  383. package/src/components/ticketResaleModal/style.css +0 -28
  384. package/src/components/ticketsContainer/AccessCodeSection.tsx +0 -50
  385. package/src/components/ticketsContainer/InfoIcon.tsx +0 -35
  386. package/src/components/ticketsContainer/PromoCodeSection.tsx +0 -116
  387. package/src/components/ticketsContainer/ReferralLogic.tsx +0 -33
  388. package/src/components/ticketsContainer/TicketRow.tsx +0 -107
  389. package/src/components/ticketsContainer/TicketsSection.tsx +0 -350
  390. package/src/components/ticketsContainer/TimeSlotTicketRow.tsx +0 -243
  391. package/src/components/ticketsContainer/TimeSlotsSection.tsx +0 -194
  392. package/src/components/ticketsContainer/index.tsx +0 -986
  393. package/src/components/ticketsContainer/style.css +0 -178
  394. package/src/components/ticketsContainer/utils.ts +0 -35
  395. package/src/components/timerWidget/index.tsx +0 -97
  396. package/src/components/timerWidget/style.css +0 -35
  397. package/src/components/waitingList/index.tsx +0 -190
  398. package/src/components/waitingList/style.css +0 -27
  399. package/src/constants/index.ts +0 -3
  400. package/src/env.ts +0 -29
  401. package/src/hoc/CustomFields/index.tsx +0 -85
  402. package/src/hoc/index.ts +0 -1
  403. package/src/hooks/index.ts +0 -1
  404. package/src/hooks/useCookieListener.ts +0 -32
  405. package/src/hooks/useEventListener.ts +0 -32
  406. package/src/hooks/useLocalStorageListener.ts +0 -32
  407. package/src/hooks/useOnline.ts +0 -21
  408. package/src/hooks/usePixel.ts +0 -88
  409. package/src/normalizers/index.ts +0 -49
  410. package/src/types/add_on.ts +0 -8
  411. package/src/types/api/auth.d.ts +0 -63
  412. package/src/types/api/axiosResponse.d.ts +0 -6
  413. package/src/types/api/cart.d.ts +0 -73
  414. package/src/types/api/checkout.d.ts +0 -92
  415. package/src/types/api/common.d.ts +0 -153
  416. package/src/types/api/guestTicketDelegation.d.ts +0 -18
  417. package/src/types/api/orders.d.ts +0 -116
  418. package/src/types/api/payment.d.ts +0 -180
  419. package/src/types/api/preRegistration.d.ts +0 -11
  420. package/src/types/api/preRegistrationComplete.d.ts +0 -95
  421. package/src/types/api/ticketResale.d.ts +0 -13
  422. package/src/types/billing-info-data.ts +0 -37
  423. package/src/types/checkoutPageConfigs.ts +0 -13
  424. package/src/types/formFields.d.ts +0 -29
  425. package/src/types/index.ts +0 -6
  426. package/src/types/order-data.ts +0 -16
  427. package/src/types/payment-field.ts +0 -7
  428. package/src/types/payment-plan-configuration.ts +0 -19
  429. package/src/types/pre-registration-complete.d.ts +0 -47
  430. package/src/types/referral-promotion.ts +0 -7
  431. package/src/types/seatMap.d.ts +0 -159
  432. package/src/types/verification.ts +0 -12
  433. package/src/utils/adaptStripeErrors.ts +0 -26
  434. package/src/utils/auth.ts +0 -45
  435. package/src/utils/cookies.ts +0 -73
  436. package/src/utils/createCheckoutDataBodyWithDefaultHolder.ts +0 -81
  437. package/src/utils/createMarkup.ts +0 -1
  438. package/src/utils/customFields.ts +0 -80
  439. package/src/utils/downloadPDF.tsx +0 -42
  440. package/src/utils/form.ts +0 -34
  441. package/src/utils/formikErrorFocus.ts +0 -24
  442. package/src/utils/getDomain.ts +0 -21
  443. package/src/utils/getImage.ts +0 -14
  444. package/src/utils/getQueryVariable.ts +0 -13
  445. package/src/utils/htmlNodeFromString.ts +0 -6
  446. package/src/utils/index.ts +0 -15
  447. package/src/utils/isBrowser.ts +0 -2
  448. package/src/utils/isValidNumber.ts +0 -8
  449. package/src/utils/jsonUtils.ts +0 -8
  450. package/src/utils/replaceVarInString.ts +0 -9
  451. package/src/utils/setConfigs.ts +0 -24
  452. package/src/utils/showZero.tsx +0 -10
  453. 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'
@@ -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
+ )