@justifi/webcomponents 6.0.0-rc.1 → 6.0.0-rc.10

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 (465) hide show
  1. package/dist/cjs/{Api-CPuq_15r.js → Api-DyimBzKT.js} +2 -2
  2. package/dist/cjs/{Refund-CqWNG8sx.js → Refund-BefKONu4.js} +6 -3
  3. package/dist/cjs/additional-questions-details_5.cjs.entry.js +3 -3
  4. package/dist/cjs/{badge-CMmPvqtE.js → badge-CcJ9H85-.js} +1 -1
  5. package/dist/cjs/bank-account-document-form-inputs_4.cjs.entry.js +7 -7
  6. package/dist/cjs/bank-account-form.cjs.entry.js +9 -6
  7. package/dist/cjs/business-details-core.cjs.entry.js +4 -4
  8. package/dist/cjs/{business.service-C3BdUPlm.js → business.service-BB6zl4Gc.js} +2 -2
  9. package/dist/cjs/{button-CfVQSysQ.js → button-DsHDMHaa.js} +1 -1
  10. package/dist/cjs/card-form.cjs.entry.js +9 -6
  11. package/dist/cjs/{check-pkg-version-D_lazhBQ.js → check-pkg-version-DiQ-d5Nl.js} +9 -3
  12. package/dist/cjs/{checkout.service-B0ZmvWwI.js → checkout.service-B-R80p4f.js} +2 -2
  13. package/dist/cjs/checkout.store-BGvYPPz0.js +88 -0
  14. package/dist/cjs/checkouts-list-core.cjs.entry.js +10 -10
  15. package/dist/cjs/{payments-list-params-state-BNbT1fuJ.js → checkouts-list-params-state-Cewmin_p.js} +1 -1
  16. package/dist/cjs/{checkouts-table-UN5gPpQ_.js → checkouts-table-DjMdEiEW.js} +3 -3
  17. package/dist/cjs/{config-state-5xZf-jax.js → config-state-BBOZIS8x.js} +1 -1
  18. package/dist/cjs/custom-popper_2.cjs.entry.js +1 -1
  19. package/dist/cjs/{dispute.service-DsPEAcDn.js → dispute.service-B5tITFAh.js} +2 -2
  20. package/dist/cjs/form-alert_5.cjs.entry.js +1 -1
  21. package/dist/cjs/form-control-checkbox.cjs.entry.js +3 -3
  22. package/dist/cjs/form-control-date.cjs.entry.js +2 -2
  23. package/dist/cjs/{form-control-error-text-HM0zQerh.js → form-control-error-text-B-P5UDhm.js} +1 -1
  24. package/dist/cjs/form-control-file-v2_2.cjs.entry.js +2 -2
  25. package/dist/cjs/{form-control-help-text-5KIUw1IP.js → form-control-help-text-JoZjhb9m.js} +1 -1
  26. package/dist/cjs/form-control-help-text.cjs.entry.js +1 -1
  27. package/dist/cjs/form-control-monetary-provisioning.cjs.entry.js +3 -3
  28. package/dist/cjs/form-control-monetary.cjs.entry.js +4 -4
  29. package/dist/cjs/form-control-number-masked_2.cjs.entry.js +2 -2
  30. package/dist/cjs/form-control-number.cjs.entry.js +3 -3
  31. package/dist/cjs/form-control-radio.cjs.entry.js +3 -3
  32. package/dist/cjs/form-control-select_2.cjs.entry.js +2 -2
  33. package/dist/cjs/{get-payment-details-DtCXaIMx.js → get-payment-details-BfgRmNL4.js} +2 -2
  34. package/dist/cjs/{get-subaccounts-CwCH5rC8.js → get-subaccounts-Bnfv2tEN.js} +3 -3
  35. package/dist/cjs/gross-payment-chart-core.cjs.entry.js +4 -4
  36. package/dist/cjs/{header-1-DD41iNlG.js → header-1-DRA3f4Jh.js} +1 -1
  37. package/dist/cjs/{header-3-D9Wa0IfT.js → header-3-sOdOpfx3.js} +1 -1
  38. package/dist/cjs/hidden-input_2.cjs.entry.js +4 -4
  39. package/dist/cjs/{index-Yd9aLenr.js → index-B32W0A3m.js} +1 -1
  40. package/dist/cjs/{index-dm_GlYlb.js → index-C9hBD-32.js} +2 -2
  41. package/dist/cjs/index-D-dD-aC2.js +30 -0
  42. package/dist/cjs/index.cjs.js +8 -0
  43. package/dist/cjs/{insurance-state-Cyva9u6S.js → insurance-state-d2thhXUX.js} +2 -2
  44. package/dist/cjs/justifi-additional-questions-form-step-core_6.cjs.entry.js +7 -7
  45. package/dist/cjs/justifi-additional-questions-form-step_9.cjs.entry.js +8 -8
  46. package/dist/cjs/justifi-additional-statement_8.cjs.entry.js +1 -1
  47. package/dist/cjs/justifi-apple-pay.cjs.entry.js +782 -0
  48. package/dist/cjs/justifi-bank-account-billing-form-simple_9.cjs.entry.js +16 -15
  49. package/dist/cjs/justifi-business-details.cjs.entry.js +10 -10
  50. package/dist/cjs/justifi-business-form.cjs.entry.js +13 -13
  51. package/dist/cjs/justifi-business-representative-form-inputs.cjs.entry.js +1 -1
  52. package/dist/cjs/justifi-checkout-summary_7.cjs.entry.js +1421 -0
  53. package/dist/cjs/justifi-checkout.cjs.entry.js +26 -48
  54. package/dist/cjs/justifi-checkouts-list-filters.cjs.entry.js +7 -7
  55. package/dist/cjs/justifi-checkouts-list.cjs.entry.js +13 -13
  56. package/dist/cjs/justifi-config-provider.cjs.entry.js +3 -3
  57. package/dist/cjs/justifi-details.cjs.entry.js +2 -2
  58. package/dist/cjs/justifi-dispute-management-core.cjs.entry.js +1 -1
  59. package/dist/cjs/justifi-dispute-management.cjs.entry.js +9 -9
  60. package/dist/cjs/justifi-dispute-notification_3.cjs.entry.js +12 -12
  61. package/dist/cjs/justifi-gross-payment-chart.cjs.entry.js +9 -9
  62. package/dist/cjs/justifi-order-terminals.cjs.entry.js +12 -12
  63. package/dist/cjs/justifi-owner-form_3.cjs.entry.js +8 -8
  64. package/dist/cjs/justifi-payment-details.cjs.entry.js +11 -11
  65. package/dist/cjs/justifi-payment-provisioning-core.cjs.entry.js +3 -3
  66. package/dist/cjs/justifi-payment-provisioning.cjs.entry.js +9 -9
  67. package/dist/cjs/justifi-payment-transactions-list.cjs.entry.js +12 -12
  68. package/dist/cjs/justifi-payments-list-filters.cjs.entry.js +5 -5
  69. package/dist/cjs/justifi-payments-list.cjs.entry.js +13 -13
  70. package/dist/cjs/justifi-payout-details.cjs.entry.js +10 -10
  71. package/dist/cjs/justifi-payout-transactions-list.cjs.entry.js +12 -12
  72. package/dist/cjs/justifi-payouts-list-filters.cjs.entry.js +5 -5
  73. package/dist/cjs/justifi-payouts-list.cjs.entry.js +14 -14
  74. package/dist/cjs/justifi-refund-payment.cjs.entry.js +13 -13
  75. package/dist/cjs/justifi-saved-payment-method.cjs.entry.js +1 -1
  76. package/dist/cjs/justifi-season-interruption-insurance.cjs.entry.js +17 -12
  77. package/dist/cjs/justifi-skeleton.cjs.entry.js +3 -3
  78. package/dist/cjs/justifi-terminal-orders-list-filters.cjs.entry.js +7 -7
  79. package/dist/cjs/justifi-terminal-orders-list.cjs.entry.js +11 -11
  80. package/dist/cjs/justifi-terminals-list-filters.cjs.entry.js +7 -7
  81. package/dist/cjs/justifi-terminals-list.cjs.entry.js +13 -13
  82. package/dist/cjs/loader.cjs.js +2 -2
  83. package/dist/cjs/{package-Cp_7Ls2E.js → package-Be2aoTf8.js} +1 -1
  84. package/dist/cjs/pagination-menu.cjs.entry.js +1 -1
  85. package/dist/cjs/payment-details-core.cjs.entry.js +7 -7
  86. package/dist/cjs/payment-method-option.cjs.entry.js +2 -2
  87. package/dist/cjs/{payment.service-1H0VC3LV.js → payment.service-aR96UW5e.js} +2 -2
  88. package/dist/cjs/payments-list-core.cjs.entry.js +11 -11
  89. package/dist/cjs/{payouts-list-params-state-BNbT1fuJ.js → payments-list-params-state-Cewmin_p.js} +1 -1
  90. package/dist/cjs/{payments-status-PB63klt3.js → payments-status-DXRh_ekP.js} +2 -2
  91. package/dist/cjs/{payments-table-quF0NnsS.js → payments-table-BE8u0-i0.js} +3 -3
  92. package/dist/cjs/payout-details-core.cjs.entry.js +8 -8
  93. package/dist/cjs/{payout.service-CIZFU-hV.js → payout.service-6Cl_yXXQ.js} +2 -2
  94. package/dist/cjs/payouts-list-core.cjs.entry.js +11 -11
  95. package/dist/cjs/{checkouts-list-params-state-BNbT1fuJ.js → payouts-list-params-state-Cewmin_p.js} +1 -1
  96. package/dist/cjs/{payouts-status-Bk1JFzbP.js → payouts-status-DxTQZv3i.js} +2 -2
  97. package/dist/cjs/{payouts-table-D_CCTR_k.js → payouts-table-BbydhJUr.js} +3 -3
  98. package/dist/cjs/{skeleton-x-GSs3xk.js → skeleton-C7DQRD6r.js} +1 -1
  99. package/dist/cjs/{spinner-Kb1BFvnL.js → spinner-jmeA44Ee.js} +1 -1
  100. package/dist/cjs/{styled-host-CqQYxX-w.js → styled-host-BfVJlAsJ.js} +1 -1
  101. package/dist/cjs/{table-BJVUhh3s.js → table-Ccdrt0v_.js} +2 -2
  102. package/dist/cjs/table-filters-menu.cjs.entry.js +2 -2
  103. package/dist/cjs/terminal-orders-list-core.cjs.entry.js +10 -10
  104. package/dist/cjs/{terminal-orders-list-params-state-BNbT1fuJ.js → terminal-orders-list-params-state-Cewmin_p.js} +1 -1
  105. package/dist/cjs/{terminal-orders-table-0O5jtzYj.js → terminal-orders-table-B4HjERrK.js} +5 -5
  106. package/dist/cjs/terminal-quantity-selector.cjs.entry.js +1 -1
  107. package/dist/cjs/{terminal.service-DUlyMTrX.js → terminal.service-D1FAYZzd.js} +2 -2
  108. package/dist/cjs/terminals-list-core.cjs.entry.js +10 -10
  109. package/dist/cjs/terminals-list-params-state-Cewmin_p.js +22 -0
  110. package/dist/cjs/{terminals-table-C2BNRUS5.js → terminals-table-C79Xc4FI.js} +3 -3
  111. package/dist/cjs/{utils-Df-pajL7.js → utils-Bzyj4qWe.js} +1 -1
  112. package/dist/cjs/{utils-BaGF9XIe.js → utils-ChCUZgUy.js} +6 -0
  113. package/dist/cjs/webcomponents.cjs.js +3 -3
  114. package/dist/collection/api/ApplePay.js +119 -0
  115. package/dist/collection/api/Payment.js +5 -2
  116. package/dist/collection/api/services/apple-pay.service.js +293 -0
  117. package/dist/collection/api/services/plaid.service.js +20 -0
  118. package/dist/collection/assets/plaid-icon.svg +1 -0
  119. package/dist/collection/collection-manifest.json +3 -1
  120. package/dist/collection/components/checkout/bank-account-form/bank-account-form.js +6 -3
  121. package/dist/collection/components/checkout/card-form/card-form.js +6 -3
  122. package/dist/collection/components/checkout/checkout.js +17 -39
  123. package/dist/collection/components/checkout/save-new-payment-method.js +1 -1
  124. package/dist/collection/components/insurance/season-interruption/season-interruption-insurance.js +4 -0
  125. package/dist/collection/components/modular-checkout/ModularCheckout.js +28 -0
  126. package/dist/collection/components/modular-checkout/modular-checkout.js +228 -125
  127. package/dist/collection/components/modular-checkout/sub-components/apple-pay-skeleton.js +10 -0
  128. package/dist/collection/components/modular-checkout/sub-components/apple-pay.js +509 -0
  129. package/dist/collection/components/modular-checkout/sub-components/plaid-payment-method.js +885 -0
  130. package/dist/collection/components/modular-checkout/sub-components/plaid-payment-method.test.js +124 -0
  131. package/dist/collection/components/modular-checkout/sub-components/saved-payment-methods.js +7 -5
  132. package/dist/collection/components/modular-checkout/sub-components/sezzle-payment-method.js +25 -8
  133. package/dist/collection/components/tokenize-payment-method/tokenize-payment-method.js +63 -34
  134. package/dist/collection/index.js +1 -0
  135. package/dist/collection/store/checkout.store.js +46 -2
  136. package/dist/collection/ui-components/apple-pay-button.js +146 -0
  137. package/dist/collection/ui-components/form/form-control-radio.js +5 -5
  138. package/dist/collection/ui-components/shadow-dom-components/justifi-radio-list-item.js +4 -4
  139. package/dist/collection/utils/check-pkg-version.js +6 -0
  140. package/dist/collection/utils/utils.js +5 -0
  141. package/dist/docs.json +1037 -212
  142. package/dist/esm/{Api-N_veT2p6.js → Api-DAWuvzbl.js} +2 -2
  143. package/dist/esm/{Refund-Di6J0oN2.js → Refund-CVh70dXA.js} +7 -4
  144. package/dist/esm/additional-questions-details_5.entry.js +4 -4
  145. package/dist/esm/{badge-D_mzXSCQ.js → badge-DSYSJcRy.js} +2 -2
  146. package/dist/esm/bank-account-document-form-inputs_4.entry.js +8 -8
  147. package/dist/esm/bank-account-form.entry.js +10 -7
  148. package/dist/esm/business-details-core.entry.js +5 -5
  149. package/dist/esm/{business.service-Bdvhdc_d.js → business.service-cQrH5BqF.js} +2 -2
  150. package/dist/esm/{button-CeR8qVS3.js → button-CpllL0At.js} +2 -2
  151. package/dist/esm/card-form.entry.js +10 -7
  152. package/dist/esm/{check-pkg-version-Bb69ihTN.js → check-pkg-version-CAnDiqiu.js} +9 -3
  153. package/dist/esm/{checkout.service-XgGFa7H8.js → checkout.service-Bbgi1I6V.js} +2 -2
  154. package/dist/esm/checkout.store-CCdFOPCK.js +83 -0
  155. package/dist/esm/checkouts-list-core.entry.js +11 -11
  156. package/dist/esm/{checkouts-list-params-state-SMXQIZTt.js → checkouts-list-params-state-D8tzsGR_.js} +1 -1
  157. package/dist/esm/{checkouts-table-CFZYoYjn.js → checkouts-table-Ddf2I-Ul.js} +4 -4
  158. package/dist/esm/{config-state-BrllxiM0.js → config-state-DZeVYerv.js} +1 -1
  159. package/dist/esm/custom-popper_2.entry.js +2 -2
  160. package/dist/esm/{dispute.service-CKPcmwhH.js → dispute.service-CrZsNDW8.js} +2 -2
  161. package/dist/esm/form-alert_5.entry.js +2 -2
  162. package/dist/esm/form-control-checkbox.entry.js +4 -4
  163. package/dist/esm/form-control-date.entry.js +3 -3
  164. package/dist/esm/{form-control-error-text-D3ZwkOv-.js → form-control-error-text-R7U07nTg.js} +2 -2
  165. package/dist/esm/form-control-file-v2_2.entry.js +3 -3
  166. package/dist/esm/{form-control-help-text-C39ZW65w.js → form-control-help-text-CRLH-2f7.js} +2 -2
  167. package/dist/esm/form-control-help-text.entry.js +1 -1
  168. package/dist/esm/form-control-monetary-provisioning.entry.js +4 -4
  169. package/dist/esm/form-control-monetary.entry.js +5 -5
  170. package/dist/esm/form-control-number-masked_2.entry.js +3 -3
  171. package/dist/esm/form-control-number.entry.js +4 -4
  172. package/dist/esm/form-control-radio.entry.js +4 -4
  173. package/dist/esm/form-control-select_2.entry.js +3 -3
  174. package/dist/esm/{get-payment-details-Dt-dr16k.js → get-payment-details-0VzpMNY9.js} +2 -2
  175. package/dist/esm/{get-subaccounts-BsoVLANw.js → get-subaccounts-9UMbyFiT.js} +3 -3
  176. package/dist/esm/gross-payment-chart-core.entry.js +5 -5
  177. package/dist/esm/{header-1-E-hEi3wF.js → header-1-3M9If0gM.js} +2 -2
  178. package/dist/esm/{header-3-Dm7M85kz.js → header-3-CWa41YWq.js} +2 -2
  179. package/dist/esm/hidden-input_2.entry.js +5 -5
  180. package/dist/esm/{index-B9me4yN2.js → index-B_KxSZIF.js} +1 -1
  181. package/dist/esm/{index-kpoIU4v_.js → index-Bn7inNWG.js} +2 -2
  182. package/dist/esm/index-CbL73B6U.js +30 -0
  183. package/dist/esm/index.js +1 -1
  184. package/dist/esm/{insurance-state-CB4l8sOv.js → insurance-state-CTalqbNa.js} +3 -3
  185. package/dist/esm/justifi-additional-questions-form-step-core_6.entry.js +8 -8
  186. package/dist/esm/justifi-additional-questions-form-step_9.entry.js +9 -9
  187. package/dist/esm/justifi-additional-statement_8.entry.js +2 -2
  188. package/dist/esm/justifi-apple-pay.entry.js +780 -0
  189. package/dist/esm/justifi-bank-account-billing-form-simple_9.entry.js +17 -16
  190. package/dist/esm/justifi-business-details.entry.js +11 -11
  191. package/dist/esm/justifi-business-form.entry.js +14 -14
  192. package/dist/esm/justifi-business-representative-form-inputs.entry.js +2 -2
  193. package/dist/esm/justifi-checkout-summary_7.entry.js +1413 -0
  194. package/dist/esm/justifi-checkout.entry.js +26 -48
  195. package/dist/esm/justifi-checkouts-list-filters.entry.js +8 -8
  196. package/dist/esm/justifi-checkouts-list.entry.js +14 -14
  197. package/dist/esm/justifi-config-provider.entry.js +3 -3
  198. package/dist/esm/justifi-details.entry.js +3 -3
  199. package/dist/esm/justifi-dispute-management-core.entry.js +1 -1
  200. package/dist/esm/justifi-dispute-management.entry.js +9 -9
  201. package/dist/esm/justifi-dispute-notification_3.entry.js +13 -13
  202. package/dist/esm/justifi-gross-payment-chart.entry.js +10 -10
  203. package/dist/esm/justifi-order-terminals.entry.js +13 -13
  204. package/dist/esm/justifi-owner-form_3.entry.js +9 -9
  205. package/dist/esm/justifi-payment-details.entry.js +12 -12
  206. package/dist/esm/justifi-payment-provisioning-core.entry.js +4 -4
  207. package/dist/esm/justifi-payment-provisioning.entry.js +9 -9
  208. package/dist/esm/justifi-payment-transactions-list.entry.js +13 -13
  209. package/dist/esm/justifi-payments-list-filters.entry.js +6 -6
  210. package/dist/esm/justifi-payments-list.entry.js +14 -14
  211. package/dist/esm/justifi-payout-details.entry.js +11 -11
  212. package/dist/esm/justifi-payout-transactions-list.entry.js +13 -13
  213. package/dist/esm/justifi-payouts-list-filters.entry.js +6 -6
  214. package/dist/esm/justifi-payouts-list.entry.js +15 -15
  215. package/dist/esm/justifi-refund-payment.entry.js +14 -14
  216. package/dist/esm/justifi-saved-payment-method.entry.js +2 -2
  217. package/dist/esm/justifi-season-interruption-insurance.entry.js +18 -13
  218. package/dist/esm/justifi-skeleton.entry.js +4 -4
  219. package/dist/esm/justifi-terminal-orders-list-filters.entry.js +8 -8
  220. package/dist/esm/justifi-terminal-orders-list.entry.js +12 -12
  221. package/dist/esm/justifi-terminals-list-filters.entry.js +8 -8
  222. package/dist/esm/justifi-terminals-list.entry.js +14 -14
  223. package/dist/esm/loader.js +3 -3
  224. package/dist/esm/{package-O3LY2Da6.js → package-CnWtPu8L.js} +1 -1
  225. package/dist/esm/pagination-menu.entry.js +2 -2
  226. package/dist/esm/{parts-CfF8KKwx.js → parts-RvUQ__Pq.js} +1 -1
  227. package/dist/esm/payment-details-core.entry.js +8 -8
  228. package/dist/esm/payment-method-option.entry.js +3 -3
  229. package/dist/esm/{payment.service-BWO84KlP.js → payment.service-TxyxCg0E.js} +2 -2
  230. package/dist/esm/payments-list-core.entry.js +12 -12
  231. package/dist/esm/{payments-list-params-state-SMXQIZTt.js → payments-list-params-state-D8tzsGR_.js} +1 -1
  232. package/dist/esm/{payments-status-XoZrlbiZ.js → payments-status-5orNU2Rd.js} +2 -2
  233. package/dist/esm/{payments-table-Dh4P9mTb.js → payments-table-gkJV5GNK.js} +4 -4
  234. package/dist/esm/payout-details-core.entry.js +9 -9
  235. package/dist/esm/{payout.service-Cld6TS5W.js → payout.service-BOwZ4wWh.js} +2 -2
  236. package/dist/esm/payouts-list-core.entry.js +12 -12
  237. package/dist/esm/{payouts-list-params-state-SMXQIZTt.js → payouts-list-params-state-D8tzsGR_.js} +1 -1
  238. package/dist/esm/{payouts-status-Qm2jZG1-.js → payouts-status-CZPwa2AE.js} +2 -2
  239. package/dist/esm/{payouts-table-DMVAZp-r.js → payouts-table-0PtktGRd.js} +4 -4
  240. package/dist/esm/{skeleton-DrHwsgs_.js → skeleton-qMb0_Cjy.js} +2 -2
  241. package/dist/esm/{spinner-XBq6mVJW.js → spinner-DUzyWLhj.js} +2 -2
  242. package/dist/esm/{styled-host-B_XBaM7z.js → styled-host-CTAGIN84.js} +1 -1
  243. package/dist/esm/{table-qqt2Ew5y.js → table-Br3n9Xu-.js} +3 -3
  244. package/dist/esm/table-filters-menu.entry.js +3 -3
  245. package/dist/esm/terminal-orders-list-core.entry.js +11 -11
  246. package/dist/esm/{terminal-orders-list-params-state-SMXQIZTt.js → terminal-orders-list-params-state-D8tzsGR_.js} +1 -1
  247. package/dist/esm/{terminal-orders-table-BN4Co4T8.js → terminal-orders-table-DTBSIMlJ.js} +6 -6
  248. package/dist/esm/terminal-quantity-selector.entry.js +2 -2
  249. package/dist/esm/{terminal.service-DmYCUQcA.js → terminal.service-E6dZlM43.js} +2 -2
  250. package/dist/esm/terminals-list-core.entry.js +11 -11
  251. package/dist/esm/terminals-list-params-state-D8tzsGR_.js +16 -0
  252. package/dist/esm/{terminals-table-C8LczeG_.js → terminals-table-TGUKTi7I.js} +4 -4
  253. package/dist/esm/{utils-lb8p1Exq.js → utils-BscIVFn8.js} +6 -1
  254. package/dist/esm/{utils-kWaZhFAd.js → utils-Dg6gMUTv.js} +2 -2
  255. package/dist/esm/webcomponents.js +4 -4
  256. package/dist/module/Analytics.js +6 -0
  257. package/dist/module/ModularCheckout.js +30 -0
  258. package/dist/module/Refund.js +5 -2
  259. package/dist/module/bank-account-form.js +5 -2
  260. package/dist/module/card-form.js +5 -2
  261. package/dist/module/checkout.store.js +47 -2
  262. package/dist/module/form-control-radio2.js +3 -3
  263. package/dist/module/gross-payment-chart-core2.js +1 -1
  264. package/dist/module/index.js +1 -0
  265. package/dist/module/justifi-apple-pay.d.ts +11 -0
  266. package/dist/module/justifi-apple-pay.js +811 -0
  267. package/dist/module/justifi-checkout.js +63 -75
  268. package/dist/module/justifi-order-terminals.js +1 -1
  269. package/dist/module/justifi-plaid-payment-method.d.ts +11 -0
  270. package/dist/module/justifi-plaid-payment-method.js +6 -0
  271. package/dist/module/justifi-radio-list-item2.js +2 -2
  272. package/dist/module/justifi-season-interruption-insurance.js +5 -1
  273. package/dist/module/modular-checkout.js +179 -101
  274. package/dist/module/package.js +1 -1
  275. package/dist/module/plaid-payment-method.js +687 -0
  276. package/dist/module/save-new-payment-method.js +1 -1
  277. package/dist/module/saved-payment-methods.js +7 -5
  278. package/dist/module/sezzle-payment-method.js +14 -22
  279. package/dist/module/terminals-list-core2.js +1 -1
  280. package/dist/module/tokenize-payment-method.js +44 -34
  281. package/dist/module/utils2.js +6 -1
  282. package/dist/types/api/ApplePay.d.ts +196 -0
  283. package/dist/types/api/Checkout.d.ts +9 -14
  284. package/dist/types/api/Payment.d.ts +4 -3
  285. package/dist/types/api/services/apple-pay.service.d.ts +55 -0
  286. package/dist/types/api/services/plaid.service.d.ts +12 -0
  287. package/dist/types/components/checkout/bank-account-form/bank-account-form.d.ts +1 -0
  288. package/dist/types/components/checkout/card-form/card-form.d.ts +1 -0
  289. package/dist/types/components/checkout/checkout.d.ts +6 -7
  290. package/dist/types/components/modular-checkout/ModularCheckout.d.ts +31 -0
  291. package/dist/types/components/modular-checkout/modular-checkout.d.ts +13 -4
  292. package/dist/types/components/modular-checkout/sub-components/apple-pay-skeleton.d.ts +6 -0
  293. package/dist/types/components/modular-checkout/sub-components/apple-pay.d.ts +39 -0
  294. package/dist/types/components/modular-checkout/sub-components/plaid-payment-method.d.ts +80 -0
  295. package/dist/types/components/modular-checkout/sub-components/plaid-payment-method.test.d.ts +1 -0
  296. package/dist/types/components/modular-checkout/sub-components/saved-payment-methods.d.ts +1 -1
  297. package/dist/types/components/modular-checkout/sub-components/sezzle-payment-method.d.ts +1 -1
  298. package/dist/types/components/tokenize-payment-method/tokenize-payment-method.d.ts +7 -6
  299. package/dist/types/components.d.ts +172 -11
  300. package/dist/types/index.d.ts +2 -0
  301. package/dist/types/store/checkout.store.d.ts +14 -3
  302. package/dist/types/ui-components/apple-pay-button.d.ts +17 -0
  303. package/dist/types/ui-components/form/form-control-radio.d.ts +1 -1
  304. package/dist/types/ui-components/shadow-dom-components/justifi-radio-list-item.d.ts +1 -1
  305. package/dist/types/utils/utils.d.ts +1 -0
  306. package/dist/webcomponents/index.esm.js +1 -0
  307. package/dist/webcomponents/p-0803d130.entry.js +1 -0
  308. package/dist/webcomponents/{p-Dvxpy_P1.js → p-0Om7jLBs.js} +1 -1
  309. package/dist/webcomponents/{p-0932f6a9.entry.js → p-117b7f47.entry.js} +1 -1
  310. package/dist/webcomponents/p-17093105.entry.js +1 -0
  311. package/dist/webcomponents/{p-f01953ea.entry.js → p-1a08b47f.entry.js} +1 -1
  312. package/dist/webcomponents/p-1bcb3852.entry.js +1 -0
  313. package/dist/webcomponents/{p-ae4297dd.entry.js → p-1eb2b847.entry.js} +1 -1
  314. package/dist/webcomponents/{p-dd257e60.entry.js → p-2f7aa249.entry.js} +1 -1
  315. package/dist/webcomponents/{p-28c7bef7.entry.js → p-2fa34c82.entry.js} +4 -4
  316. package/dist/webcomponents/{p-08ea8974.entry.js → p-33311d41.entry.js} +1 -1
  317. package/dist/webcomponents/p-336c31b3.entry.js +1 -0
  318. package/dist/webcomponents/{p-22be0859.entry.js → p-3f33c940.entry.js} +1 -1
  319. package/dist/webcomponents/{p-f3a757b2.entry.js → p-442f86e8.entry.js} +1 -1
  320. package/dist/webcomponents/{p-a8205044.entry.js → p-44450a94.entry.js} +1 -1
  321. package/dist/webcomponents/{p-cebe360b.entry.js → p-464e7a8e.entry.js} +1 -1
  322. package/dist/webcomponents/{p-ba8ae31f.entry.js → p-50392803.entry.js} +1 -1
  323. package/dist/webcomponents/p-52cbd667.entry.js +1 -0
  324. package/dist/webcomponents/{p-ded22005.entry.js → p-54ca3070.entry.js} +1 -1
  325. package/dist/webcomponents/{p-77515be6.entry.js → p-5ad0f438.entry.js} +1 -1
  326. package/dist/webcomponents/{p-6e18d13f.entry.js → p-613421d4.entry.js} +1 -1
  327. package/dist/webcomponents/{p-9b75aced.entry.js → p-62d12566.entry.js} +1 -1
  328. package/dist/webcomponents/p-65ed60bf.entry.js +1 -0
  329. package/dist/webcomponents/p-6cf30a24.entry.js +1 -0
  330. package/dist/webcomponents/{p-48bccf3b.entry.js → p-70f51444.entry.js} +1 -1
  331. package/dist/webcomponents/{p-a4172773.entry.js → p-729dbd8f.entry.js} +1 -1
  332. package/dist/webcomponents/p-77948b46.entry.js +1 -0
  333. package/dist/webcomponents/{p-1d53f0b8.entry.js → p-7bcfaff4.entry.js} +1 -1
  334. package/dist/webcomponents/{p-b0bfa20f.entry.js → p-7cf87637.entry.js} +1 -1
  335. package/dist/webcomponents/{p-dfd7c212.entry.js → p-7dd74e6f.entry.js} +1 -1
  336. package/dist/webcomponents/{p-I8XpD1TX.js → p-7s1gsXM5.js} +1 -1
  337. package/dist/webcomponents/{p-3d85d046.entry.js → p-80331983.entry.js} +1 -1
  338. package/dist/webcomponents/{p-d0e24727.entry.js → p-85f20746.entry.js} +1 -1
  339. package/dist/webcomponents/{p-79055216.entry.js → p-8687e5d6.entry.js} +1 -1
  340. package/dist/webcomponents/p-89ecd650.entry.js +1 -0
  341. package/dist/webcomponents/p-8a6718b6.entry.js +1 -0
  342. package/dist/webcomponents/p-8d6b81ba.entry.js +1 -0
  343. package/dist/webcomponents/{p-a7d5e434.entry.js → p-8d743490.entry.js} +1 -1
  344. package/dist/webcomponents/{p-8f0339de.entry.js → p-8f7396b1.entry.js} +1 -1
  345. package/dist/webcomponents/{p-15777cfe.entry.js → p-8ff839a4.entry.js} +1 -1
  346. package/dist/webcomponents/{p-57143978.entry.js → p-95cbb655.entry.js} +1 -1
  347. package/dist/webcomponents/{p-ae5a3c2a.entry.js → p-98cffba9.entry.js} +1 -1
  348. package/dist/webcomponents/{p-4ba144ac.entry.js → p-9a2c044f.entry.js} +1 -1
  349. package/dist/webcomponents/{p-904a95e5.entry.js → p-9be67b19.entry.js} +1 -1
  350. package/dist/webcomponents/{p-df199396.entry.js → p-9e8021a1.entry.js} +1 -1
  351. package/dist/webcomponents/{p-131d799c.entry.js → p-9fc0ea58.entry.js} +1 -1
  352. package/dist/webcomponents/p-9fc567d8.entry.js +1 -0
  353. package/dist/webcomponents/{p-424f491c.entry.js → p-9fcff84c.entry.js} +1 -1
  354. package/dist/webcomponents/p-B71k50jz.js +1 -0
  355. package/dist/webcomponents/p-BF4U0yVj.js +1 -0
  356. package/dist/webcomponents/{p-zdIeCUeh.js → p-BHf9IqGw.js} +1 -1
  357. package/dist/webcomponents/p-BQ2TIFoY.js +1 -0
  358. package/dist/webcomponents/p-BSt6p1oq.js +1 -0
  359. package/dist/webcomponents/p-BY1mRAvj.js +1 -0
  360. package/dist/webcomponents/{p-YND5pTuF.js → p-Bb-6bNcq.js} +1 -1
  361. package/dist/webcomponents/p-BbZwa5UI.js +1 -0
  362. package/dist/webcomponents/p-BdKWuCys.js +1 -0
  363. package/dist/webcomponents/p-BfM6X7lF.js +1 -0
  364. package/dist/webcomponents/{p-BbYVgLcf.js → p-BjVfIXWC.js} +1 -1
  365. package/dist/webcomponents/{p-kpoIU4v_.js → p-Bn7inNWG.js} +1 -1
  366. package/dist/webcomponents/{p-BisQ61nK.js → p-BsGE9UDv.js} +1 -1
  367. package/dist/webcomponents/{p-BeszVz87.js → p-C5id7s_l.js} +1 -1
  368. package/dist/webcomponents/{p-CsNubTqD.js → p-CAJnQLZF.js} +1 -1
  369. package/dist/webcomponents/{p-Bz164TKZ.js → p-CB0mCq1M.js} +1 -1
  370. package/dist/webcomponents/p-CaAVuW6B.js +1 -0
  371. package/dist/webcomponents/p-Cb0FhuyU.js +1 -0
  372. package/dist/webcomponents/p-CbL73B6U.js +1 -0
  373. package/dist/webcomponents/p-CnWtPu8L.js +1 -0
  374. package/dist/webcomponents/p-CpaS1Lex.js +1 -0
  375. package/dist/webcomponents/p-DD0Mvpeu.js +1 -0
  376. package/dist/webcomponents/p-DDUmOl3v.js +1 -0
  377. package/dist/webcomponents/p-DIDloHpm.js +1 -0
  378. package/dist/webcomponents/p-DIjoBk44.js +1 -0
  379. package/dist/webcomponents/{p-UD2JhYS2.js → p-DK2sRMlx.js} +1 -1
  380. package/dist/webcomponents/{p-DO3INvI2.js → p-DNo0OPOP.js} +1 -1
  381. package/dist/webcomponents/{p-BTkXk7ol.js → p-DRXvcLy9.js} +1 -1
  382. package/dist/webcomponents/{p-BNz6wy4f.js → p-DZYcH7jA.js} +1 -1
  383. package/dist/webcomponents/p-Da3idOSV.js +1 -0
  384. package/dist/webcomponents/p-Dgflaz6J.js +1 -0
  385. package/dist/webcomponents/{p-9y5MOK55.js → p-DhGNCW2f.js} +1 -1
  386. package/dist/webcomponents/p-DsZZxRXY.js +1 -0
  387. package/dist/webcomponents/{p-CRFzwZW6.js → p-DxqCFDtF.js} +1 -1
  388. package/dist/webcomponents/p-ED_TzwCp.js +1 -0
  389. package/dist/webcomponents/p-JyHlIFWl.js +1 -0
  390. package/dist/webcomponents/{p-CfF8KKwx.js → p-RvUQ__Pq.js} +1 -1
  391. package/dist/webcomponents/{p-DWUnL_zj.js → p-Wh1V0gvF.js} +1 -1
  392. package/dist/webcomponents/{p-c3a2c619.entry.js → p-a55f07af.entry.js} +1 -1
  393. package/dist/webcomponents/{p-40ba49e4.entry.js → p-aa6194ef.entry.js} +1 -1
  394. package/dist/webcomponents/{p-d77908ca.entry.js → p-ab6a5dc9.entry.js} +1 -1
  395. package/dist/webcomponents/{p-463ae23a.entry.js → p-abbf14b5.entry.js} +1 -1
  396. package/dist/webcomponents/{p-283cd78b.entry.js → p-af9c4174.entry.js} +1 -1
  397. package/dist/webcomponents/{p-f47095cd.entry.js → p-b7d2f2eb.entry.js} +1 -1
  398. package/dist/webcomponents/p-bbc4b4cb.entry.js +1 -0
  399. package/dist/webcomponents/{p-36d72e2d.entry.js → p-c599e526.entry.js} +1 -1
  400. package/dist/webcomponents/{p-5e10aa65.entry.js → p-d46dbb83.entry.js} +1 -1
  401. package/dist/webcomponents/{p-6849bf8e.entry.js → p-d62cd269.entry.js} +1 -1
  402. package/dist/webcomponents/{p-ff3377e7.entry.js → p-d9dd7d24.entry.js} +1 -1
  403. package/dist/webcomponents/p-dd7352da.entry.js +1 -0
  404. package/dist/webcomponents/{p-7c51805a.entry.js → p-e8a67dc7.entry.js} +1 -1
  405. package/dist/webcomponents/p-eP3fmhta.js +1 -0
  406. package/dist/webcomponents/p-eb2d9e5b.entry.js +1 -0
  407. package/dist/webcomponents/{p-1f8cd44e.entry.js → p-eddaca4e.entry.js} +1 -1
  408. package/dist/webcomponents/{p-9106fd74.entry.js → p-ef32fe0e.entry.js} +1 -1
  409. package/dist/webcomponents/{p-c5b48e8d.entry.js → p-f1cba43c.entry.js} +1 -1
  410. package/dist/webcomponents/{p-e830a580.entry.js → p-f1f0b405.entry.js} +1 -1
  411. package/dist/webcomponents/p-f499a8de.entry.js +1 -0
  412. package/dist/webcomponents/{p-828a61b9.entry.js → p-f4d0cdf0.entry.js} +1 -1
  413. package/dist/webcomponents/{p-818f51fd.entry.js → p-f680e617.entry.js} +1 -1
  414. package/dist/webcomponents/{p-bea4309d.entry.js → p-f7c4222f.entry.js} +1 -1
  415. package/dist/webcomponents/p-fa1884b4.entry.js +1 -0
  416. package/dist/webcomponents/p-sw5RO19U.js +1 -0
  417. package/dist/webcomponents/p-z-5r0gWn.js +1 -0
  418. package/dist/webcomponents/webcomponents.esm.js +1 -1
  419. package/package.json +2 -2
  420. package/dist/cjs/checkout.store-CV_fuGQw.js +0 -39
  421. package/dist/cjs/justifi-checkout-summary_6.cjs.entry.js +0 -698
  422. package/dist/cjs/terminals-list-params-state-BNbT1fuJ.js +0 -22
  423. package/dist/esm/checkout.store-B60siz2l.js +0 -36
  424. package/dist/esm/justifi-checkout-summary_6.entry.js +0 -691
  425. package/dist/esm/terminals-list-params-state-SMXQIZTt.js +0 -16
  426. package/dist/webcomponents/p-09e768fe.entry.js +0 -1
  427. package/dist/webcomponents/p-0dcc83ac.entry.js +0 -1
  428. package/dist/webcomponents/p-1bdce018.entry.js +0 -1
  429. package/dist/webcomponents/p-2f31a4e5.entry.js +0 -1
  430. package/dist/webcomponents/p-3a4ca4df.entry.js +0 -1
  431. package/dist/webcomponents/p-466f33d7.entry.js +0 -1
  432. package/dist/webcomponents/p-57802e57.entry.js +0 -1
  433. package/dist/webcomponents/p-5rVtZ2GJ.js +0 -1
  434. package/dist/webcomponents/p-7322c86e.entry.js +0 -1
  435. package/dist/webcomponents/p-7WIgS5RM.js +0 -1
  436. package/dist/webcomponents/p-89e27079.entry.js +0 -1
  437. package/dist/webcomponents/p-BC8YDY7M.js +0 -1
  438. package/dist/webcomponents/p-BVD7g3cE.js +0 -1
  439. package/dist/webcomponents/p-Bb6FBEPP.js +0 -1
  440. package/dist/webcomponents/p-Bpcb3SsP.js +0 -1
  441. package/dist/webcomponents/p-Bt388eye.js +0 -1
  442. package/dist/webcomponents/p-BySyDTv5.js +0 -1
  443. package/dist/webcomponents/p-C1fMfnu0.js +0 -1
  444. package/dist/webcomponents/p-CCME-fyU.js +0 -1
  445. package/dist/webcomponents/p-CLwzqWk2.js +0 -1
  446. package/dist/webcomponents/p-CVQyw7ao.js +0 -1
  447. package/dist/webcomponents/p-C_CXv7AN.js +0 -1
  448. package/dist/webcomponents/p-CwZKT93w.js +0 -1
  449. package/dist/webcomponents/p-D599ZMGU.js +0 -1
  450. package/dist/webcomponents/p-DD74a16D.js +0 -1
  451. package/dist/webcomponents/p-DaDsBt65.js +0 -1
  452. package/dist/webcomponents/p-JgbsbAhz.js +0 -1
  453. package/dist/webcomponents/p-O3LY2Da6.js +0 -1
  454. package/dist/webcomponents/p-WEguiGt1.js +0 -1
  455. package/dist/webcomponents/p-be06d86a.entry.js +0 -1
  456. package/dist/webcomponents/p-dd689b5e.entry.js +0 -1
  457. package/dist/webcomponents/p-dd6d6ddb.entry.js +0 -1
  458. package/dist/webcomponents/p-e859ece8.entry.js +0 -1
  459. package/dist/webcomponents/p-eaea7cc1.entry.js +0 -1
  460. package/dist/webcomponents/p-fa33df9f.entry.js +0 -1
  461. package/dist/webcomponents/p-ff869ded.entry.js +0 -1
  462. package/dist/webcomponents/p-pska2q1M.js +0 -1
  463. package/dist/webcomponents/p-qMrd7_Gp.js +0 -1
  464. package/dist/webcomponents/p-vRhNRfmB.js +0 -1
  465. package/dist/webcomponents/p-zrUQD0Wr.js +0 -1
@@ -0,0 +1,1421 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-C9hBD-32.js');
4
+ var parts = require('./parts-9jMf1erK.js');
5
+ var utils = require('./utils-ChCUZgUy.js');
6
+ var checkout_store = require('./checkout.store-BGvYPPz0.js');
7
+ var styledHost = require('./styled-host-BfVJlAsJ.js');
8
+ require('./event-types-YOY5TKUN.js');
9
+ var header1 = require('./header-1-DRA3f4Jh.js');
10
+ var insuranceState = require('./insurance-state-d2thhXUX.js');
11
+ var header3 = require('./header-3-sOdOpfx3.js');
12
+ var checkPkgVersion = require('./check-pkg-version-DiQ-d5Nl.js');
13
+ require('./config-state-BBOZIS8x.js');
14
+ require('./dinero-BwNN_k7x.js');
15
+ var ComponentError = require('./ComponentError-D4OLnOkg.js');
16
+ var Refund = require('./Refund-BefKONu4.js');
17
+ require('./Pagination-Dediz133.js');
18
+ require('./Business-DCRzZf0w.js');
19
+ require('./Dispute-CruQTF6_.js');
20
+ var utils$1 = require('./utils-DvUQQLmR.js');
21
+ var checkout_service = require('./checkout.service-B-R80p4f.js');
22
+ var index$1 = require('./index-D-dD-aC2.js');
23
+ var Api = require('./Api-DyimBzKT.js');
24
+ var paymentMethodOptionUtils = require('./payment-method-option-utils-WYHIHy-l.js');
25
+ require('./index-B32W0A3m.js');
26
+ require('./package-Be2aoTf8.js');
27
+ require('./helpers-B5OCqlIM.js');
28
+ require('./state-options-CIT9xdTz.js');
29
+
30
+ const Summary = class {
31
+ constructor(hostRef) {
32
+ index.registerInstance(this, hostRef);
33
+ }
34
+ render() {
35
+ return (index.h(styledHost.StyledHost, { key: 'fccb819d66329424af42e9c53effec29a6c9784d' }, index.h("section", { key: '0ee7a4e0579f7f222a9db82e6b4db6bb92542d9e' }, index.h("div", { key: 'bdf74b2bc5db35b96ca75d50783b790bb482a76e' }, index.h("div", { key: '851b481bd6beb1fcaadc106d27d131f8b07d1c9a', part: parts.text }, checkout_store.checkoutStore === null || checkout_store.checkoutStore === void 0 ? void 0 : checkout_store.checkoutStore.paymentDescription), index.h("div", { key: '0b261bc0e2d65cf989778e02df51b3265816f7aa' }, index.h("span", { key: '0eee0017ddf25ae45d6b5c828071098f45e6e19d', part: parts.text }, "Total"), "\u00A0", index.h("span", { key: 'd21576f14c3437f70a4b85b9dfc01107392d663a', part: parts.text }, utils.formatCurrency(+(checkout_store.checkoutStore === null || checkout_store.checkoutStore === void 0 ? void 0 : checkout_store.checkoutStore.totalAmount))))))));
36
+ }
37
+ };
38
+
39
+ const Header = class {
40
+ constructor(hostRef) {
41
+ index.registerInstance(this, hostRef);
42
+ this.levels = {
43
+ h1: header1.Header1,
44
+ h2: insuranceState.Header2,
45
+ h3: header3.Header3,
46
+ };
47
+ this.level = 'h1';
48
+ }
49
+ render() {
50
+ const HeaderComponent = this.levels[this.level];
51
+ return (index.h(styledHost.StyledHost, { key: 'ae04a67a1eaf95d6d093fef23911ac4eb1523cfe' }, index.h(HeaderComponent, { key: '51b27dd180d113ebe9ac52f7ff10c494926f7cdf', text: this.text, class: this.class })));
52
+ }
53
+ };
54
+
55
+ const makeGetCheckout = ({ authToken, checkoutId, service }) => async ({ onSuccess, onError }) => {
56
+ var _a;
57
+ try {
58
+ const response = await service.fetchCheckout(authToken, checkoutId);
59
+ if (!response.error) {
60
+ const checkout = response.data;
61
+ onSuccess({ checkout });
62
+ }
63
+ else {
64
+ const responseError = utils$1.getErrorMessage(response.error);
65
+ const code = utils$1.getErrorCode((_a = response.error) === null || _a === void 0 ? void 0 : _a.code);
66
+ return onError({
67
+ error: responseError,
68
+ code,
69
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
70
+ });
71
+ }
72
+ }
73
+ catch (error) {
74
+ const code = utils$1.getErrorCode(error === null || error === void 0 ? void 0 : error.code);
75
+ return onError({
76
+ error: error.message || error,
77
+ code,
78
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
79
+ });
80
+ }
81
+ };
82
+ const makeCheckoutComplete = ({ authToken, checkoutId, service }) => async ({ payment, onSuccess, onError }) => {
83
+ var _a;
84
+ try {
85
+ const response = await service.complete(authToken, checkoutId, payment);
86
+ if (!response.error) {
87
+ const checkout = response.data;
88
+ onSuccess({ checkout });
89
+ }
90
+ else {
91
+ const responseError = utils$1.getErrorMessage(response.error);
92
+ const code = utils$1.getErrorCode((_a = response.error) === null || _a === void 0 ? void 0 : _a.code);
93
+ return onError({
94
+ error: responseError,
95
+ code,
96
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
97
+ });
98
+ }
99
+ }
100
+ catch (error) {
101
+ const code = utils$1.getErrorCode(error === null || error === void 0 ? void 0 : error.code);
102
+ return onError({
103
+ error: error.message || error,
104
+ code,
105
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
106
+ });
107
+ }
108
+ };
109
+
110
+ const ModularCheckout = class {
111
+ constructor(hostRef) {
112
+ index.registerInstance(this, hostRef);
113
+ this.errorEvent = index.createEvent(this, "error-event");
114
+ this.submitEvent = index.createEvent(this, "submit-event");
115
+ this.checkoutChangedEvent = index.createEvent(this, "checkout-changed");
116
+ this.savePaymentMethod = false;
117
+ this.handleApplePayCompleted = (event) => {
118
+ const { success, token, paymentMethodId, error } = event.detail;
119
+ if (success && token) {
120
+ checkout_store.checkoutStore.paymentToken = paymentMethodId;
121
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.applePay };
122
+ this.submitCheckout();
123
+ }
124
+ else {
125
+ console.error("Apple Pay completed but failed:", error);
126
+ this.errorEvent.emit({
127
+ message: (error === null || error === void 0 ? void 0 : error.message) || "Apple Pay payment failed",
128
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
129
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
130
+ });
131
+ }
132
+ };
133
+ this.handleApplePayError = (event) => {
134
+ const { error } = event.detail;
135
+ console.error("Apple Pay error:", error);
136
+ this.errorEvent.emit({
137
+ message: error || "Apple Pay error occurred",
138
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
139
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
140
+ });
141
+ };
142
+ this.handleApplePayCancelled = () => {
143
+ checkout_store.checkoutStore.paymentToken = undefined;
144
+ checkout_store.checkoutStore.selectedPaymentMethod = undefined;
145
+ };
146
+ }
147
+ savePaymentMethodChanged(newValue) {
148
+ checkout_store.checkoutStore.savePaymentMethod = newValue;
149
+ }
150
+ connectedCallback() {
151
+ this.observer = new MutationObserver(() => {
152
+ this.queryFormRefs();
153
+ this.setupApplePayListeners(); // set up again listeners when DOM changes
154
+ });
155
+ this.observer.observe(this.hostEl, {
156
+ childList: true,
157
+ subtree: true,
158
+ });
159
+ checkout_store.checkoutStore.checkoutId = this.checkoutId;
160
+ const config = {
161
+ authToken: this.authToken,
162
+ checkoutId: this.checkoutId,
163
+ service: new checkout_service.CheckoutService(),
164
+ };
165
+ this.getCheckout = makeGetCheckout(config);
166
+ this.completeCheckout = makeCheckoutComplete(config);
167
+ // Emit checkout-changed whenever any store key changes
168
+ checkout_store.onAnyChange(() => {
169
+ this.emitCheckoutChanged();
170
+ });
171
+ }
172
+ componentWillLoad() {
173
+ this.analytics = new checkPkgVersion.JustifiAnalytics(this);
174
+ checkPkgVersion.checkPkgVersion();
175
+ checkout_store.checkoutStore.authToken = this.authToken;
176
+ checkout_store.checkoutStore.savePaymentMethod = this.savePaymentMethod;
177
+ this.fetchCheckout();
178
+ // Refresh the checkout data when insurance values actually change (not on initial load)
179
+ insuranceState.insuranceValuesOn("set", (key) => {
180
+ const value = insuranceState.insuranceValues[key];
181
+ if (value !== undefined && insuranceState.hasInsuranceValueChanged(key, value)) {
182
+ this.fetchCheckout();
183
+ }
184
+ });
185
+ }
186
+ componentDidLoad() {
187
+ this.queryFormRefs();
188
+ this.setupApplePayListeners();
189
+ }
190
+ disconnectedCallback() {
191
+ var _a;
192
+ (_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
193
+ this.removeApplePayListeners();
194
+ }
195
+ fetchCheckout() {
196
+ if (!this.authToken || !this.checkoutId) {
197
+ this.errorEvent.emit({
198
+ message: ComponentError.ComponentErrorMessages.NOT_AUTHENTICATED,
199
+ errorCode: ComponentError.ComponentErrorCodes.NOT_AUTHENTICATED,
200
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
201
+ });
202
+ return;
203
+ }
204
+ if (this.getCheckout) {
205
+ this.getCheckout({
206
+ onSuccess: ({ checkout }) => {
207
+ this.updateStore(checkout);
208
+ if (checkout.status === Refund.ICheckoutStatus.completed) {
209
+ this.errorEvent.emit({
210
+ message: ComponentError.ComponentErrorMessages.CHECKOUT_ALREADY_COMPLETED,
211
+ errorCode: ComponentError.ComponentErrorCodes.CHECKOUT_ALREADY_COMPLETED,
212
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
213
+ });
214
+ return;
215
+ }
216
+ else if (checkout.status === Refund.ICheckoutStatus.expired) {
217
+ this.errorEvent.emit({
218
+ message: ComponentError.ComponentErrorMessages.CHECKOUT_EXPIRED,
219
+ errorCode: ComponentError.ComponentErrorCodes.CHECKOUT_EXPIRED,
220
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
221
+ });
222
+ return;
223
+ }
224
+ },
225
+ onError: (error) => {
226
+ this.errorEvent.emit({
227
+ message: error.message,
228
+ errorCode: ComponentError.ComponentErrorCodes.FETCH_ERROR,
229
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
230
+ });
231
+ },
232
+ });
233
+ }
234
+ }
235
+ updateStore(checkout) {
236
+ var _a, _b, _c, _d, _e;
237
+ checkout_store.checkoutStore.accountId = checkout.account_id;
238
+ checkout_store.checkoutStore.paymentMethods = checkout.payment_methods;
239
+ checkout_store.checkoutStore.paymentMethodGroupId = checkout.payment_method_group_id;
240
+ checkout_store.checkoutStore.paymentDescription = checkout.payment_description;
241
+ checkout_store.checkoutStore.totalAmount = checkout.total_amount;
242
+ checkout_store.checkoutStore.paymentAmount = checkout.payment_amount;
243
+ checkout_store.checkoutStore.bnplEnabled = checkout.payment_settings.bnpl_payments;
244
+ checkout_store.checkoutStore.insuranceEnabled = checkout.payment_settings.insurance_payments;
245
+ checkout_store.checkoutStore.bankAccountVerification = (_a = checkout.payment_settings) === null || _a === void 0 ? void 0 : _a.bank_account_verification;
246
+ checkout_store.checkoutStore.bnplProviderClientId = (_b = checkout === null || checkout === void 0 ? void 0 : checkout.bnpl) === null || _b === void 0 ? void 0 : _b.provider_client_id;
247
+ checkout_store.checkoutStore.bnplProviderMode = (_c = checkout === null || checkout === void 0 ? void 0 : checkout.bnpl) === null || _c === void 0 ? void 0 : _c.provider_mode;
248
+ checkout_store.checkoutStore.bnplProviderApiVersion = (_d = checkout === null || checkout === void 0 ? void 0 : checkout.bnpl) === null || _d === void 0 ? void 0 : _d.provider_api_version;
249
+ checkout_store.checkoutStore.bnplProviderCheckoutUrl =
250
+ (_e = checkout === null || checkout === void 0 ? void 0 : checkout.bnpl) === null || _e === void 0 ? void 0 : _e.provider_checkout_url;
251
+ }
252
+ emitCheckoutChanged() {
253
+ const detail = {
254
+ availablePaymentMethodTypes: checkout_store.getAvailablePaymentMethodTypes(),
255
+ selectedPaymentMethod: checkout_store.checkoutStore.selectedPaymentMethod,
256
+ savedPaymentMethods: checkout_store.checkoutStore.paymentMethods,
257
+ };
258
+ this.checkoutChangedEvent.emit(detail);
259
+ }
260
+ queryFormRefs() {
261
+ this.billingFormRef = this.hostEl.querySelector("justifi-billing-form, justifi-bank-account-billing-form-simple, justifi-card-billing-form-simple, justifi-billing-form-full");
262
+ this.applePayRef = this.hostEl.querySelector("justifi-apple-pay");
263
+ this.paymentMethodFormRef =
264
+ this.hostEl.querySelector('justifi-card-form, justifi-bank-account-form, justifi-tokenize-payment-method');
265
+ this.insuranceFormRef = this.hostEl.querySelector('justifi-season-interruption-insurance');
266
+ }
267
+ setupApplePayListeners() {
268
+ if (this.applePayRef) {
269
+ this.applePayRef.addEventListener("applePayCompleted", this.handleApplePayCompleted);
270
+ this.applePayRef.addEventListener("applePayError", this.handleApplePayError);
271
+ this.applePayRef.addEventListener("applePayCancelled", this.handleApplePayCancelled);
272
+ }
273
+ }
274
+ removeApplePayListeners() {
275
+ if (this.applePayRef) {
276
+ this.applePayRef.removeEventListener("applePayCompleted", this.handleApplePayCompleted);
277
+ this.applePayRef.removeEventListener("applePayError", this.handleApplePayError);
278
+ this.applePayRef.removeEventListener("applePayCancelled", this.handleApplePayCancelled);
279
+ }
280
+ }
281
+ async tokenizePaymentMethod(tokenizeArgs) {
282
+ var _a, _b, _c;
283
+ const billingInfoValues = (_b = (await ((_a = this.billingFormRef) === null || _a === void 0 ? void 0 : _a.getValues()))) !== null && _b !== void 0 ? _b : {};
284
+ const combinedBillingInfo = Object.assign(Object.assign({}, tokenizeArgs), billingInfoValues);
285
+ const paymentMethodMetadata = Object.assign({ accountId: checkout_store.checkoutStore.accountId, payment_method_group_id: undefined }, combinedBillingInfo);
286
+ if (checkout_store.checkoutStore.savePaymentMethod) {
287
+ paymentMethodMetadata.payment_method_group_id =
288
+ checkout_store.checkoutStore.paymentMethodGroupId;
289
+ }
290
+ const tokenizeResult = await ((_c = this.paymentMethodFormRef) === null || _c === void 0 ? void 0 : _c.tokenize({
291
+ clientId: this.authToken,
292
+ paymentMethodMetadata,
293
+ account: checkout_store.checkoutStore.accountId,
294
+ }));
295
+ if (tokenizeResult.error) {
296
+ return tokenizeResult;
297
+ }
298
+ checkout_store.checkoutStore.paymentToken = tokenizeResult.id;
299
+ return tokenizeResult.id;
300
+ }
301
+ // set the selected payment method to the checkout store from outside the component
302
+ async setSelectedPaymentMethod(paymentMethod) {
303
+ checkout_store.checkoutStore.selectedPaymentMethod = paymentMethod;
304
+ }
305
+ // getAvailablePaymentMethods removed in favor of checkout-changed event
306
+ // if validation fails, the error will be emitted by the component
307
+ async validate() {
308
+ const promises = [];
309
+ if (checkout_store.checkoutStore.insuranceEnabled && this.insuranceFormRef) {
310
+ promises.push(this.insuranceFormRef.validate());
311
+ }
312
+ const isNewCard = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.card && checkout_store.checkoutStore.selectedPaymentMethod.id === undefined;
313
+ const isNewBankAccount = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.bankAccount && checkout_store.checkoutStore.selectedPaymentMethod.id === undefined;
314
+ // For new card/bank account, validate payment method + billing.
315
+ if (isNewCard ||
316
+ isNewBankAccount) {
317
+ if (this.paymentMethodFormRef)
318
+ promises.push(this.paymentMethodFormRef.validate());
319
+ if (this.billingFormRef)
320
+ promises.push(this.billingFormRef.validate());
321
+ }
322
+ if (promises.length === 0)
323
+ return true;
324
+ try {
325
+ const results = await Promise.all(promises);
326
+ // Normalize different validator return shapes:
327
+ // - boolean -> use it directly
328
+ // - object -> look for isValid; treat missing isValid as falsey only if explicitly false
329
+ const resultsAreValid = results.every(r => typeof r === 'boolean' ? r : (r === null || r === void 0 ? void 0 : r.isValid) !== false);
330
+ if (!resultsAreValid) {
331
+ this.errorEvent.emit({
332
+ message: 'Validation error',
333
+ errorCode: ComponentError.ComponentErrorCodes.VALIDATION_ERROR,
334
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
335
+ });
336
+ return false;
337
+ }
338
+ return true;
339
+ }
340
+ catch (_a) {
341
+ // If any validator throws/rejects, consider the whole validation failed.
342
+ return false;
343
+ }
344
+ }
345
+ async submitCheckout(submitCheckoutArgs) {
346
+ const isValid = await this.validate();
347
+ const isNewCard = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.card &&
348
+ checkout_store.checkoutStore.selectedPaymentMethod.id === undefined;
349
+ const isNewBankAccount = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.bankAccount &&
350
+ checkout_store.checkoutStore.selectedPaymentMethod.id === undefined;
351
+ const shouldTokenize = isNewCard || isNewBankAccount;
352
+ if (shouldTokenize) {
353
+ const tokenizeResult = await this.tokenizePaymentMethod(submitCheckoutArgs);
354
+ if (tokenizeResult === null || tokenizeResult === void 0 ? void 0 : tokenizeResult.error) {
355
+ this.errorEvent.emit({
356
+ message: tokenizeResult.error.message,
357
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
358
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
359
+ });
360
+ return;
361
+ }
362
+ }
363
+ if (!isValid) {
364
+ this.errorEvent.emit({
365
+ message: "Please fill in all required fields.",
366
+ errorCode: ComponentError.ComponentErrorCodes.VALIDATION_ERROR,
367
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
368
+ });
369
+ return;
370
+ }
371
+ if (!checkout_store.checkoutStore.paymentToken) {
372
+ this.errorEvent.emit({
373
+ message: 'Payment token not found.',
374
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
375
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
376
+ });
377
+ }
378
+ let payment;
379
+ const mapTypeToPaymentMode = (type) => {
380
+ switch (type) {
381
+ case Refund.PaymentMethodTypes.card:
382
+ case Refund.PaymentMethodTypes.bankAccount:
383
+ case Refund.PaymentMethodTypes.plaid:
384
+ return index$1.PAYMENT_MODE.ECOM;
385
+ case Refund.PaymentMethodTypes.sezzle:
386
+ return index$1.PAYMENT_MODE.BNPL;
387
+ case Refund.PaymentMethodTypes.applePay:
388
+ return index$1.PAYMENT_MODE.APPLE_PAY;
389
+ default:
390
+ return undefined;
391
+ }
392
+ };
393
+ payment = {
394
+ payment_mode: mapTypeToPaymentMode(checkout_store.checkoutStore.selectedPaymentMethod.type),
395
+ payment_token: checkout_store.checkoutStore.paymentToken,
396
+ };
397
+ this.completeCheckout({
398
+ payment,
399
+ onSuccess: ({ checkout }) => {
400
+ this.submitEvent.emit({
401
+ checkout,
402
+ message: "Checkout completed successfully",
403
+ });
404
+ },
405
+ onError: (error) => {
406
+ this.errorEvent.emit({
407
+ message: error.message,
408
+ errorCode: ComponentError.ComponentErrorCodes.COMPLETE_CHECKOUT_ERROR,
409
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
410
+ });
411
+ },
412
+ });
413
+ }
414
+ render() {
415
+ return index.h(index.Host, { key: '4df5d1aa50fbeee7da93f8e19e45f6907b6ae2c7' });
416
+ }
417
+ get hostEl() { return index.getElement(this); }
418
+ static get watchers() { return {
419
+ "savePaymentMethod": ["savePaymentMethodChanged"]
420
+ }; }
421
+ };
422
+
423
+ const plaidIconSvg = 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgMjggMjkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9ImNzcy0xcmRhajhtIj48ZyBmaWxsPSIjMTExIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yNS43NjI5IDI2LjI2MjhMMjggMTcuNTMwOUwyNC45NjkxIDE0LjUwMDFMMjcuOTk5OSAxMS40NjkxTDI1Ljc2MjggMi43MzcwNkwxNy4wMzA5IDAuNUwxNC4wMDAxIDMuNTMxTDEwLjk2OSAwLjUwMDE0TDIuMjM3MDYgMi43MzczNEwwIDExLjQ2OTFMMy4wMzEyOCAxNC40OTk5TDAuMDAwMTQgMTcuNTMxTDIuMjM3MiAyNi4yNjI5TDEwLjk2OTEgMjguNUwxNC4wMDAxIDI1LjQ2OUwxNy4wMzEgMjguNDk5OUwyNS43NjI5IDI2LjI2MjhaTTE1LjczMjEgMjMuNzM3MUwxOC42MTg2IDIwLjg1MDVMMjIuMjkxMiAyNC41MjMzTDE3LjY5NTYgMjUuNzAwN0wxNS43MzIxIDIzLjczNzFaTTExLjExMzYgOS44ODE1NEwxNC4wMDAzIDYuOTk1MDJMMTYuODg2OCA5Ljg4MTRMMTQuMDAwMSAxMi43Njc5TDExLjExMzYgOS44ODE1NFpNMTIuMjY4MiAxNC41TDkuMzgxNTQgMTcuMzg2NUw2LjQ5NTAyIDE0LjVMOS4zODE1NCAxMS42MTM1TDEyLjI2ODIgMTQuNVpNMTguNjE4NyAxMS42MTMzTDIxLjUwNTMgMTQuNUwxOC42MTg2IDE3LjM4NjVMMTUuNzMyMSAxNC41TDE4LjYxODcgMTEuNjEzM1pNMTYuODg2NyAxOS4xMTg2TDE0LjAwMDEgMjIuMDA1MUwxMS4xMTM1IDE5LjExODVMMTQuMDAwMSAxNi4yMzE5TDE2Ljg4NjcgMTkuMTE4NlpNMTAuMzA0NCAyNS43MDA3TDUuNzA4NjQgMjQuNTIzM0w5LjM4MTU0IDIwLjg1MDRMMTIuMjY4MiAyMy43MzcxTDEwLjMwNDQgMjUuNzAwN1pNNC43NjMwOCAxNi4yMzE5TDcuNjQ5NiAxOS4xMTg1TDMuOTc2NyAyMi43OTE0TDIuNzk5MyAxOC4xOTU3TDQuNzYzMDggMTYuMjMxOVpNMy45NzY3IDYuMjA4MzZMNy42NDk3NCA5Ljg4MTRMNC43NjMwOCAxMi43NjgxTDIuNzk5MyAxMC44MDQxTDMuOTc2NyA2LjIwODM2Wk0xMi4yNjgzIDUuMjYyOTRMOS4zODE2OCA4LjE0OTZMNS43MDg5MiA0LjQ3NjdMMTAuMzA0NyAzLjI5OTNMMTIuMjY4MyA1LjI2Mjk0Wk0xNy42OTU5IDMuMjk5M0wyMi4yOTE1IDQuNDc2N0wxOC42MTg2IDguMTQ5NDZMMTUuNzMyMSA1LjI2Mjk0TDE3LjY5NTkgMy4yOTkzWk0yMy4yMzcyIDEyLjc2ODFMMjAuMzUwNSA5Ljg4MTRMMjQuMDIzMyA2LjIwODc4TDI1LjIwMDcgMTAuODA0NkwyMy4yMzcyIDEyLjc2ODFaTTI0LjAyMzMgMjIuNzkxNEwyMC4zNTA1IDE5LjExODZMMjMuMjM3MiAxNi4yMzIxTDI1LjIwMDcgMTguMTk1N0wyNC4wMjMzIDIyLjc5MTRaIj48L3BhdGg+PC9nPjwvc3ZnPgo=';
424
+
425
+ const api = Api.Api();
426
+ class PlaidService {
427
+ async getLinkToken(authToken, accountId, checkoutId, signal) {
428
+ const endpoint = `plaid/${accountId}/link`;
429
+ const body = { checkout_id: checkoutId };
430
+ return api.post({ endpoint, body, authToken, signal });
431
+ }
432
+ async tokenizeBankAccount(authToken, accountId, publicToken, linkTokenId, paymentMethodGroupId, signal) {
433
+ const endpoint = `plaid/${accountId}/tokenize`;
434
+ const body = { public_token: publicToken };
435
+ if (linkTokenId) {
436
+ body.link_token_id = linkTokenId;
437
+ }
438
+ if (paymentMethodGroupId) {
439
+ body.payment_method_group_id = paymentMethodGroupId;
440
+ }
441
+ return api.post({ endpoint, body, authToken, signal });
442
+ }
443
+ }
444
+
445
+ // Plaid-specific error codes
446
+ var PlaidErrorCodes;
447
+ (function (PlaidErrorCodes) {
448
+ PlaidErrorCodes["PLAID_SDK_LOAD_FAILED"] = "plaid-sdk-load-failed";
449
+ PlaidErrorCodes["PLAID_LINK_INIT_FAILED"] = "plaid-link-init-failed";
450
+ PlaidErrorCodes["PLAID_LINK_TOKEN_FAILED"] = "plaid-link-token-failed";
451
+ PlaidErrorCodes["PLAID_AUTHENTICATION_FAILED"] = "plaid-authentication-failed";
452
+ PlaidErrorCodes["PLAID_BANK_NOT_SUPPORTED"] = "plaid-bank-not-supported";
453
+ PlaidErrorCodes["PLAID_TOKEN_EXPIRED"] = "plaid-token-expired";
454
+ PlaidErrorCodes["PLAID_NETWORK_ERROR"] = "plaid-network-error";
455
+ PlaidErrorCodes["PLAID_USER_CANCELLED"] = "plaid-user-cancelled";
456
+ PlaidErrorCodes["PLAID_TIMEOUT"] = "plaid-timeout";
457
+ PlaidErrorCodes["PLAID_INVALID_CREDENTIALS"] = "plaid-invalid-credentials";
458
+ PlaidErrorCodes["PLAID_ACCOUNT_LOCKED"] = "plaid-account-locked";
459
+ PlaidErrorCodes["PLAID_MAINTENANCE"] = "plaid-maintenance";
460
+ PlaidErrorCodes["PLAID_RATE_LIMITED"] = "plaid-rate-limited";
461
+ })(PlaidErrorCodes || (PlaidErrorCodes = {}));
462
+ // Plaid error message mapping
463
+ const PLAID_ERROR_MESSAGES = {
464
+ [PlaidErrorCodes.PLAID_SDK_LOAD_FAILED]: 'Unable to load Plaid. Please refresh the page and try again.',
465
+ [PlaidErrorCodes.PLAID_LINK_INIT_FAILED]: 'Unable to initialize bank connection. Please try again.',
466
+ [PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED]: 'Unable to connect to bank service. Please try again.',
467
+ [PlaidErrorCodes.PLAID_AUTHENTICATION_FAILED]: 'Bank authentication failed. Please try again.',
468
+ [PlaidErrorCodes.PLAID_BANK_NOT_SUPPORTED]: 'Your bank is not currently supported. Please try a different payment method.',
469
+ [PlaidErrorCodes.PLAID_TOKEN_EXPIRED]: 'Your bank session has expired. Please reconnect your account.',
470
+ [PlaidErrorCodes.PLAID_NETWORK_ERROR]: 'Network connection issue. Please check your internet connection and try again.',
471
+ [PlaidErrorCodes.PLAID_USER_CANCELLED]: 'Bank connection was cancelled. Click to try again.',
472
+ [PlaidErrorCodes.PLAID_TIMEOUT]: 'Bank connection timed out. Please try again.',
473
+ [PlaidErrorCodes.PLAID_INVALID_CREDENTIALS]: 'Invalid bank credentials. Please check your username and password.',
474
+ [PlaidErrorCodes.PLAID_ACCOUNT_LOCKED]: 'Your bank account is temporarily locked. Please contact your bank.',
475
+ [PlaidErrorCodes.PLAID_MAINTENANCE]: 'Bank service is temporarily unavailable. Please try again later.',
476
+ [PlaidErrorCodes.PLAID_RATE_LIMITED]: 'Too many connection attempts. Please wait a moment and try again.',
477
+ };
478
+ // Plaid error severity mapping
479
+ const PLAID_ERROR_SEVERITY = {
480
+ [PlaidErrorCodes.PLAID_SDK_LOAD_FAILED]: ComponentError.ComponentErrorSeverity.ERROR,
481
+ [PlaidErrorCodes.PLAID_LINK_INIT_FAILED]: ComponentError.ComponentErrorSeverity.ERROR,
482
+ [PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED]: ComponentError.ComponentErrorSeverity.ERROR,
483
+ [PlaidErrorCodes.PLAID_AUTHENTICATION_FAILED]: ComponentError.ComponentErrorSeverity.ERROR,
484
+ [PlaidErrorCodes.PLAID_BANK_NOT_SUPPORTED]: ComponentError.ComponentErrorSeverity.WARNING,
485
+ [PlaidErrorCodes.PLAID_TOKEN_EXPIRED]: ComponentError.ComponentErrorSeverity.WARNING,
486
+ [PlaidErrorCodes.PLAID_NETWORK_ERROR]: ComponentError.ComponentErrorSeverity.WARNING,
487
+ [PlaidErrorCodes.PLAID_USER_CANCELLED]: ComponentError.ComponentErrorSeverity.INFO,
488
+ [PlaidErrorCodes.PLAID_TIMEOUT]: ComponentError.ComponentErrorSeverity.WARNING,
489
+ [PlaidErrorCodes.PLAID_INVALID_CREDENTIALS]: ComponentError.ComponentErrorSeverity.ERROR,
490
+ [PlaidErrorCodes.PLAID_ACCOUNT_LOCKED]: ComponentError.ComponentErrorSeverity.ERROR,
491
+ [PlaidErrorCodes.PLAID_MAINTENANCE]: ComponentError.ComponentErrorSeverity.WARNING,
492
+ [PlaidErrorCodes.PLAID_RATE_LIMITED]: ComponentError.ComponentErrorSeverity.WARNING,
493
+ };
494
+ const PlaidPaymentMethod = class {
495
+ constructor(hostRef) {
496
+ index.registerInstance(this, hostRef);
497
+ this.paymentMethodOptionSelected = index.createEvent(this, "paymentMethodOptionSelected");
498
+ this.plaidError = index.createEvent(this, "plaidError");
499
+ this.plaidErrorRecovered = index.createEvent(this, "plaidErrorRecovered");
500
+ this.isAuthenticating = false;
501
+ this.publicToken = null;
502
+ this.linkToken = null;
503
+ this.linkTokenId = null;
504
+ this.error = null;
505
+ this.plaidLink = null;
506
+ this.isSelected = false;
507
+ this.retryCount = 0;
508
+ this.isRetrying = false;
509
+ this.plaidService = new PlaidService();
510
+ this.maxRetries = 3;
511
+ this.retryDelay = 2000; // 2 seconds
512
+ this.timeoutId = null;
513
+ this.abortController = null;
514
+ this.hasLoggedDisabledWarning = false;
515
+ this.waitForStoreAndInitialize = () => {
516
+ // Check if store has necessary data
517
+ if (checkout_store.checkoutStore.authToken && checkout_store.checkoutStore.accountId && checkout_store.checkoutStore.checkoutId) {
518
+ this.initializePlaidLink();
519
+ }
520
+ else {
521
+ // Wait a bit and try again
522
+ setTimeout(() => {
523
+ this.waitForStoreAndInitialize();
524
+ }, 100);
525
+ }
526
+ };
527
+ this.initializePlaidLink = async () => {
528
+ try {
529
+ // Check if Plaid is available globally
530
+ if (typeof window.Plaid === 'undefined') {
531
+ this.handleError({
532
+ code: PlaidErrorCodes.PLAID_SDK_LOAD_FAILED,
533
+ message: PLAID_ERROR_MESSAGES[PlaidErrorCodes.PLAID_SDK_LOAD_FAILED],
534
+ severity: PLAID_ERROR_SEVERITY[PlaidErrorCodes.PLAID_SDK_LOAD_FAILED],
535
+ retryable: true,
536
+ userAction: 'Refresh the page and try again'
537
+ });
538
+ return;
539
+ }
540
+ // Get link token from backend
541
+ await this.getLinkToken();
542
+ if (!this.linkToken) {
543
+ this.handleError({
544
+ code: PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED,
545
+ message: PLAID_ERROR_MESSAGES[PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED],
546
+ severity: PLAID_ERROR_SEVERITY[PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED],
547
+ retryable: true,
548
+ userAction: 'Click to try again'
549
+ });
550
+ return;
551
+ }
552
+ // Initialize Plaid Link
553
+ const Plaid = window.Plaid;
554
+ this.plaidLink = Plaid.create({
555
+ token: this.linkToken,
556
+ onSuccess: this.handlePlaidSuccess,
557
+ onExit: this.handlePlaidExit,
558
+ onEvent: this.handlePlaidEvent,
559
+ onLoad: this.handlePlaidLoad,
560
+ });
561
+ }
562
+ catch (error) {
563
+ this.handleError({
564
+ code: PlaidErrorCodes.PLAID_LINK_INIT_FAILED,
565
+ message: PLAID_ERROR_MESSAGES[PlaidErrorCodes.PLAID_LINK_INIT_FAILED],
566
+ severity: PLAID_ERROR_SEVERITY[PlaidErrorCodes.PLAID_LINK_INIT_FAILED],
567
+ originalError: error,
568
+ retryable: true,
569
+ userAction: 'Click to try again'
570
+ });
571
+ }
572
+ };
573
+ this.getLinkToken = async () => {
574
+ var _a, _b, _c, _d, _e;
575
+ try {
576
+ if (!checkout_store.checkoutStore.authToken || !checkout_store.checkoutStore.accountId) {
577
+ this.handleError({
578
+ code: PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED,
579
+ message: 'Missing authentication. Please refresh the page and try again.',
580
+ severity: ComponentError.ComponentErrorSeverity.ERROR,
581
+ retryable: false,
582
+ userAction: 'Refresh the page'
583
+ });
584
+ return;
585
+ }
586
+ // Create abort controller for timeout handling
587
+ this.abortController = new AbortController();
588
+ // Set timeout for the request
589
+ this.timeoutId = setTimeout(() => {
590
+ var _a;
591
+ (_a = this.abortController) === null || _a === void 0 ? void 0 : _a.abort();
592
+ }, 30000); // 30 second timeout
593
+ const response = await this.plaidService.getLinkToken(checkout_store.checkoutStore.authToken, checkout_store.checkoutStore.accountId, checkout_store.checkoutStore.checkoutId, this.abortController.signal);
594
+ // Clear timeout
595
+ if (this.timeoutId) {
596
+ clearTimeout(this.timeoutId);
597
+ this.timeoutId = null;
598
+ }
599
+ if (response.error) {
600
+ const errorMessage = typeof response.error === 'string'
601
+ ? response.error
602
+ : response.error.message || 'Failed to get link token';
603
+ throw new Error(errorMessage);
604
+ }
605
+ // Some backends may return an id along with the link token
606
+ this.linkToken = response.data.link_token;
607
+ // Try to capture link token id if present in envelope
608
+ this.linkTokenId = (response === null || response === void 0 ? void 0 : response.id) || ((_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.id) || null;
609
+ }
610
+ catch (error) {
611
+ // Clear timeout
612
+ if (this.timeoutId) {
613
+ clearTimeout(this.timeoutId);
614
+ this.timeoutId = null;
615
+ }
616
+ let errorCode = PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED;
617
+ let message = PLAID_ERROR_MESSAGES[errorCode];
618
+ let retryable = true;
619
+ // Handle specific error types
620
+ if (error.name === 'AbortError') {
621
+ errorCode = PlaidErrorCodes.PLAID_TIMEOUT;
622
+ message = PLAID_ERROR_MESSAGES[errorCode];
623
+ retryable = true;
624
+ }
625
+ else if (((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('network')) || ((_c = error.message) === null || _c === void 0 ? void 0 : _c.includes('fetch'))) {
626
+ errorCode = PlaidErrorCodes.PLAID_NETWORK_ERROR;
627
+ message = PLAID_ERROR_MESSAGES[errorCode];
628
+ retryable = true;
629
+ }
630
+ else if (((_d = error.message) === null || _d === void 0 ? void 0 : _d.includes('401')) || ((_e = error.message) === null || _e === void 0 ? void 0 : _e.includes('unauthorized'))) {
631
+ errorCode = PlaidErrorCodes.PLAID_INVALID_CREDENTIALS;
632
+ message = 'Authentication failed. Please refresh the page and try again.';
633
+ retryable = false;
634
+ }
635
+ this.handleError({
636
+ code: errorCode,
637
+ message: message,
638
+ severity: PLAID_ERROR_SEVERITY[errorCode],
639
+ originalError: error,
640
+ retryable,
641
+ userAction: retryable ? 'Click to try again' : 'Refresh the page'
642
+ });
643
+ }
644
+ };
645
+ this.mapApiErrorToPlaidError = (apiError) => {
646
+ if (typeof apiError === 'string') {
647
+ if (apiError.includes('rate_limit'))
648
+ return PlaidErrorCodes.PLAID_RATE_LIMITED;
649
+ if (apiError.includes('maintenance'))
650
+ return PlaidErrorCodes.PLAID_MAINTENANCE;
651
+ if (apiError.includes('not_authenticated'))
652
+ return PlaidErrorCodes.PLAID_INVALID_CREDENTIALS;
653
+ }
654
+ if (apiError === null || apiError === void 0 ? void 0 : apiError.code) {
655
+ switch (apiError.code) {
656
+ case 'rate_limited': return PlaidErrorCodes.PLAID_RATE_LIMITED;
657
+ case 'maintenance': return PlaidErrorCodes.PLAID_MAINTENANCE;
658
+ case 'not_authenticated': return PlaidErrorCodes.PLAID_INVALID_CREDENTIALS;
659
+ case 'invalid_parameter': return PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED;
660
+ default: return PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED;
661
+ }
662
+ }
663
+ return PlaidErrorCodes.PLAID_LINK_TOKEN_FAILED;
664
+ };
665
+ this.openPlaidLink = () => {
666
+ if (this.plaidLink && this.linkToken) {
667
+ this.isAuthenticating = true;
668
+ this.clearError();
669
+ this.plaidLink.open();
670
+ }
671
+ };
672
+ this.handlePlaidSuccess = (publicToken, _metadata) => {
673
+ this.publicToken = publicToken;
674
+ this.isAuthenticating = false;
675
+ this.clearError();
676
+ this.retryCount = 0; // Reset retry count on success
677
+ // Ensure the component remains selected after successful authentication
678
+ if (!this.isSelected) {
679
+ this.isSelected = true;
680
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.plaid };
681
+ }
682
+ // Emit success event for parent components
683
+ this.plaidErrorRecovered.emit({
684
+ code: 'plaid-success',
685
+ message: 'Bank account connected successfully',
686
+ severity: ComponentError.ComponentErrorSeverity.INFO
687
+ });
688
+ // Immediately exchange the public token for a payment method token via backend
689
+ this.exchangePublicTokenForPaymentMethod();
690
+ };
691
+ this.exchangePublicTokenForPaymentMethod = async () => {
692
+ var _a;
693
+ if (!this.publicToken) {
694
+ console.error('[PlaidPaymentMethod] exchange: missing publicToken');
695
+ return;
696
+ }
697
+ if (!checkout_store.checkoutStore.authToken || !checkout_store.checkoutStore.accountId) {
698
+ console.error('[PlaidPaymentMethod] exchange: missing auth/account context');
699
+ return;
700
+ }
701
+ try {
702
+ const response = await this.plaidService.tokenizeBankAccount(checkout_store.checkoutStore.authToken, checkout_store.checkoutStore.accountId, this.publicToken, this.linkTokenId || undefined, checkout_store.checkoutStore.savePaymentMethod ? checkout_store.checkoutStore.paymentMethodGroupId : undefined);
703
+ if (response === null || response === void 0 ? void 0 : response.error) {
704
+ console.error('[PlaidPaymentMethod] exchange: backend error', response.error);
705
+ return;
706
+ }
707
+ // Extract token from payment method response
708
+ const paymentMethod = response === null || response === void 0 ? void 0 : response.data;
709
+ const token = ((_a = paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.bank_account) === null || _a === void 0 ? void 0 : _a.token) || (paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.token) || (paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.id);
710
+ if (!token) {
711
+ console.error('[PlaidPaymentMethod] exchange: no token in response');
712
+ return;
713
+ }
714
+ // Save for downstream submit flows
715
+ checkout_store.checkoutStore.paymentToken = token;
716
+ }
717
+ catch (err) {
718
+ console.error('[PlaidPaymentMethod] exchange: exception', {
719
+ message: (err === null || err === void 0 ? void 0 : err.message) || String(err),
720
+ });
721
+ }
722
+ };
723
+ this.handlePlaidExit = (err, _metadata) => {
724
+ this.isAuthenticating = false;
725
+ if (err) {
726
+ this.handlePlaidError(err);
727
+ }
728
+ };
729
+ this.handlePlaidEvent = (eventName, metadata) => {
730
+ // Handle specific events if needed
731
+ switch (eventName) {
732
+ case 'OPEN':
733
+ this.isAuthenticating = true;
734
+ break;
735
+ case 'CLOSE':
736
+ this.isAuthenticating = false;
737
+ break;
738
+ case 'ERROR':
739
+ this.handlePlaidError(metadata);
740
+ break;
741
+ }
742
+ };
743
+ this.handlePlaidLoad = () => {
744
+ };
745
+ this.handlePlaidError = (error) => {
746
+ let errorCode = PlaidErrorCodes.PLAID_AUTHENTICATION_FAILED;
747
+ let message = PLAID_ERROR_MESSAGES[errorCode];
748
+ let retryable = true;
749
+ let userAction = 'Click to try again';
750
+ // Map Plaid error codes to our error codes
751
+ if (error.error_code) {
752
+ switch (error.error_code) {
753
+ case 'INVALID_CREDENTIALS':
754
+ errorCode = PlaidErrorCodes.PLAID_INVALID_CREDENTIALS;
755
+ message = PLAID_ERROR_MESSAGES[errorCode];
756
+ retryable = true;
757
+ break;
758
+ case 'ITEM_LOGIN_REQUIRED':
759
+ errorCode = PlaidErrorCodes.PLAID_INVALID_CREDENTIALS;
760
+ message = 'Your bank requires re-authentication. Please try again.';
761
+ retryable = true;
762
+ break;
763
+ case 'ITEM_LOCKED':
764
+ errorCode = PlaidErrorCodes.PLAID_ACCOUNT_LOCKED;
765
+ message = PLAID_ERROR_MESSAGES[errorCode];
766
+ retryable = false;
767
+ userAction = 'Contact your bank';
768
+ break;
769
+ case 'INSTITUTION_NOT_RESPONDING':
770
+ errorCode = PlaidErrorCodes.PLAID_MAINTENANCE;
771
+ message = PLAID_ERROR_MESSAGES[errorCode];
772
+ retryable = true;
773
+ break;
774
+ case 'RATE_LIMIT_EXCEEDED':
775
+ errorCode = PlaidErrorCodes.PLAID_RATE_LIMITED;
776
+ message = PLAID_ERROR_MESSAGES[errorCode];
777
+ retryable = true;
778
+ break;
779
+ case 'INVALID_REQUEST':
780
+ errorCode = PlaidErrorCodes.PLAID_AUTHENTICATION_FAILED;
781
+ message = 'Invalid request. Please try again.';
782
+ retryable = true;
783
+ break;
784
+ case 'PLAID_ERROR':
785
+ errorCode = PlaidErrorCodes.PLAID_AUTHENTICATION_FAILED;
786
+ message = error.error_message || 'Bank authentication failed. Please try again.';
787
+ retryable = true;
788
+ break;
789
+ default:
790
+ // Use the error message from Plaid if available
791
+ if (error.error_message) {
792
+ message = error.error_message;
793
+ }
794
+ break;
795
+ }
796
+ }
797
+ // Handle specific error messages
798
+ if (error.error_message) {
799
+ const lowerMessage = error.error_message.toLowerCase();
800
+ if (lowerMessage.includes('not supported') || lowerMessage.includes('unsupported')) {
801
+ errorCode = PlaidErrorCodes.PLAID_BANK_NOT_SUPPORTED;
802
+ message = PLAID_ERROR_MESSAGES[errorCode];
803
+ retryable = false;
804
+ userAction = 'Try a different payment method';
805
+ }
806
+ else if (lowerMessage.includes('expired') || lowerMessage.includes('timeout')) {
807
+ errorCode = PlaidErrorCodes.PLAID_TOKEN_EXPIRED;
808
+ message = PLAID_ERROR_MESSAGES[errorCode];
809
+ retryable = true;
810
+ }
811
+ }
812
+ this.handleError({
813
+ code: errorCode,
814
+ message,
815
+ severity: PLAID_ERROR_SEVERITY[errorCode],
816
+ originalError: error,
817
+ retryable,
818
+ userAction
819
+ });
820
+ this.isAuthenticating = false;
821
+ };
822
+ this.handleError = (plaidError) => {
823
+ this.error = plaidError;
824
+ // Emit error event for parent components
825
+ this.plaidError.emit({
826
+ code: plaidError.code,
827
+ message: plaidError.message,
828
+ severity: plaidError.severity,
829
+ data: {
830
+ originalError: plaidError.originalError,
831
+ retryable: plaidError.retryable,
832
+ userAction: plaidError.userAction,
833
+ retryCount: this.retryCount
834
+ }
835
+ });
836
+ console.error('Plaid error:', plaidError);
837
+ // Auto-retry for retryable errors if under max retries
838
+ if (plaidError.retryable && this.retryCount < this.maxRetries) {
839
+ this.scheduleRetry();
840
+ }
841
+ };
842
+ this.scheduleRetry = () => {
843
+ if (this.isRetrying)
844
+ return;
845
+ this.isRetrying = true;
846
+ this.retryCount++;
847
+ setTimeout(() => {
848
+ this.isRetrying = false;
849
+ this.clearError();
850
+ this.waitForStoreAndInitialize();
851
+ }, this.retryDelay * this.retryCount); // Exponential backoff
852
+ };
853
+ this.clearError = () => {
854
+ if (this.error) {
855
+ this.error = null;
856
+ this.retryCount = 0;
857
+ }
858
+ };
859
+ // Watch for store changes to sync component state
860
+ this.syncWithStore = () => {
861
+ const shouldBeSelected = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.plaid;
862
+ if (this.isSelected !== shouldBeSelected) {
863
+ this.isSelected = shouldBeSelected;
864
+ }
865
+ };
866
+ }
867
+ onSelectionChange(newValue) {
868
+ // Ensure store is updated when component selection changes
869
+ if (newValue && checkout_store.checkoutStore.selectedPaymentMethod.type !== Refund.PaymentMethodTypes.plaid) {
870
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.plaid };
871
+ }
872
+ // Auto-start Plaid flow when selected and ready
873
+ if (newValue &&
874
+ this.plaidLink &&
875
+ !this.publicToken &&
876
+ !this.isAuthenticating &&
877
+ !this.error) {
878
+ this.openPlaidLink();
879
+ }
880
+ }
881
+ componentDidRender() {
882
+ if (!this.scriptRef)
883
+ return;
884
+ this.scriptRef.onload = () => {
885
+ // Wait for store to be populated before initializing
886
+ this.waitForStoreAndInitialize();
887
+ };
888
+ // Add error handler for script loading failures
889
+ this.scriptRef.onerror = () => {
890
+ this.handleError({
891
+ code: PlaidErrorCodes.PLAID_SDK_LOAD_FAILED,
892
+ message: PLAID_ERROR_MESSAGES[PlaidErrorCodes.PLAID_SDK_LOAD_FAILED],
893
+ severity: PLAID_ERROR_SEVERITY[PlaidErrorCodes.PLAID_SDK_LOAD_FAILED],
894
+ retryable: true,
895
+ userAction: 'Refresh the page and try again'
896
+ });
897
+ };
898
+ }
899
+ componentWillLoad() {
900
+ // Initialize selection state based on store
901
+ this.isSelected = checkout_store.checkoutStore.selectedPaymentMethod.type === Refund.PaymentMethodTypes.plaid;
902
+ }
903
+ async resolvePaymentMethod() {
904
+ if (!this.publicToken) {
905
+ return { validationError: true };
906
+ }
907
+ return {
908
+ token: this.publicToken,
909
+ data: {
910
+ type: 'bank_account',
911
+ plaid_public_token: this.publicToken
912
+ }
913
+ };
914
+ }
915
+ // Returns a usable payment method token for checkout completion.
916
+ // Will perform the backend exchange if the token is not yet present in the store.
917
+ async getPaymentToken() {
918
+ if (checkout_store.checkoutStore.paymentToken) {
919
+ return checkout_store.checkoutStore.paymentToken;
920
+ }
921
+ await this.exchangePublicTokenForPaymentMethod();
922
+ return checkout_store.checkoutStore.paymentToken;
923
+ }
924
+ async handleSelectionClick() {
925
+ // Update local selection state
926
+ this.isSelected = true;
927
+ // Update store selection
928
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.plaid };
929
+ // If there's an error, clear it and try to initialize again
930
+ if (this.error) {
931
+ this.clearError();
932
+ this.waitForStoreAndInitialize();
933
+ return;
934
+ }
935
+ // If Plaid Link is ready and no public token exists, open Plaid Link
936
+ if (this.plaidLink && !this.publicToken && !this.isAuthenticating) {
937
+ this.openPlaidLink();
938
+ }
939
+ }
940
+ // Method to handle external selection changes (e.g., from other payment methods)
941
+ async setSelected(selected) {
942
+ this.isSelected = selected;
943
+ if (selected) {
944
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.plaid };
945
+ }
946
+ }
947
+ // Method to check if component is currently selected
948
+ async isCurrentlySelected() {
949
+ return this.isSelected;
950
+ }
951
+ // Method to handle external deselection (when another payment method is selected)
952
+ async deselect() {
953
+ this.isSelected = false;
954
+ // Don't clear the public token or error state as they might be needed if user reselects
955
+ }
956
+ // Method to reset component state (useful for testing or error recovery)
957
+ async reset() {
958
+ this.publicToken = null;
959
+ this.clearError();
960
+ this.isAuthenticating = false;
961
+ this.linkToken = null;
962
+ this.plaidLink = null;
963
+ this.retryCount = 0;
964
+ this.isRetrying = false;
965
+ // Clear any pending timeouts
966
+ if (this.timeoutId) {
967
+ clearTimeout(this.timeoutId);
968
+ this.timeoutId = null;
969
+ }
970
+ // Abort any pending requests
971
+ if (this.abortController) {
972
+ this.abortController.abort();
973
+ this.abortController = null;
974
+ }
975
+ }
976
+ // Method to check if component is ready for authentication
977
+ async isReadyForAuthentication() {
978
+ return !!(this.plaidLink && this.linkToken && !this.isAuthenticating);
979
+ }
980
+ // Method to manually retry after an error
981
+ async retry() {
982
+ if (this.error && this.error.retryable) {
983
+ this.clearError();
984
+ this.waitForStoreAndInitialize();
985
+ }
986
+ }
987
+ // Method to get current error information
988
+ async getErrorInfo() {
989
+ return this.error;
990
+ }
991
+ componentDidLoad() {
992
+ // Set up store change listener to keep component in sync
993
+ const unsubscribe = checkout_store.onChange('selectedPaymentMethod', this.syncWithStore);
994
+ // Store unsubscribe function for cleanup
995
+ this.unsubscribeFromStore = unsubscribe;
996
+ }
997
+ disconnectedCallback() {
998
+ // Clean up store subscription
999
+ if (this.unsubscribeFromStore) {
1000
+ this.unsubscribeFromStore();
1001
+ }
1002
+ // Clean up timeouts and abort controllers
1003
+ if (this.timeoutId) {
1004
+ clearTimeout(this.timeoutId);
1005
+ }
1006
+ if (this.abortController) {
1007
+ this.abortController.abort();
1008
+ }
1009
+ }
1010
+ render() {
1011
+ // Only allow use if enabled in checkout settings
1012
+ if (checkout_store.checkoutStore.bankAccountVerification !== true) {
1013
+ if (!this.hasLoggedDisabledWarning) {
1014
+ // Log once per component lifecycle
1015
+ console.warn('[PlaidPaymentMethod] bank_account_verification is disabled. Component will not render.');
1016
+ this.hasLoggedDisabledWarning = true;
1017
+ }
1018
+ return null;
1019
+ }
1020
+ const plaidLogo = (index.h("img", { class: "plaid-logo-img", src: plaidIconSvg, alt: "Plaid", title: "Plaid", style: {
1021
+ display: 'inline',
1022
+ width: '20px',
1023
+ height: '20px',
1024
+ marginLeft: '5px',
1025
+ marginTop: '-2px',
1026
+ } }));
1027
+ const renderErrorState = () => {
1028
+ if (!this.error)
1029
+ return null;
1030
+ const errorClass = this.error.severity === ComponentError.ComponentErrorSeverity.ERROR
1031
+ ? 'text-danger'
1032
+ : this.error.severity === ComponentError.ComponentErrorSeverity.WARNING
1033
+ ? 'text-warning'
1034
+ : 'text-info';
1035
+ return (index.h("div", { class: `${errorClass} mt-2` }, index.h("small", null, this.error.message), index.h("br", null), index.h("small", { class: "text-muted" }, this.error.userAction, this.error.retryable && this.retryCount < this.maxRetries && (index.h("span", null, " \u2022 Auto-retry in progress...")))));
1036
+ };
1037
+ const renderStatusState = () => {
1038
+ if (this.error)
1039
+ return null;
1040
+ if (this.isAuthenticating) {
1041
+ return (index.h("div", { class: "text-info mt-2" }, index.h("small", null, "Connecting to your bank...")));
1042
+ }
1043
+ if (this.publicToken) {
1044
+ return (index.h("div", { class: "text-success mt-2" }, index.h("small", null, "\u2713 Bank account connected successfully")));
1045
+ }
1046
+ if (this.isSelected && !this.publicToken && !this.error && !this.isAuthenticating) {
1047
+ return (index.h("div", { class: "text-muted mt-2" }, index.h("small", null, "Click to connect your bank account")));
1048
+ }
1049
+ return null;
1050
+ };
1051
+ return (index.h(styledHost.StyledHost, { class: "payment-method" }, index.h("script", { src: "https://cdn.plaid.com/link/v2/stable/link-initialize.js", async: true, ref: (el) => (this.scriptRef = el) }), index.h("div", { title: "Pay with Plaid" }, index.h("div", { onClick: (event) => { event.preventDefault(); this.handleSelectionClick(); } }, "Pay with Bank Account ", plaidLogo, " "), renderErrorState(), renderStatusState())));
1052
+ }
1053
+ static get watchers() { return {
1054
+ "isSelected": ["onSelectionChange"]
1055
+ }; }
1056
+ };
1057
+
1058
+ const SavedPaymentMethods = class {
1059
+ constructor(hostRef) {
1060
+ index.registerInstance(this, hostRef);
1061
+ this.onPaymentMethodOptionClick = (paymentMethod) => (e) => {
1062
+ e.preventDefault();
1063
+ checkout_store.checkoutStore.selectedPaymentMethod = paymentMethod;
1064
+ checkout_store.checkoutStore.paymentToken = paymentMethod.id;
1065
+ };
1066
+ this.isAllowedPaymentMethod = (paymentMethod) => {
1067
+ if (paymentMethod.type === index$1.PAYMENT_METHOD_TYPES.CARD && checkout_store.checkoutStore.disableCreditCard) {
1068
+ return false;
1069
+ }
1070
+ if (paymentMethod.type === index$1.PAYMENT_METHOD_TYPES.BANK_ACCOUNT && checkout_store.checkoutStore.disableBankAccount) {
1071
+ return false;
1072
+ }
1073
+ return true;
1074
+ };
1075
+ }
1076
+ componentWillLoad() {
1077
+ if (!checkout_store.checkoutStore.paymentMethods.length) {
1078
+ console.warn('No saved payment methods available.');
1079
+ }
1080
+ if (checkout_store.checkoutStore.disablePaymentMethodGroup) {
1081
+ console.warn('Payment method group is disabled.');
1082
+ }
1083
+ }
1084
+ render() {
1085
+ if (checkout_store.checkoutStore.disablePaymentMethodGroup) {
1086
+ return null;
1087
+ }
1088
+ return (index.h(styledHost.StyledHost, null, index.h("div", { class: "saved-payment-methods" }, checkout_store.checkoutStore.paymentMethods.length ? checkout_store.checkoutStore.paymentMethods
1089
+ .filter(this.isAllowedPaymentMethod)
1090
+ .map((paymentMethod) => (index.h("div", { class: "radio-list-item p-3", part: parts.radioListItem, onClick: this.onPaymentMethodOptionClick(paymentMethod) }, index.h("form-control-radio", { name: "paymentMethodType", value: paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.id, checked: checkout_store.checkoutStore.paymentToken === (paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.id), label: `${paymentMethodOptionUtils.CardBrandLabels[paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.brand] || ''} *${paymentMethod === null || paymentMethod === void 0 ? void 0 : paymentMethod.acct_last_four}` })))) : null)));
1091
+ }
1092
+ };
1093
+
1094
+ const sezzleLogo = (index.h("img", { class: "sezzle-smart-button-logo-img", src: "https://media.sezzle.com/branding/2.0/Sezzle_Logo_FullColor.svg", alt: "Sezzle", style: {
1095
+ display: 'inline',
1096
+ width: '80px',
1097
+ marginLeft: '5px',
1098
+ marginTop: '-5px',
1099
+ } }));
1100
+ const SezzlePaymentMethod = class {
1101
+ constructor(hostRef) {
1102
+ index.registerInstance(this, hostRef);
1103
+ this.paymentMethodOptionSelected = index.createEvent(this, "paymentMethodOptionSelected");
1104
+ this.paymentMethodOptionId = index$1.PAYMENT_METHODS.SEZZLE;
1105
+ this.initializeSezzleCheckout = () => {
1106
+ let resolveSezzlePromise;
1107
+ this.sezzlePromise = new Promise((resolve) => { resolveSezzlePromise = resolve; });
1108
+ const amount = Number(checkout_store.checkoutStore.paymentAmount);
1109
+ const Checkout = window.Checkout;
1110
+ const checkout = new Checkout({
1111
+ mode: 'popup',
1112
+ publicKey: checkout_store.checkoutStore.bnplProviderClientId,
1113
+ apiMode: checkout_store.checkoutStore.bnplProviderMode,
1114
+ apiVersion: checkout_store.checkoutStore.bnplProviderApiVersion,
1115
+ });
1116
+ checkout.sezzleButtonElement = this.sezzleButtonRef;
1117
+ checkout.init({
1118
+ onClick: function (event) {
1119
+ event.preventDefault();
1120
+ checkout.startCheckout({
1121
+ checkout_url: checkout_store.checkoutStore.bnplProviderCheckoutUrl,
1122
+ });
1123
+ },
1124
+ onComplete: (event) => resolveSezzlePromise({ bnpl: event.data }),
1125
+ onCancel: (event) => resolveSezzlePromise({ bnpl: event.data }),
1126
+ onFailure: (event) => resolveSezzlePromise({ bnpl: event.data }),
1127
+ });
1128
+ this.sezzleCheckout = checkout;
1129
+ this.installmentPlan = this.sezzleCheckout.getInstallmentPlan(amount);
1130
+ };
1131
+ }
1132
+ componentDidRender() {
1133
+ if (!this.scriptRef)
1134
+ return;
1135
+ this.scriptRef.onload = () => {
1136
+ this.sezzleButtonRef = document.createElement('button');
1137
+ this.initializeSezzleCheckout();
1138
+ };
1139
+ }
1140
+ async resolvePaymentMethod(insuranceValidation) {
1141
+ if (!insuranceValidation.isValid) {
1142
+ return { validationError: true };
1143
+ }
1144
+ this.sezzleButtonRef.click();
1145
+ return this.sezzlePromise;
1146
+ }
1147
+ async handleSelectionClick() {
1148
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.sezzle };
1149
+ this.paymentMethodOptionSelected.emit(this.paymentMethodOptionId);
1150
+ }
1151
+ render() {
1152
+ var _a, _b;
1153
+ if (!checkout_store.checkoutStore.bnplEnabled || checkout_store.checkoutStore.disableBnpl) {
1154
+ console.warn('justifi-sezzle-payment-method: BNPL is not enabled for this account.');
1155
+ return null;
1156
+ }
1157
+ return (index.h(styledHost.StyledHost, { class: "payment-method" }, index.h("script", { src: "https://checkout-sdk.sezzle.com/checkout.min.js", async: true, ref: (el) => (this.scriptRef = el) }), index.h("div", null, index.h("div", null, "Buy now, pay later with ", sezzleLogo), this.installmentPlan && (index.h("small", null, index.h("span", null, (_a = this.installmentPlan) === null || _a === void 0 ? void 0 : _a.installments.length), "\u00A0", index.h("span", null, this.installmentPlan.schedule, " payments of"), "\u00A0", index.h("span", { class: "fw-bold" }, utils.formatCurrency((_b = this.installmentPlan) === null || _b === void 0 ? void 0 : _b.installments[0].amountInCents)))))));
1158
+ }
1159
+ };
1160
+
1161
+ // Constants
1162
+ const PAYMENT_METHOD_TYPE_LABELS = {
1163
+ [Refund.PaymentMethodTypes.bankAccount]: 'New bank account',
1164
+ [Refund.PaymentMethodTypes.card]: 'New credit or debit card',
1165
+ };
1166
+ const ERROR_MESSAGES = {
1167
+ AUTH_TOKEN_REQUIRED: 'Auth token is required when using the tokenize-payment-method component not slotted in justifi-modular-checkout',
1168
+ ACCOUNT_ID_REQUIRED: 'Account ID is required when using the tokenize-payment-method component not slotted in justifi-modular-checkout',
1169
+ FORM_NOT_READY: 'Payment form not ready',
1170
+ VALIDATION_ERROR: 'Validation error',
1171
+ };
1172
+ const TokenizePaymentMethod = class {
1173
+ constructor(hostRef) {
1174
+ index.registerInstance(this, hostRef);
1175
+ this.errorEvent = index.createEvent(this, "error-event");
1176
+ this.submitEvent = index.createEvent(this, "submit-event");
1177
+ this.computedHideSubmitButton = false;
1178
+ this.isLoading = false;
1179
+ this.submitButtonText = 'Submit';
1180
+ }
1181
+ paymentMethodsChanged() {
1182
+ this.setDefaultSelectedPaymentMethod();
1183
+ }
1184
+ connectedCallback() {
1185
+ this.setDefaultSelectedPaymentMethod();
1186
+ this.setComputedHideSubmitButton();
1187
+ }
1188
+ disconnectedCallback() {
1189
+ var _a;
1190
+ (_a = this.analytics) === null || _a === void 0 ? void 0 : _a.cleanup();
1191
+ if (this.unsubscribeFromStore) {
1192
+ this.unsubscribeFromStore();
1193
+ }
1194
+ }
1195
+ componentWillLoad() {
1196
+ checkPkgVersion.checkPkgVersion();
1197
+ this.analytics = new checkPkgVersion.JustifiAnalytics(this);
1198
+ }
1199
+ handleRadioClick(event) {
1200
+ this.selectedPaymentMethod = event.detail;
1201
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: event.detail };
1202
+ }
1203
+ async fillBillingForm(fields) {
1204
+ var _a;
1205
+ (_a = this.billingFormRef) === null || _a === void 0 ? void 0 : _a.fill(fields);
1206
+ }
1207
+ async tokenizePaymentMethod(event) {
1208
+ event === null || event === void 0 ? void 0 : event.preventDefault();
1209
+ this.validateRequiredProps();
1210
+ this.isLoading = true;
1211
+ try {
1212
+ const validation = await this.validate();
1213
+ if (!validation.isValid) {
1214
+ this.errorEvent.emit({
1215
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
1216
+ message: ERROR_MESSAGES.VALIDATION_ERROR,
1217
+ });
1218
+ this.isLoading = false;
1219
+ return;
1220
+ }
1221
+ const tokenizeResponse = await this.resolvePaymentMethod({ isValid: true });
1222
+ if (tokenizeResponse.error) {
1223
+ this.emitError({
1224
+ errorCode: tokenizeResponse.error.code,
1225
+ message: tokenizeResponse.error.message,
1226
+ });
1227
+ }
1228
+ this.submitEvent.emit({ response: tokenizeResponse });
1229
+ return tokenizeResponse;
1230
+ }
1231
+ catch (error) {
1232
+ const errorResponse = this.createErrorResponse(ComponentError.ComponentErrorCodes.TOKENIZE_ERROR, error.message);
1233
+ this.emitError({
1234
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
1235
+ message: error.message,
1236
+ });
1237
+ this.submitEvent.emit({ response: errorResponse });
1238
+ return errorResponse;
1239
+ }
1240
+ finally {
1241
+ this.isLoading = false;
1242
+ }
1243
+ }
1244
+ async validate() {
1245
+ if (!this.areFormsReady()) {
1246
+ return { isValid: false, errors: { general: ERROR_MESSAGES.FORM_NOT_READY } };
1247
+ }
1248
+ const [billingValidation, paymentMethodValidation] = await Promise.all([
1249
+ this.billingFormRef.validate(),
1250
+ this.paymentMethodFormRef.validate(),
1251
+ ]);
1252
+ const result = {
1253
+ isValid: billingValidation.isValid && paymentMethodValidation.isValid,
1254
+ errors: Object.assign(Object.assign({}, billingValidation.errors), paymentMethodValidation.errors),
1255
+ };
1256
+ return result;
1257
+ }
1258
+ async tokenize() {
1259
+ try {
1260
+ const billingFormFieldValues = await this.billingFormRef.getValues();
1261
+ const config = {
1262
+ clientId: this.authToken || checkout_store.checkoutStore.authToken,
1263
+ account: this.accountId || checkout_store.checkoutStore.accountId,
1264
+ paymentMethodMetadata: this.buildPaymentMethodMetadata(billingFormFieldValues),
1265
+ };
1266
+ return await this.paymentMethodFormRef.tokenize(config);
1267
+ }
1268
+ catch (error) {
1269
+ return error;
1270
+ }
1271
+ }
1272
+ // 9. Local methods
1273
+ validateRequiredProps() {
1274
+ if (!this.authToken && !checkout_store.checkoutStore.authToken) {
1275
+ this.emitError({
1276
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
1277
+ message: ERROR_MESSAGES.AUTH_TOKEN_REQUIRED,
1278
+ });
1279
+ }
1280
+ if (!this.accountId && !checkout_store.checkoutStore.accountId) {
1281
+ this.emitError({
1282
+ errorCode: ComponentError.ComponentErrorCodes.TOKENIZE_ERROR,
1283
+ message: ERROR_MESSAGES.ACCOUNT_ID_REQUIRED,
1284
+ });
1285
+ }
1286
+ }
1287
+ setDefaultSelectedPaymentMethod() {
1288
+ if (this.selectedPaymentMethod) {
1289
+ return;
1290
+ }
1291
+ if (!this.disableCreditCard) {
1292
+ this.selectedPaymentMethod = Refund.PaymentMethodTypes.card;
1293
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.card };
1294
+ }
1295
+ else if (!this.disableBankAccount) {
1296
+ this.selectedPaymentMethod = Refund.PaymentMethodTypes.bankAccount;
1297
+ checkout_store.checkoutStore.selectedPaymentMethod = { type: Refund.PaymentMethodTypes.bankAccount };
1298
+ }
1299
+ }
1300
+ setComputedHideSubmitButton() {
1301
+ // If hideSubmitButton prop is explicitly set, use that value
1302
+ if (this.hideSubmitButton !== undefined) {
1303
+ this.computedHideSubmitButton = this.hideSubmitButton;
1304
+ return;
1305
+ }
1306
+ // Otherwise, auto-detect if component is slotted within modular-checkout
1307
+ const isWithinModularCheckout = this.isSlottedWithinModularCheckout();
1308
+ this.computedHideSubmitButton = isWithinModularCheckout;
1309
+ }
1310
+ isSlottedWithinModularCheckout() {
1311
+ var _a;
1312
+ let parent = (_a = this.host) === null || _a === void 0 ? void 0 : _a.parentElement;
1313
+ while (parent) {
1314
+ if (parent.tagName === 'JUSTIFI-MODULAR-CHECKOUT') {
1315
+ return true;
1316
+ }
1317
+ parent = parent.parentElement;
1318
+ }
1319
+ return false;
1320
+ }
1321
+ get availablePaymentMethods() {
1322
+ const methods = [];
1323
+ if (!this.disableCreditCard) {
1324
+ methods.push(Refund.PaymentMethodTypes.card);
1325
+ }
1326
+ if (!this.disableBankAccount) {
1327
+ methods.push(Refund.PaymentMethodTypes.bankAccount);
1328
+ }
1329
+ return methods;
1330
+ }
1331
+ areFormsReady() {
1332
+ return !!(this.billingFormRef && this.paymentMethodFormRef);
1333
+ }
1334
+ emitError(errorData) {
1335
+ this.errorEvent.emit(Object.assign(Object.assign({}, errorData), { severity: ComponentError.ComponentErrorSeverity.ERROR }));
1336
+ }
1337
+ createErrorResponse(code, message) {
1338
+ return {
1339
+ error: {
1340
+ code: code,
1341
+ message,
1342
+ decline_code: undefined,
1343
+ },
1344
+ };
1345
+ }
1346
+ async resolvePaymentMethod(insuranceValidation) {
1347
+ if (!this.areFormsReady()) {
1348
+ return this.createErrorResponse('form_not_ready', ERROR_MESSAGES.FORM_NOT_READY);
1349
+ }
1350
+ try {
1351
+ const validation = await this.validate();
1352
+ if (!validation.isValid || !insuranceValidation.isValid) {
1353
+ const errorMessage = Object.values(validation.errors)[0] || ERROR_MESSAGES.VALIDATION_ERROR;
1354
+ return {
1355
+ validationError: true,
1356
+ error: {
1357
+ code: 'validation_error',
1358
+ message: String(errorMessage),
1359
+ decline_code: undefined,
1360
+ },
1361
+ };
1362
+ }
1363
+ const result = await this.performTokenization();
1364
+ return result;
1365
+ }
1366
+ catch (error) {
1367
+ return { error };
1368
+ }
1369
+ }
1370
+ async performTokenization() {
1371
+ var _a, _b;
1372
+ const tokenizeResponse = await this.tokenize();
1373
+ if (tokenizeResponse.error) {
1374
+ return { error: tokenizeResponse.error };
1375
+ }
1376
+ const tokenizeResponseData = tokenizeResponse.data;
1377
+ return {
1378
+ token: ((_a = tokenizeResponseData.card) === null || _a === void 0 ? void 0 : _a.token) || ((_b = tokenizeResponseData.bank_account) === null || _b === void 0 ? void 0 : _b.token),
1379
+ data: tokenizeResponseData,
1380
+ };
1381
+ }
1382
+ buildPaymentMethodMetadata(billingFormFieldValues) {
1383
+ return this.shouldSavePaymentMethod
1384
+ ? Object.assign(Object.assign({}, billingFormFieldValues), { payment_method_group_id: this.paymentMethodGroupID }) : Object.assign({}, billingFormFieldValues);
1385
+ }
1386
+ get paymentMethodGroupID() {
1387
+ return this.paymentMethodGroupId || checkout_store.checkoutStore.paymentMethodGroupId;
1388
+ }
1389
+ get shouldSavePaymentMethod() {
1390
+ return !!(this.paymentMethodGroupId || checkout_store.checkoutStore.savePaymentMethod);
1391
+ }
1392
+ get shouldHideRadioInput() {
1393
+ return this.disableCreditCard || this.disableBankAccount;
1394
+ }
1395
+ renderPaymentMethodOption(paymentMethodType) {
1396
+ const isSelected = this.selectedPaymentMethod === paymentMethodType && checkout_store.checkoutStore.selectedPaymentMethod.id === undefined;
1397
+ return (index.h("div", { class: "payment-method" }, index.h("justifi-radio-list-item", { name: "paymentMethodType", value: paymentMethodType, checked: isSelected, label: PAYMENT_METHOD_TYPE_LABELS[paymentMethodType], hidden: this.shouldHideRadioInput }), isSelected && this.renderSelectedPaymentMethodForm(paymentMethodType)));
1398
+ }
1399
+ renderSelectedPaymentMethodForm(paymentMethodId) {
1400
+ return (index.h("div", { class: "mt-4 pb-4" }, this.renderPaymentMethodForm(paymentMethodId), index.h("div", { class: "mt-4" }, index.h("justifi-billing-form", { ref: (el) => (this.billingFormRef = el), hideCardBillingForm: this.hideCardBillingForm, hideBankAccountBillingForm: this.hideBankAccountBillingForm, paymentMethodType: paymentMethodId })), index.h("div", { class: "mt-4" }, index.h("justifi-save-new-payment-method", { hidden: !this.paymentMethodGroupID }))));
1401
+ }
1402
+ renderPaymentMethodForm(paymentMethodId) {
1403
+ return paymentMethodId === Refund.PaymentMethodTypes.card ? (index.h("justifi-card-form", { ref: (el) => (this.paymentMethodFormRef = el) })) : (index.h("justifi-bank-account-form", { ref: (el) => (this.paymentMethodFormRef = el) }));
1404
+ }
1405
+ render() {
1406
+ return (index.h(styledHost.StyledHost, { key: 'a89908d2f192d86edf016b052734f81f46e00f8b' }, index.h("form", { key: '527d1e5ff94a2db8b2d1223d7beda86fdaf08ff0' }, index.h("fieldset", { key: 'd8479461d3788dbcb319f1eaf99b7e05c00c49f9' }, index.h("div", { key: '17f68ee0dceb8353ca54ccf383dc2709444a3b26', class: "row gy-3" }, index.h("div", { key: '3568f3ac4ef04a9a245d61f2b94f3b79371b0a6f', class: "col-12" }, this.availablePaymentMethods.map((method) => this.renderPaymentMethodOption(method))), index.h("div", { key: '97be6dbaf8373a82a706a7eb97e9107baa6c1823', class: "col-12" }, index.h("justifi-button", { key: 'afcd192881ad092f8d31a01e571541079d4d33ac', text: this.submitButtonText, variant: "primary", type: "submit", clickHandler: (e) => this.tokenizePaymentMethod(e), isLoading: this.isLoading, "data-testid": "submit-button", hidden: this.computedHideSubmitButton })))))));
1407
+ }
1408
+ get host() { return index.getElement(this); }
1409
+ static get watchers() { return {
1410
+ "disableCreditCard": ["paymentMethodsChanged"],
1411
+ "disableBankAccount": ["paymentMethodsChanged"]
1412
+ }; }
1413
+ };
1414
+
1415
+ exports.justifi_checkout_summary = Summary;
1416
+ exports.justifi_header = Header;
1417
+ exports.justifi_modular_checkout = ModularCheckout;
1418
+ exports.justifi_plaid_payment_method = PlaidPaymentMethod;
1419
+ exports.justifi_saved_payment_methods = SavedPaymentMethods;
1420
+ exports.justifi_sezzle_payment_method = SezzlePaymentMethod;
1421
+ exports.justifi_tokenize_payment_method = TokenizePaymentMethod;