@internetarchive/donation-form 1.0.3-alpha-webdev7960.1 → 1.0.3-webdev-8122.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +115 -115
  3. package/dist/demo/braintree-endpoint-manager.js.map +1 -1
  4. package/dist/demo/demo-analytics-handler.js.map +1 -1
  5. package/dist/demo/submit-form-with.js.map +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/braintree-manager/braintree-interfaces.js.map +1 -1
  8. package/dist/src/braintree-manager/braintree-manager.js.map +1 -1
  9. package/dist/src/braintree-manager/payment-clients.js.map +1 -1
  10. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.js.map +1 -1
  11. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.js.map +1 -1
  12. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.js.map +1 -1
  13. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.js.map +1 -1
  14. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.js.map +1 -1
  15. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay.js.map +1 -1
  16. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card-interface.js.map +1 -1
  17. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card.js.map +1 -1
  18. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.js.map +1 -1
  19. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-container.js.map +1 -1
  20. package/dist/src/braintree-manager/payment-providers/google-pay-interface.js.map +1 -1
  21. package/dist/src/braintree-manager/payment-providers/google-pay.js.map +1 -1
  22. package/dist/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.js.map +1 -1
  23. package/dist/src/braintree-manager/payment-providers/paypal/paypal-interface.js.map +1 -1
  24. package/dist/src/braintree-manager/payment-providers/paypal/paypal.js.map +1 -1
  25. package/dist/src/braintree-manager/payment-providers/venmo-interface.js.map +1 -1
  26. package/dist/src/braintree-manager/payment-providers/venmo.js.map +1 -1
  27. package/dist/src/braintree-manager/payment-providers-interface.js.map +1 -1
  28. package/dist/src/braintree-manager/payment-providers.js.map +1 -1
  29. package/dist/src/donation-form-controller.js +123 -123
  30. package/dist/src/donation-form-controller.js.map +1 -1
  31. package/dist/src/donation-form-error.js.map +1 -1
  32. package/dist/src/donation-form.js +107 -107
  33. package/dist/src/donation-form.js.map +1 -1
  34. package/dist/src/form-elements/badged-input.js +47 -47
  35. package/dist/src/form-elements/badged-input.js.map +1 -1
  36. package/dist/src/form-elements/contact-form/autocomplete-field-options.js.map +1 -1
  37. package/dist/src/form-elements/contact-form/contact-form.js +159 -157
  38. package/dist/src/form-elements/contact-form/contact-form.js.map +1 -1
  39. package/dist/src/form-elements/contact-form/countries.js.map +1 -1
  40. package/dist/src/form-elements/header/donation-form-header.js +14 -14
  41. package/dist/src/form-elements/header/donation-form-header.js.map +1 -1
  42. package/dist/src/form-elements/header/donation-summary.js +15 -15
  43. package/dist/src/form-elements/header/donation-summary.js.map +1 -1
  44. package/dist/src/form-elements/payment-selector.js +164 -164
  45. package/dist/src/form-elements/payment-selector.js.map +1 -1
  46. package/dist/src/form-elements/total-amount.js +16 -16
  47. package/dist/src/form-elements/total-amount.js.map +1 -1
  48. package/dist/src/modals/confirm-donation-modal-content.js +51 -51
  49. package/dist/src/modals/confirm-donation-modal-content.js.map +1 -1
  50. package/dist/src/modals/error-modal-content.js +22 -22
  51. package/dist/src/modals/error-modal-content.js.map +1 -1
  52. package/dist/src/modals/upsell-modal-content.js +182 -182
  53. package/dist/src/modals/upsell-modal-content.js.map +1 -1
  54. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js +20 -20
  55. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js.map +1 -1
  56. package/dist/src/payment-flow-handlers/handlers/applepay-flow-handler.js.map +1 -1
  57. package/dist/src/payment-flow-handlers/handlers/creditcard-flow-handler.js.map +1 -1
  58. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.js +2 -0
  59. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.js.map +1 -1
  60. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.js +2 -0
  61. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.js.map +1 -1
  62. package/dist/src/payment-flow-handlers/handlers/venmo-flow-handler.js.map +1 -1
  63. package/dist/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.js.map +1 -1
  64. package/dist/src/payment-flow-handlers/payment-flow-handlers.js.map +1 -1
  65. package/dist/src/recaptcha-manager/recaptcha-manager.js.map +1 -1
  66. package/dist/src/util/promisedSleep.js.map +1 -1
  67. package/dist/test/helpers/fillInContactForm.js.map +1 -1
  68. package/dist/test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.js.map +1 -1
  69. package/dist/test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.js.map +1 -1
  70. package/dist/test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.js.map +1 -1
  71. package/dist/test/mocks/flow-handlers/individual-handlers/mock-paypal-flow-handler.js.map +1 -1
  72. package/dist/test/mocks/flow-handlers/individual-handlers/mock-venmo-flow-handler.js.map +1 -1
  73. package/dist/test/mocks/flow-handlers/mock-payment-flow-handlers.js.map +1 -1
  74. package/dist/test/mocks/mock-braintree-manager.js.map +1 -1
  75. package/dist/test/mocks/mock-donation-info.js.map +1 -1
  76. package/dist/test/mocks/mock-endpoint-manager.js.map +1 -1
  77. package/dist/test/mocks/mock-hosted-fields-config.js.map +1 -1
  78. package/dist/test/mocks/mock-hosted-fields-container.js.map +1 -1
  79. package/dist/test/mocks/mock-lazy-loader.js.map +1 -1
  80. package/dist/test/mocks/mock-modal-manager.js.map +1 -1
  81. package/dist/test/mocks/mock-payment-clients.js.map +1 -1
  82. package/dist/test/mocks/mock-paypal-button-renderer.js.map +1 -1
  83. package/dist/test/mocks/mock-recaptcha-manager.js.map +1 -1
  84. package/dist/test/mocks/models/mock-billing-info.js +2 -0
  85. package/dist/test/mocks/models/mock-billing-info.js.map +1 -1
  86. package/dist/test/mocks/models/mock-custom-fields.js.map +1 -1
  87. package/dist/test/mocks/models/mock-customer-info.js.map +1 -1
  88. package/dist/test/mocks/models/mock-donation-request.js.map +1 -1
  89. package/dist/test/mocks/models/mock-success-response.js.map +1 -1
  90. package/dist/test/mocks/payment-clients/mock-applepay-client.js.map +1 -1
  91. package/dist/test/mocks/payment-clients/mock-applepay-payment.js.map +1 -1
  92. package/dist/test/mocks/payment-clients/mock-applepay-paymentauthorizedevent.js.map +1 -1
  93. package/dist/test/mocks/payment-clients/mock-applepay-session.js.map +1 -1
  94. package/dist/test/mocks/payment-clients/mock-applepay-sessionmanager.js.map +1 -1
  95. package/dist/test/mocks/payment-clients/mock-applepay-validatemerchantevent.js.map +1 -1
  96. package/dist/test/mocks/payment-clients/mock-braintree-client.js.map +1 -1
  97. package/dist/test/mocks/payment-clients/mock-data-collector.js.map +1 -1
  98. package/dist/test/mocks/payment-clients/mock-googlepay-client.js.map +1 -1
  99. package/dist/test/mocks/payment-clients/mock-googlepay-library.js.map +1 -1
  100. package/dist/test/mocks/payment-clients/mock-grecaptcha.js.map +1 -1
  101. package/dist/test/mocks/payment-clients/mock-hostedfields-client.js.map +1 -1
  102. package/dist/test/mocks/payment-clients/mock-hostedfieldstateobject-generator.js.map +1 -1
  103. package/dist/test/mocks/payment-clients/mock-hostedfieldtokenizepayload.js.map +1 -1
  104. package/dist/test/mocks/payment-clients/mock-paypal-client.js.map +1 -1
  105. package/dist/test/mocks/payment-clients/mock-paypal-library.js.map +1 -1
  106. package/dist/test/mocks/payment-clients/mock-venmo-client.js.map +1 -1
  107. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-datasource-delegate.js.map +1 -1
  108. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-handler.js.map +1 -1
  109. package/dist/test/mocks/payment-providers/individual-providers/mock-creditcard-handler.js.map +1 -1
  110. package/dist/test/mocks/payment-providers/individual-providers/mock-googlepay-handler.js.map +1 -1
  111. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource-delegate.js.map +1 -1
  112. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource.js.map +1 -1
  113. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-handler.js.map +1 -1
  114. package/dist/test/mocks/payment-providers/individual-providers/mock-venmo-handler.js.map +1 -1
  115. package/dist/test/mocks/payment-providers/mock-payment-providers.js.map +1 -1
  116. package/dist/test/tests/braintree-manager.test.js.map +1 -1
  117. package/dist/test/tests/donation-form-controller.test.js +39 -39
  118. package/dist/test/tests/donation-form-controller.test.js.map +1 -1
  119. package/dist/test/tests/donation-form.test.js +4 -4
  120. package/dist/test/tests/donation-form.test.js.map +1 -1
  121. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js +16 -14
  122. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js.map +1 -1
  123. package/dist/test/tests/form-elements/donation-summary.test.js.map +1 -1
  124. package/dist/test/tests/form-elements/payment-selector.test.js.map +1 -1
  125. package/dist/test/tests/modals/error-modal-content.test.js +2 -2
  126. package/dist/test/tests/modals/error-modal-content.test.js.map +1 -1
  127. package/dist/test/tests/modals/upsell-modal-content.test.js +31 -31
  128. package/dist/test/tests/modals/upsell-modal-content.test.js.map +1 -1
  129. package/dist/test/tests/models/donation-payment-info.test.js.map +1 -1
  130. package/dist/test/tests/payment-clients.test.js.map +1 -1
  131. package/dist/test/tests/payment-providers/applepay-sessiondatasource.test.js.map +1 -1
  132. package/dist/test/tests/payment-providers/applepay-sessionmanager.test.js.map +1 -1
  133. package/dist/test/tests/payment-providers/applepay.test.js.map +1 -1
  134. package/dist/test/tests/payment-providers/creditcard.test.js.map +1 -1
  135. package/dist/test/tests/payment-providers/googlepay.test.js.map +1 -1
  136. package/dist/test/tests/payment-providers/payment-providers.test.js.map +1 -1
  137. package/dist/test/tests/payment-providers/paypal-button-datasource.test.js.map +1 -1
  138. package/dist/test/tests/payment-providers/paypal.test.js.map +1 -1
  139. package/dist/test/tests/payment-providers/venmo.test.js.map +1 -1
  140. package/dist/test/tests/recaptcha-manager.test.js.map +1 -1
  141. package/package.json +107 -107
  142. package/src/@types/analytics-handler/index.d.ts +8 -8
  143. package/src/@types/braintree-web/LICENSE +21 -21
  144. package/src/@types/braintree-web/index.d.ts +93 -93
  145. package/src/@types/braintree-web/modules/american-express.d.ts +50 -50
  146. package/src/@types/braintree-web/modules/apple-pay.d.ts +213 -213
  147. package/src/@types/braintree-web/modules/client.d.ts +103 -103
  148. package/src/@types/braintree-web/modules/core.d.ts +34 -34
  149. package/src/@types/braintree-web/modules/data-collector.d.ts +13 -13
  150. package/src/@types/braintree-web/modules/google-payment.d.ts +269 -269
  151. package/src/@types/braintree-web/modules/hosted-fields.d.ts +366 -366
  152. package/src/@types/braintree-web/modules/paypal-checkout.d.ts +262 -262
  153. package/src/@types/braintree-web/modules/paypal.d.ts +177 -177
  154. package/src/@types/braintree-web/modules/three-d-secure.d.ts +141 -141
  155. package/src/@types/braintree-web/modules/unionpay.d.ts +224 -224
  156. package/src/@types/braintree-web/modules/us-bank-account.d.ts +81 -81
  157. package/src/@types/braintree-web/modules/venmo.d.ts +110 -110
  158. package/src/@types/braintree-web/package.json +64 -64
  159. package/src/@types/paypal-checkout-components/LICENSE +21 -21
  160. package/src/@types/paypal-checkout-components/index.d.ts +67 -67
  161. package/src/@types/paypal-checkout-components/modules/button.d.ts +50 -50
  162. package/src/@types/paypal-checkout-components/modules/callback-data.d.ts +244 -244
  163. package/src/@types/paypal-checkout-components/modules/configuration.d.ts +114 -114
  164. package/src/@types/paypal-checkout-components/package.json +58 -58
  165. package/src/braintree-manager/braintree-interfaces.ts +172 -172
  166. package/src/braintree-manager/braintree-manager.ts +281 -281
  167. package/src/braintree-manager/payment-clients.ts +146 -146
  168. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.ts +13 -13
  169. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.ts +8 -8
  170. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.ts +10 -10
  171. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.ts +119 -119
  172. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.ts +21 -21
  173. package/src/braintree-manager/payment-providers/apple-pay/apple-pay.ts +97 -97
  174. package/src/braintree-manager/payment-providers/credit-card/credit-card-interface.ts +21 -21
  175. package/src/braintree-manager/payment-providers/credit-card/credit-card.ts +130 -130
  176. package/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.ts +19 -19
  177. package/src/braintree-manager/payment-providers/credit-card/hosted-field-container.ts +85 -85
  178. package/src/braintree-manager/payment-providers/google-pay-interface.ts +8 -8
  179. package/src/braintree-manager/payment-providers/google-pay.ts +59 -59
  180. package/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.ts +218 -218
  181. package/src/braintree-manager/payment-providers/paypal/paypal-interface.ts +13 -13
  182. package/src/braintree-manager/payment-providers/paypal/paypal.ts +78 -78
  183. package/src/braintree-manager/payment-providers/venmo-interface.ts +8 -8
  184. package/src/braintree-manager/payment-providers/venmo.ts +67 -67
  185. package/src/braintree-manager/payment-providers-interface.ts +25 -25
  186. package/src/braintree-manager/payment-providers.ts +147 -147
  187. package/src/donation-form-controller.ts +623 -623
  188. package/src/donation-form-error.ts +6 -6
  189. package/src/donation-form.ts +576 -576
  190. package/src/form-elements/badged-input.ts +109 -109
  191. package/src/form-elements/contact-form/autocomplete-field-options.ts +63 -63
  192. package/src/form-elements/contact-form/contact-form.ts +436 -434
  193. package/src/form-elements/contact-form/countries.ts +252 -252
  194. package/src/form-elements/header/donation-form-header.ts +98 -98
  195. package/src/form-elements/header/donation-summary.ts +61 -61
  196. package/src/form-elements/payment-selector.ts +365 -365
  197. package/src/form-elements/total-amount.ts +46 -46
  198. package/src/modals/confirm-donation-modal-content.ts +168 -168
  199. package/src/modals/error-modal-content.ts +48 -48
  200. package/src/modals/upsell-modal-content.ts +284 -284
  201. package/src/payment-flow-handlers/donation-flow-modal-manager.ts +439 -439
  202. package/src/payment-flow-handlers/handlers/applepay-flow-handler.ts +109 -109
  203. package/src/payment-flow-handlers/handlers/creditcard-flow-handler.ts +232 -232
  204. package/src/payment-flow-handlers/handlers/googlepay-flow-handler.ts +113 -111
  205. package/src/payment-flow-handlers/handlers/paypal-flow-handler.ts +333 -331
  206. package/src/payment-flow-handlers/handlers/venmo-flow-handler.ts +119 -119
  207. package/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.ts +127 -127
  208. package/src/payment-flow-handlers/payment-flow-handlers.ts +218 -218
  209. package/src/recaptcha-manager/recaptcha-manager.ts +123 -123
  210. package/src/util/promisedSleep.ts +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"donation-flow-modal-manager.js","sourceRoot":"","sources":["../../../src/payment-flow-handlers/donation-flow-modal-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { html } from 'lit';\r\nimport { ModalConfig, ModalManagerInterface } from '@internetarchive/modal-manager';\r\nimport { UpsellModalCTAMode } from '../modals/upsell-modal-content';\r\nimport '../modals/confirm-donation-modal-content';\r\nimport { BraintreeManagerInterface } from '../braintree-manager/braintree-interfaces';\r\nimport {\r\n SuccessResponse,\r\n ErrorResponse,\r\n DonationPaymentInfo,\r\n DonationType,\r\n PaymentProvider,\r\n BillingInfo,\r\n CustomerInfo,\r\n DonationResponse,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport '../modals/error-modal-content';\r\nimport { DonationControllerEventLoggerInterface } from '../@types/analytics-handler';\r\n\r\nenum ModalHeaderColor {\r\n Blue = '#497fbf',\r\n Green = '#55A183',\r\n Red = '#691916',\r\n}\r\n\r\n/**\r\n * The DonationFlowModalManager is responsible for most of the high-level modal flows.\r\n *\r\n * Each of the payment providers has slightly different interactions, ie the PayPal button,\r\n * ApplePay popup, Venmo launching the app, etc. The modal flow is the same for all of them\r\n * so this class gets called by the individual payment flow handlers to take the user\r\n * through the modal flow.\r\n *\r\n * @export\r\n * @interface DonationFlowModalManagerInterface\r\n */\r\nexport interface DonationFlowModalManagerInterface {\r\n showConfirmationStepModal(options: {\r\n amount: number;\r\n donationType: DonationType;\r\n currencyType: string;\r\n confirmDonationCB: Function;\r\n cancelDonationCB: Function;\r\n }): Promise<void>;\r\n /**\r\n * Close the modal\r\n *\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n closeModal(): void;\r\n\r\n /**\r\n * Show the processing modal\r\n *\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n showProcessingModal(): void;\r\n\r\n /**\r\n * Show the Thank You modal\r\n *\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n showThankYouModal(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void;\r\n\r\n /**\r\n * Show the Error modal\r\n *\r\n * @param {{\r\n * userClosedModalCallback?: () => void;\r\n * }} [options]\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n showErrorModal(options: { message: string; userClosedModalCallback?: () => void }): void;\r\n\r\n /**\r\n * Show the upsell modal\r\n *\r\n * @param {{\r\n * ctaMode?: UpsellModalCTAMode;\r\n * yesSelected?: (amount: number) => void;\r\n * noSelected?: () => void;\r\n * amountChanged?: (amount: number) => void;\r\n * userClosedModalCallback?: () => void;\r\n * }} [options]\r\n * @returns {Promise<void>}\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n showUpsellModal(options: {\r\n oneTimeAmount: number;\r\n ctaMode?: UpsellModalCTAMode;\r\n yesSelected?: (amount: number) => void;\r\n noSelected?: () => void;\r\n amountChanged?: (amount: number) => void;\r\n userClosedModalCallback?: () => void;\r\n }): Promise<void>;\r\n\r\n /**\r\n * Start the donation submission flow. This kicks off the \"main\" modal flow once the\r\n * user authorizes the donation through their payment provider, which provides\r\n * us the with the nonce used to complete the donation.\r\n *\r\n * @param {{\r\n * nonce: string;\r\n * paymentProvider: PaymentProvider;\r\n * donationInfo: DonationPaymentInfo;\r\n * billingInfo: BillingInfo;\r\n * customerInfo: CustomerInfo;\r\n * upsellOnetimeTransactionId?: string;\r\n * customerId?: string;\r\n * recaptchaToken?: string;\r\n * bin?: string; // first 6 digits of CC\r\n * binName?: string; // credit card bank name\r\n * }} options\r\n * @returns {(Promise<DonationResponse | undefined>)}\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n startDonationSubmissionFlow(options: {\r\n nonce: string;\r\n paymentProvider: PaymentProvider;\r\n donationInfo: DonationPaymentInfo;\r\n billingInfo: BillingInfo;\r\n customerInfo: CustomerInfo;\r\n upsellOnetimeTransactionId?: string;\r\n customerId?: string;\r\n recaptchaToken?: string;\r\n bin?: string; // first 6 digits of CC\r\n binName?: string; // credit card bank name\r\n }): Promise<DonationResponse | undefined>;\r\n\r\n /**\r\n * Handle a successful donation response. This encapsulates the logic for the type of\r\n * donation that was made.\r\n * ie. If it was a one-time donation, show the upsell, if it was monthly do not.\r\n *\r\n * @param {DonationPaymentInfo} donationInfo\r\n * @param {SuccessResponse} response\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n handleSuccessfulDonationResponse(\r\n donationInfo: DonationPaymentInfo,\r\n response: SuccessResponse,\r\n ): void;\r\n}\r\n\r\nexport class DonationFlowModalManager implements DonationFlowModalManagerInterface {\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private modalManager: ModalManagerInterface;\r\n\r\n private analytics: DonationControllerEventLoggerInterface;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n modalManager: ModalManagerInterface;\r\n analytics: DonationControllerEventLoggerInterface;\r\n }) {\r\n this.modalManager = options.modalManager;\r\n this.braintreeManager = options.braintreeManager;\r\n this.analytics = options.analytics;\r\n }\r\n\r\n /** @inheritdoc */\r\n closeModal(): void {\r\n this.modalManager.closeModal();\r\n }\r\n\r\n /** @inheritdoc */\r\n showProcessingModal(): void {\r\n const modalConfig = new ModalConfig({\r\n headerColor: ModalHeaderColor.Blue,\r\n showProcessingIndicator: true,\r\n closeOnBackdropClick: false,\r\n showCloseButton: false,\r\n processingImageMode: 'processing',\r\n title: html` Processing... `,\r\n });\r\n this.modalManager.showModal({ config: modalConfig });\r\n }\r\n\r\n /** @inheritdoc */\r\n showThankYouModal(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void {\r\n const modalConfig = new ModalConfig({\r\n showProcessingIndicator: true,\r\n processingImageMode: 'complete',\r\n headerColor: ModalHeaderColor.Green,\r\n title: html` Thank You! `,\r\n });\r\n this.modalManager.showModal({\r\n config: modalConfig,\r\n });\r\n\r\n // post analytic\r\n const selectedPayment = options.successResponse.paymentProvider.replace(/\\s+/g, '');\r\n let action = `Donated-${selectedPayment}`;\r\n if (options.upsellSuccessResponse) {\r\n action += `-upsell`;\r\n }\r\n const label = options.successResponse.donationType;\r\n this.analytics.logDonationFlowEvent(action, label);\r\n\r\n // post donation\r\n this.braintreeManager.donationSuccessful(options);\r\n }\r\n\r\n /** @inheritdoc */\r\n showErrorModal(options: { message: string; userClosedModalCallback?: () => void }): void {\r\n const modalConfig = new ModalConfig({\r\n headerColor: ModalHeaderColor.Red,\r\n title: html` Processing error `,\r\n headline: html` There's been a problem completing your donation. `,\r\n message: html` ${options?.message} `,\r\n });\r\n\r\n this.modalManager.showModal({\r\n config: modalConfig,\r\n userClosedModalCallback: options?.userClosedModalCallback,\r\n customModalContent: html`\r\n <donation-form-error-modal-content></donation-form-error-modal-content>\r\n `,\r\n });\r\n }\r\n\r\n showConfirmationStepModal(options: {\r\n amount: number;\r\n donationType: DonationType;\r\n currencyType: string;\r\n confirmDonationCB: Function;\r\n cancelDonationCB: Function;\r\n }): Promise<void> {\r\n const confirmDonation = (): void => {\r\n options?.confirmDonationCB();\r\n };\r\n const cancelDonation = (): void => {\r\n options?.cancelDonationCB();\r\n };\r\n const modalTitle =\r\n options.donationType === DonationType.Upsell\r\n ? 'Confirm monthly donation'\r\n : 'Complete donation';\r\n\r\n const modalConfig = new ModalConfig({\r\n closeOnBackdropClick: false,\r\n headerColor: ModalHeaderColor.Green,\r\n title: html`${modalTitle}`,\r\n message: html`\r\n <confirm-donation-modal\r\n .amount=\"${options.amount}\"\r\n .currencyType=\"${options.currencyType}\"\r\n .donationType=\"${options.donationType}\"\r\n .confirmDonation=${confirmDonation}\r\n .cancelDonation=${cancelDonation}\r\n ></confirm-donation-modal>\r\n `,\r\n });\r\n return this.modalManager.showModal({\r\n config: modalConfig,\r\n userClosedModalCallback: cancelDonation,\r\n });\r\n }\r\n\r\n /** @inheritdoc */\r\n showUpsellModal(options: {\r\n oneTimeAmount: number;\r\n yesSelected?: (amount: number) => void;\r\n noSelected?: () => void;\r\n amountChanged?: (amount: number) => void;\r\n userClosedModalCallback?: () => void;\r\n ctaMode?: UpsellModalCTAMode;\r\n }): Promise<void> {\r\n const modalConfig = new ModalConfig({\r\n headerColor: ModalHeaderColor.Green,\r\n title: html` Donation received `,\r\n processingImageMode: 'complete',\r\n showProcessingIndicator: true,\r\n });\r\n\r\n const upsellAmount = DonationFlowModalManager.getDefaultUpsellAmount(options.oneTimeAmount);\r\n if (options.amountChanged) {\r\n options.amountChanged(upsellAmount);\r\n }\r\n\r\n const modalContent = html`\r\n <upsell-modal-content\r\n .amount=${upsellAmount}\r\n .yesButtonMode=${options?.ctaMode ?? UpsellModalCTAMode.YesButton}\r\n @yesSelected=${(e: CustomEvent): void =>\r\n options?.yesSelected ? options.yesSelected(e.detail.amount) : undefined}\r\n @noThanksSelected=${options?.noSelected}\r\n @amountChanged=${(e: CustomEvent): void =>\r\n options?.amountChanged ? options.amountChanged(e.detail.amount) : undefined}\r\n >\r\n <slot name=\"paypal-upsell-button\"></slot>\r\n </upsell-modal-content>\r\n `;\r\n return this.modalManager.showModal({\r\n config: modalConfig,\r\n customModalContent: modalContent,\r\n userClosedModalCallback: options?.userClosedModalCallback,\r\n });\r\n }\r\n\r\n /** @inheritdoc */\r\n async startDonationSubmissionFlow(options: {\r\n nonce: string;\r\n paymentProvider: PaymentProvider;\r\n donationInfo: DonationPaymentInfo;\r\n billingInfo: BillingInfo;\r\n customerInfo: CustomerInfo;\r\n upsellOnetimeTransactionId?: string;\r\n customerId?: string;\r\n recaptchaToken?: string;\r\n bin?: string; // first 6 digits of CC\r\n binName?: string; // credit card bank name\r\n }): Promise<DonationResponse | undefined> {\r\n this.showProcessingModal();\r\n\r\n try {\r\n const response = await this.braintreeManager.submitDonation(options);\r\n\r\n if (response.success) {\r\n this.handleSuccessfulDonationResponse(\r\n options.donationInfo,\r\n response.value as SuccessResponse,\r\n );\r\n return response;\r\n } else {\r\n const error = response.value as ErrorResponse;\r\n this.showErrorModal({\r\n message: error.message,\r\n });\r\n return response;\r\n }\r\n } catch (error) {\r\n this.showErrorModal({\r\n message: `${error}`,\r\n });\r\n console.error('error getting a response', error);\r\n return undefined;\r\n }\r\n }\r\n\r\n private async upsellModalYesSelected(\r\n oneTimeDonationResponse: SuccessResponse,\r\n amount: number,\r\n ): Promise<DonationResponse | undefined> {\r\n this.showProcessingModal();\r\n\r\n try {\r\n const response = await this.braintreeManager.submitUpsellDonation({\r\n oneTimeDonationResponse: oneTimeDonationResponse,\r\n amount: amount,\r\n });\r\n\r\n if (response.success) {\r\n this.completeUpsell({\r\n successResponse: oneTimeDonationResponse,\r\n upsellSuccessResponse: response.value as SuccessResponse,\r\n });\r\n } else {\r\n const error = response.value as ErrorResponse;\r\n this.showErrorModal({\r\n message: error.message,\r\n });\r\n }\r\n\r\n return response;\r\n } catch (error) {\r\n this.showErrorModal({\r\n message: `${error}`,\r\n });\r\n console.error('error getting a response', error);\r\n return undefined;\r\n }\r\n }\r\n\r\n private completeUpsell(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void {\r\n this.showThankYouModal(options);\r\n\r\n // post analytic\r\n const selectedPayment = options.successResponse.paymentProvider.replace(/\\s+/g, '');\r\n const action = `Donated-${selectedPayment}-upsell`;\r\n const label = options.successResponse.donationType;\r\n this.analytics.logDonationFlowEvent(action, label);\r\n\r\n this.braintreeManager.donationSuccessful(options);\r\n }\r\n\r\n static getDefaultUpsellAmount(oneTimeAmount: number): number {\r\n let amount = 5;\r\n\r\n if (oneTimeAmount <= 10) amount = 8;\r\n else if (oneTimeAmount > 10 && oneTimeAmount <= 25) amount = 10;\r\n else if (oneTimeAmount > 25 && oneTimeAmount <= 100) amount = 25;\r\n else if (oneTimeAmount > 100) amount = 50;\r\n\r\n return amount;\r\n }\r\n\r\n /** @inheritdoc */\r\n handleSuccessfulDonationResponse(\r\n donationInfo: DonationPaymentInfo,\r\n response: SuccessResponse,\r\n ): void {\r\n switch (donationInfo.donationType) {\r\n case DonationType.OneTime:\r\n this.showUpsellModal({\r\n oneTimeAmount: response.amount,\r\n yesSelected: (amount: number) => {\r\n this.upsellModalYesSelected(response, amount);\r\n },\r\n noSelected: () => {\r\n this.showThankYouModal({ successResponse: response });\r\n },\r\n userClosedModalCallback: () => {\r\n this.showThankYouModal({ successResponse: response });\r\n },\r\n });\r\n break;\r\n case DonationType.Monthly:\r\n this.showThankYouModal({ successResponse: response });\r\n break;\r\n // This case will never be reached, it is only here for completeness.\r\n // The upsell case gets handled in `modalYesSelected()` below\r\n case DonationType.Upsell:\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"donation-flow-modal-manager.js","sourceRoot":"","sources":["../../../src/payment-flow-handlers/donation-flow-modal-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { html } from 'lit';\nimport { ModalConfig, ModalManagerInterface } from '@internetarchive/modal-manager';\nimport { UpsellModalCTAMode } from '../modals/upsell-modal-content';\nimport '../modals/confirm-donation-modal-content';\nimport { BraintreeManagerInterface } from '../braintree-manager/braintree-interfaces';\nimport {\n SuccessResponse,\n ErrorResponse,\n DonationPaymentInfo,\n DonationType,\n PaymentProvider,\n BillingInfo,\n CustomerInfo,\n DonationResponse,\n} from '@internetarchive/donation-form-data-models';\nimport '../modals/error-modal-content';\nimport { DonationControllerEventLoggerInterface } from '../@types/analytics-handler';\n\nenum ModalHeaderColor {\n Blue = '#497fbf',\n Green = '#55A183',\n Red = '#691916',\n}\n\n/**\n * The DonationFlowModalManager is responsible for most of the high-level modal flows.\n *\n * Each of the payment providers has slightly different interactions, ie the PayPal button,\n * ApplePay popup, Venmo launching the app, etc. The modal flow is the same for all of them\n * so this class gets called by the individual payment flow handlers to take the user\n * through the modal flow.\n *\n * @export\n * @interface DonationFlowModalManagerInterface\n */\nexport interface DonationFlowModalManagerInterface {\n showConfirmationStepModal(options: {\n amount: number;\n donationType: DonationType;\n currencyType: string;\n confirmDonationCB: Function;\n cancelDonationCB: Function;\n }): Promise<void>;\n /**\n * Close the modal\n *\n * @memberof DonationFlowModalManagerInterface\n */\n closeModal(): void;\n\n /**\n * Show the processing modal\n *\n * @memberof DonationFlowModalManagerInterface\n */\n showProcessingModal(): void;\n\n /**\n * Show the Thank You modal\n *\n * @memberof DonationFlowModalManagerInterface\n */\n showThankYouModal(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void;\n\n /**\n * Show the Error modal\n *\n * @param {{\n * userClosedModalCallback?: () => void;\n * }} [options]\n * @memberof DonationFlowModalManagerInterface\n */\n showErrorModal(options: { message: string; userClosedModalCallback?: () => void }): void;\n\n /**\n * Show the upsell modal\n *\n * @param {{\n * ctaMode?: UpsellModalCTAMode;\n * yesSelected?: (amount: number) => void;\n * noSelected?: () => void;\n * amountChanged?: (amount: number) => void;\n * userClosedModalCallback?: () => void;\n * }} [options]\n * @returns {Promise<void>}\n * @memberof DonationFlowModalManagerInterface\n */\n showUpsellModal(options: {\n oneTimeAmount: number;\n ctaMode?: UpsellModalCTAMode;\n yesSelected?: (amount: number) => void;\n noSelected?: () => void;\n amountChanged?: (amount: number) => void;\n userClosedModalCallback?: () => void;\n }): Promise<void>;\n\n /**\n * Start the donation submission flow. This kicks off the \"main\" modal flow once the\n * user authorizes the donation through their payment provider, which provides\n * us the with the nonce used to complete the donation.\n *\n * @param {{\n * nonce: string;\n * paymentProvider: PaymentProvider;\n * donationInfo: DonationPaymentInfo;\n * billingInfo: BillingInfo;\n * customerInfo: CustomerInfo;\n * upsellOnetimeTransactionId?: string;\n * customerId?: string;\n * recaptchaToken?: string;\n * bin?: string; // first 6 digits of CC\n * binName?: string; // credit card bank name\n * }} options\n * @returns {(Promise<DonationResponse | undefined>)}\n * @memberof DonationFlowModalManagerInterface\n */\n startDonationSubmissionFlow(options: {\n nonce: string;\n paymentProvider: PaymentProvider;\n donationInfo: DonationPaymentInfo;\n billingInfo: BillingInfo;\n customerInfo: CustomerInfo;\n upsellOnetimeTransactionId?: string;\n customerId?: string;\n recaptchaToken?: string;\n bin?: string; // first 6 digits of CC\n binName?: string; // credit card bank name\n }): Promise<DonationResponse | undefined>;\n\n /**\n * Handle a successful donation response. This encapsulates the logic for the type of\n * donation that was made.\n * ie. If it was a one-time donation, show the upsell, if it was monthly do not.\n *\n * @param {DonationPaymentInfo} donationInfo\n * @param {SuccessResponse} response\n * @memberof DonationFlowModalManagerInterface\n */\n handleSuccessfulDonationResponse(\n donationInfo: DonationPaymentInfo,\n response: SuccessResponse,\n ): void;\n}\n\nexport class DonationFlowModalManager implements DonationFlowModalManagerInterface {\n private braintreeManager: BraintreeManagerInterface;\n\n private modalManager: ModalManagerInterface;\n\n private analytics: DonationControllerEventLoggerInterface;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n modalManager: ModalManagerInterface;\n analytics: DonationControllerEventLoggerInterface;\n }) {\n this.modalManager = options.modalManager;\n this.braintreeManager = options.braintreeManager;\n this.analytics = options.analytics;\n }\n\n /** @inheritdoc */\n closeModal(): void {\n this.modalManager.closeModal();\n }\n\n /** @inheritdoc */\n showProcessingModal(): void {\n const modalConfig = new ModalConfig({\n headerColor: ModalHeaderColor.Blue,\n showProcessingIndicator: true,\n closeOnBackdropClick: false,\n showCloseButton: false,\n processingImageMode: 'processing',\n title: html` Processing... `,\n });\n this.modalManager.showModal({ config: modalConfig });\n }\n\n /** @inheritdoc */\n showThankYouModal(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void {\n const modalConfig = new ModalConfig({\n showProcessingIndicator: true,\n processingImageMode: 'complete',\n headerColor: ModalHeaderColor.Green,\n title: html` Thank You! `,\n });\n this.modalManager.showModal({\n config: modalConfig,\n });\n\n // post analytic\n const selectedPayment = options.successResponse.paymentProvider.replace(/\\s+/g, '');\n let action = `Donated-${selectedPayment}`;\n if (options.upsellSuccessResponse) {\n action += `-upsell`;\n }\n const label = options.successResponse.donationType;\n this.analytics.logDonationFlowEvent(action, label);\n\n // post donation\n this.braintreeManager.donationSuccessful(options);\n }\n\n /** @inheritdoc */\n showErrorModal(options: { message: string; userClosedModalCallback?: () => void }): void {\n const modalConfig = new ModalConfig({\n headerColor: ModalHeaderColor.Red,\n title: html` Processing error `,\n headline: html` There's been a problem completing your donation. `,\n message: html` ${options?.message} `,\n });\n\n this.modalManager.showModal({\n config: modalConfig,\n userClosedModalCallback: options?.userClosedModalCallback,\n customModalContent: html`\n <donation-form-error-modal-content></donation-form-error-modal-content>\n `,\n });\n }\n\n showConfirmationStepModal(options: {\n amount: number;\n donationType: DonationType;\n currencyType: string;\n confirmDonationCB: Function;\n cancelDonationCB: Function;\n }): Promise<void> {\n const confirmDonation = (): void => {\n options?.confirmDonationCB();\n };\n const cancelDonation = (): void => {\n options?.cancelDonationCB();\n };\n const modalTitle =\n options.donationType === DonationType.Upsell\n ? 'Confirm monthly donation'\n : 'Complete donation';\n\n const modalConfig = new ModalConfig({\n closeOnBackdropClick: false,\n headerColor: ModalHeaderColor.Green,\n title: html`${modalTitle}`,\n message: html`\n <confirm-donation-modal\n .amount=\"${options.amount}\"\n .currencyType=\"${options.currencyType}\"\n .donationType=\"${options.donationType}\"\n .confirmDonation=${confirmDonation}\n .cancelDonation=${cancelDonation}\n ></confirm-donation-modal>\n `,\n });\n return this.modalManager.showModal({\n config: modalConfig,\n userClosedModalCallback: cancelDonation,\n });\n }\n\n /** @inheritdoc */\n showUpsellModal(options: {\n oneTimeAmount: number;\n yesSelected?: (amount: number) => void;\n noSelected?: () => void;\n amountChanged?: (amount: number) => void;\n userClosedModalCallback?: () => void;\n ctaMode?: UpsellModalCTAMode;\n }): Promise<void> {\n const modalConfig = new ModalConfig({\n headerColor: ModalHeaderColor.Green,\n title: html` Donation received `,\n processingImageMode: 'complete',\n showProcessingIndicator: true,\n });\n\n const upsellAmount = DonationFlowModalManager.getDefaultUpsellAmount(options.oneTimeAmount);\n if (options.amountChanged) {\n options.amountChanged(upsellAmount);\n }\n\n const modalContent = html`\n <upsell-modal-content\n .amount=${upsellAmount}\n .yesButtonMode=${options?.ctaMode ?? UpsellModalCTAMode.YesButton}\n @yesSelected=${(e: CustomEvent): void =>\n options?.yesSelected ? options.yesSelected(e.detail.amount) : undefined}\n @noThanksSelected=${options?.noSelected}\n @amountChanged=${(e: CustomEvent): void =>\n options?.amountChanged ? options.amountChanged(e.detail.amount) : undefined}\n >\n <slot name=\"paypal-upsell-button\"></slot>\n </upsell-modal-content>\n `;\n return this.modalManager.showModal({\n config: modalConfig,\n customModalContent: modalContent,\n userClosedModalCallback: options?.userClosedModalCallback,\n });\n }\n\n /** @inheritdoc */\n async startDonationSubmissionFlow(options: {\n nonce: string;\n paymentProvider: PaymentProvider;\n donationInfo: DonationPaymentInfo;\n billingInfo: BillingInfo;\n customerInfo: CustomerInfo;\n upsellOnetimeTransactionId?: string;\n customerId?: string;\n recaptchaToken?: string;\n bin?: string; // first 6 digits of CC\n binName?: string; // credit card bank name\n }): Promise<DonationResponse | undefined> {\n this.showProcessingModal();\n\n try {\n const response = await this.braintreeManager.submitDonation(options);\n\n if (response.success) {\n this.handleSuccessfulDonationResponse(\n options.donationInfo,\n response.value as SuccessResponse,\n );\n return response;\n } else {\n const error = response.value as ErrorResponse;\n this.showErrorModal({\n message: error.message,\n });\n return response;\n }\n } catch (error) {\n this.showErrorModal({\n message: `${error}`,\n });\n console.error('error getting a response', error);\n return undefined;\n }\n }\n\n private async upsellModalYesSelected(\n oneTimeDonationResponse: SuccessResponse,\n amount: number,\n ): Promise<DonationResponse | undefined> {\n this.showProcessingModal();\n\n try {\n const response = await this.braintreeManager.submitUpsellDonation({\n oneTimeDonationResponse: oneTimeDonationResponse,\n amount: amount,\n });\n\n if (response.success) {\n this.completeUpsell({\n successResponse: oneTimeDonationResponse,\n upsellSuccessResponse: response.value as SuccessResponse,\n });\n } else {\n const error = response.value as ErrorResponse;\n this.showErrorModal({\n message: error.message,\n });\n }\n\n return response;\n } catch (error) {\n this.showErrorModal({\n message: `${error}`,\n });\n console.error('error getting a response', error);\n return undefined;\n }\n }\n\n private completeUpsell(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void {\n this.showThankYouModal(options);\n\n // post analytic\n const selectedPayment = options.successResponse.paymentProvider.replace(/\\s+/g, '');\n const action = `Donated-${selectedPayment}-upsell`;\n const label = options.successResponse.donationType;\n this.analytics.logDonationFlowEvent(action, label);\n\n this.braintreeManager.donationSuccessful(options);\n }\n\n static getDefaultUpsellAmount(oneTimeAmount: number): number {\n let amount = 5;\n\n if (oneTimeAmount <= 10) amount = 8;\n else if (oneTimeAmount > 10 && oneTimeAmount <= 25) amount = 10;\n else if (oneTimeAmount > 25 && oneTimeAmount <= 100) amount = 25;\n else if (oneTimeAmount > 100) amount = 50;\n\n return amount;\n }\n\n /** @inheritdoc */\n handleSuccessfulDonationResponse(\n donationInfo: DonationPaymentInfo,\n response: SuccessResponse,\n ): void {\n switch (donationInfo.donationType) {\n case DonationType.OneTime:\n this.showUpsellModal({\n oneTimeAmount: response.amount,\n yesSelected: (amount: number) => {\n this.upsellModalYesSelected(response, amount);\n },\n noSelected: () => {\n this.showThankYouModal({ successResponse: response });\n },\n userClosedModalCallback: () => {\n this.showThankYouModal({ successResponse: response });\n },\n });\n break;\n case DonationType.Monthly:\n this.showThankYouModal({ successResponse: response });\n break;\n // This case will never be reached, it is only here for completeness.\n // The upsell case gets handled in `modalYesSelected()` below\n case DonationType.Upsell:\n break;\n default:\n break;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"applepay-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/applepay-flow-handler.ts"],"names":[],"mappings":";AACA,OAAO,EAIL,YAAY,GAEb,MAAM,4CAA4C,CAAC;AASpD,MAAM,OAAO,mBAAmB;IAO9B,YAAY,OAGX;QACC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IACnE,CAAC;IAIK,gBAAgB,CAAC,YAAiC,EAAE,CAAQ;;;YAChE,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,gBAAgB,CAAC,eAAe,CAAC,GAAG,EAAE,CAAA,CAAC;YACpF,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,oBAAoB,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA,CAAC;YAE/E,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC1C,CAAC;QACH,CAAC;KAAA;IAEa,gBAAgB,CAC5B,uBAAwC,EACxC,MAAc;;YAEd,IAAI,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;gBAChE,uBAAuB,EAAE,uBAAuB;gBAChD,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC;oBAC9C,eAAe,EAAE,uBAAuB;oBACxC,qBAAqB,EAAE,QAAQ,CAAC,KAAwB;iBACzD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAsB,CAAC;gBAC9C,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;oBAC3C,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KAAA;IAED,2CAA2C;IAC3C,eAAe,CAAC,QAA0B;;QACxC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAwB,CAAC;YAC1D,IAAI,CAAA,MAAA,IAAI,CAAC,kBAAkB,0CAAE,YAAY,CAAC,YAAY,KAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/E,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC;oBAC5C,aAAa,EAAE,eAAe,CAAC,MAAM;oBACrC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;oBAC9D,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAC9D,IAAI,CAAC,wBAAwB,EAC7B;wBACE,eAAe;qBAChB,CACF;oBACD,uBAAuB,EAAE,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAC3E,IAAI,CAAC,wBAAwB,EAC7B;wBACE,eAAe;qBAChB,CACF;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAsB,CAAC;YACtD,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;gBAC3C,OAAO,EAAE,aAAa,CAAC,OAAO;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;YAC3C,OAAO,EAAE,gBAAgB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC;CACF","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\r\nimport {\r\n DonationResponse,\r\n DonationPaymentInfo,\r\n SuccessResponse,\r\n DonationType,\r\n ErrorResponse,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\r\nimport { ApplePaySessionDataSourceDelegate } from '../../braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate';\r\nimport { ApplePaySessionDataSourceInterface } from '../../braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface';\r\n\r\nexport interface ApplePayFlowHandlerInterface {\r\n paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void>;\r\n}\r\n\r\nexport class ApplePayFlowHandler\r\n implements ApplePayFlowHandlerInterface, ApplePaySessionDataSourceDelegate\r\n{\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n donationFlowModalManager: DonationFlowModalManagerInterface;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.donationFlowModalManager = options.donationFlowModalManager;\r\n }\r\n\r\n private applePayDataSource?: ApplePaySessionDataSourceInterface;\r\n\r\n async paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void> {\r\n this.donationFlowModalManager.showProcessingModal();\r\n const handler = await this.braintreeManager?.paymentProviders.applePayHandler.get();\r\n this.applePayDataSource = await handler?.createPaymentRequest(e, donationInfo);\r\n\r\n if (this.applePayDataSource) {\r\n this.applePayDataSource.delegate = this;\r\n }\r\n }\r\n\r\n private async modalYesSelected(\r\n oneTimeDonationResponse: SuccessResponse,\r\n amount: number,\r\n ): Promise<void> {\r\n this.donationFlowModalManager.showProcessingModal();\r\n\r\n const response = await this.braintreeManager.submitUpsellDonation({\r\n oneTimeDonationResponse: oneTimeDonationResponse,\r\n amount: amount,\r\n });\r\n\r\n if (response.success) {\r\n this.donationFlowModalManager.showThankYouModal({\r\n successResponse: oneTimeDonationResponse,\r\n upsellSuccessResponse: response.value as SuccessResponse,\r\n });\r\n } else {\r\n const error = response.value as ErrorResponse;\r\n this.donationFlowModalManager.showErrorModal({\r\n message: error.message,\r\n });\r\n }\r\n }\r\n\r\n // MARK - ApplePaySessionDataSourceDelegate\r\n paymentComplete(response: DonationResponse): void {\r\n if (response.success) {\r\n const successResponse = response.value as SuccessResponse;\r\n if (this.applePayDataSource?.donationInfo.donationType == DonationType.OneTime) {\r\n this.donationFlowModalManager.showUpsellModal({\r\n oneTimeAmount: successResponse.amount,\r\n yesSelected: this.modalYesSelected.bind(this, successResponse),\r\n noSelected: this.donationFlowModalManager.showThankYouModal.bind(\r\n this.donationFlowModalManager,\r\n {\r\n successResponse,\r\n },\r\n ),\r\n userClosedModalCallback: this.donationFlowModalManager.showThankYouModal.bind(\r\n this.donationFlowModalManager,\r\n {\r\n successResponse,\r\n },\r\n ),\r\n });\r\n } else {\r\n this.donationFlowModalManager.showThankYouModal({ successResponse });\r\n }\r\n } else {\r\n const errorResponse = response.value as ErrorResponse;\r\n this.donationFlowModalManager.showErrorModal({\r\n message: errorResponse.message,\r\n });\r\n }\r\n }\r\n\r\n paymentFailed(): void {\r\n this.donationFlowModalManager.showErrorModal({\r\n message: 'Payment failed',\r\n });\r\n }\r\n\r\n paymentCancelled(): void {\r\n this.donationFlowModalManager.closeModal();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"applepay-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/applepay-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\nimport {\n DonationResponse,\n DonationPaymentInfo,\n SuccessResponse,\n DonationType,\n ErrorResponse,\n} from '@internetarchive/donation-form-data-models';\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\nimport { ApplePaySessionDataSourceDelegate } from '../../braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate';\nimport { ApplePaySessionDataSourceInterface } from '../../braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface';\n\nexport interface ApplePayFlowHandlerInterface {\n paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void>;\n}\n\nexport class ApplePayFlowHandler\n implements ApplePayFlowHandlerInterface, ApplePaySessionDataSourceDelegate\n{\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n\n private braintreeManager: BraintreeManagerInterface;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n donationFlowModalManager: DonationFlowModalManagerInterface;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.donationFlowModalManager = options.donationFlowModalManager;\n }\n\n private applePayDataSource?: ApplePaySessionDataSourceInterface;\n\n async paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void> {\n this.donationFlowModalManager.showProcessingModal();\n const handler = await this.braintreeManager?.paymentProviders.applePayHandler.get();\n this.applePayDataSource = await handler?.createPaymentRequest(e, donationInfo);\n\n if (this.applePayDataSource) {\n this.applePayDataSource.delegate = this;\n }\n }\n\n private async modalYesSelected(\n oneTimeDonationResponse: SuccessResponse,\n amount: number,\n ): Promise<void> {\n this.donationFlowModalManager.showProcessingModal();\n\n const response = await this.braintreeManager.submitUpsellDonation({\n oneTimeDonationResponse: oneTimeDonationResponse,\n amount: amount,\n });\n\n if (response.success) {\n this.donationFlowModalManager.showThankYouModal({\n successResponse: oneTimeDonationResponse,\n upsellSuccessResponse: response.value as SuccessResponse,\n });\n } else {\n const error = response.value as ErrorResponse;\n this.donationFlowModalManager.showErrorModal({\n message: error.message,\n });\n }\n }\n\n // MARK - ApplePaySessionDataSourceDelegate\n paymentComplete(response: DonationResponse): void {\n if (response.success) {\n const successResponse = response.value as SuccessResponse;\n if (this.applePayDataSource?.donationInfo.donationType == DonationType.OneTime) {\n this.donationFlowModalManager.showUpsellModal({\n oneTimeAmount: successResponse.amount,\n yesSelected: this.modalYesSelected.bind(this, successResponse),\n noSelected: this.donationFlowModalManager.showThankYouModal.bind(\n this.donationFlowModalManager,\n {\n successResponse,\n },\n ),\n userClosedModalCallback: this.donationFlowModalManager.showThankYouModal.bind(\n this.donationFlowModalManager,\n {\n successResponse,\n },\n ),\n });\n } else {\n this.donationFlowModalManager.showThankYouModal({ successResponse });\n }\n } else {\n const errorResponse = response.value as ErrorResponse;\n this.donationFlowModalManager.showErrorModal({\n message: errorResponse.message,\n });\n }\n }\n\n paymentFailed(): void {\n this.donationFlowModalManager.showErrorModal({\n message: 'Payment failed',\n });\n }\n\n paymentCancelled(): void {\n this.donationFlowModalManager.closeModal();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"creditcard-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/creditcard-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNanoEvents, Emitter, Unsubscribe } from 'nanoevents';\r\n\r\nimport { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\r\nimport { RecaptchaManagerInterface } from '../../recaptcha-manager/recaptcha-manager';\r\n\r\nimport {\r\n DonorContactInfo,\r\n DonationPaymentInfo,\r\n PaymentProvider,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\r\nimport { HostedFieldName } from '../../braintree-manager/payment-providers/credit-card/hosted-field-container';\r\nimport { BadgedInput } from '../../form-elements/badged-input';\r\nimport { BraintreeError } from '../../@types/braintree-web';\r\n\r\nexport interface CreditCardFlowHandlerInterface {\r\n /**\r\n * Set up the hosted fields with event bindings\r\n *\r\n * @returns {Promise<void>}\r\n * @memberof CreditCardFlowHandlerInterface\r\n */\r\n startup(): Promise<void>;\r\n\r\n /**\r\n * Tokenize the hosted fields.\r\n *\r\n * This also performs validation so we can call this before initiating the payment to\r\n * display any error messaging.\r\n *\r\n * @returns {(Promise<braintree.HostedFieldsTokenizePayload | undefined>)}\r\n * @memberof CreditCardFlowHandlerInterface\r\n */\r\n tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined>;\r\n\r\n /**\r\n * Initiate the payment flow.\r\n *\r\n * You must get the response from `tokenizeFields()` first before this to validate the hosted fields.\r\n *\r\n * @param {braintree.HostedFieldsTokenizePayload} hostedFieldsResponse\r\n * @param {DonationPaymentInfo} donationInfo\r\n * @param {DonorContactInfo} donorContactInfo\r\n * @returns {Promise<void>}\r\n * @memberof CreditCardFlowHandlerInterface\r\n */\r\n paymentInitiated(\r\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\r\n donationInfo: DonationPaymentInfo,\r\n donorContactInfo: DonorContactInfo,\r\n ): Promise<void>;\r\n\r\n /**\r\n * Bind to receive credit card flow handler events\r\n *\r\n * @template E\r\n * @param {E} event\r\n * @param {CreditCardFlowHandlerEvents[E]} callback\r\n * @returns {Unsubscribe}\r\n * @memberof CreditCardFlowHandlerInterface\r\n */\r\n on<E extends keyof CreditCardFlowHandlerEvents>(\r\n event: E,\r\n callback: CreditCardFlowHandlerEvents[E],\r\n ): Unsubscribe;\r\n}\r\n\r\nexport interface CreditCardFlowHandlerEvents {\r\n validityChanged: (isValid: boolean) => void;\r\n}\r\n\r\nexport class CreditCardFlowHandler implements CreditCardFlowHandlerInterface {\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private recaptchaManager: RecaptchaManagerInterface;\r\n\r\n private emitter: Emitter<CreditCardFlowHandlerEvents>;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n donationFlowModalManager: DonationFlowModalManagerInterface;\r\n recaptchaManager: RecaptchaManagerInterface;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.donationFlowModalManager = options.donationFlowModalManager;\r\n this.recaptchaManager = options.recaptchaManager;\r\n this.emitter = createNanoEvents<CreditCardFlowHandlerEvents>();\r\n }\r\n\r\n /** @inheritdoc */\r\n on<E extends keyof CreditCardFlowHandlerEvents>(\r\n event: E,\r\n callback: CreditCardFlowHandlerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n\r\n private started = false;\r\n\r\n /** @inheritdoc */\r\n async startup(): Promise<void> {\r\n if (this.started) {\r\n return;\r\n }\r\n this.started = true;\r\n\r\n const handler = await this.braintreeManager?.paymentProviders.creditCardHandler.get();\r\n const instance = await handler?.instance.get();\r\n\r\n // NOTE: The `focus` and `blur` callback logic must work in conjunction with\r\n // the `HostedFieldContainer` class. We use the `HostedFieldContainer` for\r\n // managing the hosted field error state in other parts of the form, but\r\n // since we can only get event callbacks from the hosted fields like this,\r\n // this has to operate independently and modify the CSS styles by itself\r\n instance?.on('focus', (event: braintree.HostedFieldsStateObject): void => {\r\n const { emittedBy, fields } = event;\r\n const fieldInFocus = fields[emittedBy];\r\n const { container } = fieldInFocus;\r\n (container.parentElement as BadgedInput).error = false;\r\n handler.hideErrorMessage();\r\n });\r\n\r\n instance?.on('blur', (event: braintree.HostedFieldsStateObject): void => {\r\n const { emittedBy, fields } = event;\r\n const fieldInFocus = fields[emittedBy];\r\n const { container, isEmpty, isValid } = fieldInFocus;\r\n if (isEmpty || !isValid) {\r\n (container.parentElement as BadgedInput).error = true;\r\n }\r\n });\r\n\r\n instance?.on('validityChange', (event: braintree.HostedFieldsStateObject): void => {\r\n const { fields } = event;\r\n const isValid = fields.cvv.isValid && fields.expirationDate.isValid && fields.number.isValid;\r\n this.emitter.emit('validityChanged', isValid);\r\n });\r\n }\r\n\r\n /** @inheritdoc */\r\n async tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined> {\r\n let hostedFieldsResponse: braintree.HostedFieldsTokenizePayload | undefined;\r\n\r\n const handler = await this.braintreeManager.paymentProviders.creditCardHandler.get();\r\n\r\n try {\r\n hostedFieldsResponse = await handler?.tokenizeHostedFields();\r\n } catch (error) {\r\n this.handleHostedFieldTokenizationError(error as BraintreeError);\r\n return;\r\n }\r\n\r\n return hostedFieldsResponse;\r\n }\r\n\r\n /** @inheritdoc */\r\n async paymentInitiated(\r\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\r\n donationInfo: DonationPaymentInfo,\r\n donorContactInfo: DonorContactInfo,\r\n ): Promise<void> {\r\n let recaptchaToken: string | undefined;\r\n\r\n try {\r\n recaptchaToken = await this.recaptchaManager.execute();\r\n } catch (error) {\r\n this.donationFlowModalManager.showErrorModal({\r\n message: `Recaptcha failure`,\r\n });\r\n return;\r\n }\r\n\r\n this.donationFlowModalManager.startDonationSubmissionFlow({\r\n nonce: hostedFieldsResponse.nonce,\r\n paymentProvider: PaymentProvider.CreditCard,\r\n recaptchaToken: recaptchaToken,\r\n bin: hostedFieldsResponse.details.bin,\r\n donationInfo: donationInfo,\r\n customerInfo: donorContactInfo.customer,\r\n billingInfo: donorContactInfo.billing,\r\n });\r\n }\r\n\r\n private async handleHostedFieldTokenizationError(error: braintree.BraintreeError): Promise<void> {\r\n const handler = await this.braintreeManager.paymentProviders.creditCardHandler.get();\r\n\r\n handler.showErrorMessage();\r\n\r\n switch (error.code) {\r\n case 'HOSTED_FIELDS_FIELDS_EMPTY':\r\n // occurs when none of the fields are filled in\r\n handler.markFieldErrors([\r\n HostedFieldName.Number,\r\n HostedFieldName.CVV,\r\n HostedFieldName.ExpirationDate,\r\n ]);\r\n break;\r\n case 'HOSTED_FIELDS_FIELDS_INVALID':\r\n // occurs when certain fields do not pass client side validation\r\n Object.keys(error.details.invalidFields).forEach(key => {\r\n handler.markFieldErrors([key as HostedFieldName]);\r\n });\r\n break;\r\n case 'HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE':\r\n // occurs when:\r\n // * the client token used for client authorization was generated\r\n // with a customer ID and the fail on duplicate payment method\r\n // option is set to true\r\n // * the card being tokenized has previously been vaulted (with any customer)\r\n break;\r\n case 'HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED':\r\n // occurs when:\r\n // * the client token used for client authorization was generated\r\n // with a customer ID and the verify card option is set to true\r\n // and you have credit card verification turned on in the Braintree\r\n // control panel\r\n // * the cvv does not pass verfication\r\n handler.markFieldErrors([HostedFieldName.CVV]);\r\n break;\r\n case 'HOSTED_FIELDS_FAILED_TOKENIZATION':\r\n // occurs for any other tokenization error on the server\r\n break;\r\n case 'HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR':\r\n // occurs when the Braintree gateway cannot be contacted\r\n break;\r\n default:\r\n // something else happened\r\n break;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"creditcard-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/creditcard-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNanoEvents, Emitter, Unsubscribe } from 'nanoevents';\n\nimport { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\nimport { RecaptchaManagerInterface } from '../../recaptcha-manager/recaptcha-manager';\n\nimport {\n DonorContactInfo,\n DonationPaymentInfo,\n PaymentProvider,\n} from '@internetarchive/donation-form-data-models';\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\nimport { HostedFieldName } from '../../braintree-manager/payment-providers/credit-card/hosted-field-container';\nimport { BadgedInput } from '../../form-elements/badged-input';\nimport { BraintreeError } from '../../@types/braintree-web';\n\nexport interface CreditCardFlowHandlerInterface {\n /**\n * Set up the hosted fields with event bindings\n *\n * @returns {Promise<void>}\n * @memberof CreditCardFlowHandlerInterface\n */\n startup(): Promise<void>;\n\n /**\n * Tokenize the hosted fields.\n *\n * This also performs validation so we can call this before initiating the payment to\n * display any error messaging.\n *\n * @returns {(Promise<braintree.HostedFieldsTokenizePayload | undefined>)}\n * @memberof CreditCardFlowHandlerInterface\n */\n tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined>;\n\n /**\n * Initiate the payment flow.\n *\n * You must get the response from `tokenizeFields()` first before this to validate the hosted fields.\n *\n * @param {braintree.HostedFieldsTokenizePayload} hostedFieldsResponse\n * @param {DonationPaymentInfo} donationInfo\n * @param {DonorContactInfo} donorContactInfo\n * @returns {Promise<void>}\n * @memberof CreditCardFlowHandlerInterface\n */\n paymentInitiated(\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\n donationInfo: DonationPaymentInfo,\n donorContactInfo: DonorContactInfo,\n ): Promise<void>;\n\n /**\n * Bind to receive credit card flow handler events\n *\n * @template E\n * @param {E} event\n * @param {CreditCardFlowHandlerEvents[E]} callback\n * @returns {Unsubscribe}\n * @memberof CreditCardFlowHandlerInterface\n */\n on<E extends keyof CreditCardFlowHandlerEvents>(\n event: E,\n callback: CreditCardFlowHandlerEvents[E],\n ): Unsubscribe;\n}\n\nexport interface CreditCardFlowHandlerEvents {\n validityChanged: (isValid: boolean) => void;\n}\n\nexport class CreditCardFlowHandler implements CreditCardFlowHandlerInterface {\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n\n private braintreeManager: BraintreeManagerInterface;\n\n private recaptchaManager: RecaptchaManagerInterface;\n\n private emitter: Emitter<CreditCardFlowHandlerEvents>;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n donationFlowModalManager: DonationFlowModalManagerInterface;\n recaptchaManager: RecaptchaManagerInterface;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.donationFlowModalManager = options.donationFlowModalManager;\n this.recaptchaManager = options.recaptchaManager;\n this.emitter = createNanoEvents<CreditCardFlowHandlerEvents>();\n }\n\n /** @inheritdoc */\n on<E extends keyof CreditCardFlowHandlerEvents>(\n event: E,\n callback: CreditCardFlowHandlerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n\n private started = false;\n\n /** @inheritdoc */\n async startup(): Promise<void> {\n if (this.started) {\n return;\n }\n this.started = true;\n\n const handler = await this.braintreeManager?.paymentProviders.creditCardHandler.get();\n const instance = await handler?.instance.get();\n\n // NOTE: The `focus` and `blur` callback logic must work in conjunction with\n // the `HostedFieldContainer` class. We use the `HostedFieldContainer` for\n // managing the hosted field error state in other parts of the form, but\n // since we can only get event callbacks from the hosted fields like this,\n // this has to operate independently and modify the CSS styles by itself\n instance?.on('focus', (event: braintree.HostedFieldsStateObject): void => {\n const { emittedBy, fields } = event;\n const fieldInFocus = fields[emittedBy];\n const { container } = fieldInFocus;\n (container.parentElement as BadgedInput).error = false;\n handler.hideErrorMessage();\n });\n\n instance?.on('blur', (event: braintree.HostedFieldsStateObject): void => {\n const { emittedBy, fields } = event;\n const fieldInFocus = fields[emittedBy];\n const { container, isEmpty, isValid } = fieldInFocus;\n if (isEmpty || !isValid) {\n (container.parentElement as BadgedInput).error = true;\n }\n });\n\n instance?.on('validityChange', (event: braintree.HostedFieldsStateObject): void => {\n const { fields } = event;\n const isValid = fields.cvv.isValid && fields.expirationDate.isValid && fields.number.isValid;\n this.emitter.emit('validityChanged', isValid);\n });\n }\n\n /** @inheritdoc */\n async tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined> {\n let hostedFieldsResponse: braintree.HostedFieldsTokenizePayload | undefined;\n\n const handler = await this.braintreeManager.paymentProviders.creditCardHandler.get();\n\n try {\n hostedFieldsResponse = await handler?.tokenizeHostedFields();\n } catch (error) {\n this.handleHostedFieldTokenizationError(error as BraintreeError);\n return;\n }\n\n return hostedFieldsResponse;\n }\n\n /** @inheritdoc */\n async paymentInitiated(\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\n donationInfo: DonationPaymentInfo,\n donorContactInfo: DonorContactInfo,\n ): Promise<void> {\n let recaptchaToken: string | undefined;\n\n try {\n recaptchaToken = await this.recaptchaManager.execute();\n } catch (error) {\n this.donationFlowModalManager.showErrorModal({\n message: `Recaptcha failure`,\n });\n return;\n }\n\n this.donationFlowModalManager.startDonationSubmissionFlow({\n nonce: hostedFieldsResponse.nonce,\n paymentProvider: PaymentProvider.CreditCard,\n recaptchaToken: recaptchaToken,\n bin: hostedFieldsResponse.details.bin,\n donationInfo: donationInfo,\n customerInfo: donorContactInfo.customer,\n billingInfo: donorContactInfo.billing,\n });\n }\n\n private async handleHostedFieldTokenizationError(error: braintree.BraintreeError): Promise<void> {\n const handler = await this.braintreeManager.paymentProviders.creditCardHandler.get();\n\n handler.showErrorMessage();\n\n switch (error.code) {\n case 'HOSTED_FIELDS_FIELDS_EMPTY':\n // occurs when none of the fields are filled in\n handler.markFieldErrors([\n HostedFieldName.Number,\n HostedFieldName.CVV,\n HostedFieldName.ExpirationDate,\n ]);\n break;\n case 'HOSTED_FIELDS_FIELDS_INVALID':\n // occurs when certain fields do not pass client side validation\n Object.keys(error.details.invalidFields).forEach(key => {\n handler.markFieldErrors([key as HostedFieldName]);\n });\n break;\n case 'HOSTED_FIELDS_TOKENIZATION_FAIL_ON_DUPLICATE':\n // occurs when:\n // * the client token used for client authorization was generated\n // with a customer ID and the fail on duplicate payment method\n // option is set to true\n // * the card being tokenized has previously been vaulted (with any customer)\n break;\n case 'HOSTED_FIELDS_TOKENIZATION_CVV_VERIFICATION_FAILED':\n // occurs when:\n // * the client token used for client authorization was generated\n // with a customer ID and the verify card option is set to true\n // and you have credit card verification turned on in the Braintree\n // control panel\n // * the cvv does not pass verfication\n handler.markFieldErrors([HostedFieldName.CVV]);\n break;\n case 'HOSTED_FIELDS_FAILED_TOKENIZATION':\n // occurs for any other tokenization error on the server\n break;\n case 'HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR':\n // occurs when the Braintree gateway cannot be contacted\n break;\n default:\n // something else happened\n break;\n }\n }\n}\n"]}
@@ -48,6 +48,8 @@ export class GooglePayFlowHandler {
48
48
  lastName,
49
49
  });
50
50
  const billing = new BillingInfo({
51
+ firstName,
52
+ lastName,
51
53
  streetAddress: billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.address1,
52
54
  extendedAddress: billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.address2,
53
55
  locality: billingInfo === null || billingInfo === void 0 ? void 0 : billingInfo.locality,
@@ -1 +1 @@
1
- {"version":3,"file":"googlepay-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/googlepay-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\r\nimport {\r\n DonationPaymentInfo,\r\n PaymentProvider,\r\n CustomerInfo,\r\n BillingInfo,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\r\nimport { Emitter, createNanoEvents, Unsubscribe } from 'nanoevents';\r\n\r\nexport interface GooglePayFlowHandlerInterface {\r\n paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void>;\r\n on<E extends keyof GooglePayFlowHandlerEvents>(\r\n event: E,\r\n callback: GooglePayFlowHandlerEvents[E],\r\n ): Unsubscribe;\r\n}\r\n\r\nexport interface GooglePayFlowHandlerEvents {\r\n paymentCancelled: () => void;\r\n}\r\n\r\nexport class GooglePayFlowHandler implements GooglePayFlowHandlerInterface {\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private emitter: Emitter<GooglePayFlowHandlerEvents> =\r\n createNanoEvents<GooglePayFlowHandlerEvents>();\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n donationFlowModalManager: DonationFlowModalManagerInterface;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.donationFlowModalManager = options.donationFlowModalManager;\r\n }\r\n\r\n on<E extends keyof GooglePayFlowHandlerEvents>(\r\n event: E,\r\n callback: GooglePayFlowHandlerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n\r\n // GooglePayFlowHandlerInterface conformance\r\n async paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void> {\r\n const handler = await this.braintreeManager?.paymentProviders.googlePayHandler.get();\r\n const instance = await handler.instance.get();\r\n\r\n const paymentDataRequest = await instance.createPaymentDataRequest({\r\n emailRequired: true,\r\n transactionInfo: {\r\n currencyCode: 'USD',\r\n totalPriceStatus: 'FINAL',\r\n totalPrice: `${donationInfo.total}`,\r\n },\r\n });\r\n\r\n const cardPaymentMethod = paymentDataRequest.allowedPaymentMethods[0];\r\n cardPaymentMethod.parameters.billingAddressRequired = true;\r\n cardPaymentMethod.parameters.billingAddressParameters = {\r\n format: 'FULL',\r\n phoneNumberRequired: false,\r\n };\r\n\r\n try {\r\n const paymentData = await handler.paymentsClient.loadPaymentData(paymentDataRequest);\r\n const result: braintree.GooglePaymentTokenizePayload =\r\n await instance.parseResponse(paymentData);\r\n\r\n const billingInfo = paymentData.paymentMethodData.info?.billingAddress;\r\n const name = billingInfo?.name;\r\n let firstName: string | undefined = name;\r\n let lastName: string | undefined = '';\r\n const lastSpace = name?.lastIndexOf(' ');\r\n if (lastSpace && lastSpace !== -1) {\r\n firstName = name?.substr(0, lastSpace);\r\n lastName = name?.substr(lastSpace);\r\n }\r\n\r\n const customer = new CustomerInfo({\r\n email: paymentData.email,\r\n firstName,\r\n lastName,\r\n });\r\n\r\n const billing = new BillingInfo({\r\n streetAddress: billingInfo?.address1,\r\n extendedAddress: billingInfo?.address2,\r\n locality: billingInfo?.locality,\r\n region: billingInfo?.administrativeArea,\r\n postalCode: billingInfo?.postalCode,\r\n countryCodeAlpha2: billingInfo?.countryCode,\r\n });\r\n\r\n this.donationFlowModalManager.startDonationSubmissionFlow({\r\n nonce: result.nonce,\r\n paymentProvider: PaymentProvider.GooglePay,\r\n bin: result.details.bin,\r\n binName: result.binData.issuingBank,\r\n donationInfo: donationInfo,\r\n customerInfo: customer,\r\n billingInfo: billing,\r\n });\r\n } catch {\r\n this.emitter.emit('paymentCancelled');\r\n this.donationFlowModalManager.closeModal();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"googlepay-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/googlepay-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\nimport {\n DonationPaymentInfo,\n PaymentProvider,\n CustomerInfo,\n BillingInfo,\n} from '@internetarchive/donation-form-data-models';\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\nimport { Emitter, createNanoEvents, Unsubscribe } from 'nanoevents';\n\nexport interface GooglePayFlowHandlerInterface {\n paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void>;\n on<E extends keyof GooglePayFlowHandlerEvents>(\n event: E,\n callback: GooglePayFlowHandlerEvents[E],\n ): Unsubscribe;\n}\n\nexport interface GooglePayFlowHandlerEvents {\n paymentCancelled: () => void;\n}\n\nexport class GooglePayFlowHandler implements GooglePayFlowHandlerInterface {\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n\n private braintreeManager: BraintreeManagerInterface;\n\n private emitter: Emitter<GooglePayFlowHandlerEvents> =\n createNanoEvents<GooglePayFlowHandlerEvents>();\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n donationFlowModalManager: DonationFlowModalManagerInterface;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.donationFlowModalManager = options.donationFlowModalManager;\n }\n\n on<E extends keyof GooglePayFlowHandlerEvents>(\n event: E,\n callback: GooglePayFlowHandlerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n\n // GooglePayFlowHandlerInterface conformance\n async paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void> {\n const handler = await this.braintreeManager?.paymentProviders.googlePayHandler.get();\n const instance = await handler.instance.get();\n\n const paymentDataRequest = await instance.createPaymentDataRequest({\n emailRequired: true,\n transactionInfo: {\n currencyCode: 'USD',\n totalPriceStatus: 'FINAL',\n totalPrice: `${donationInfo.total}`,\n },\n });\n\n const cardPaymentMethod = paymentDataRequest.allowedPaymentMethods[0];\n cardPaymentMethod.parameters.billingAddressRequired = true;\n cardPaymentMethod.parameters.billingAddressParameters = {\n format: 'FULL',\n phoneNumberRequired: false,\n };\n\n try {\n const paymentData = await handler.paymentsClient.loadPaymentData(paymentDataRequest);\n const result: braintree.GooglePaymentTokenizePayload =\n await instance.parseResponse(paymentData);\n\n const billingInfo = paymentData.paymentMethodData.info?.billingAddress;\n const name = billingInfo?.name;\n let firstName: string | undefined = name;\n let lastName: string | undefined = '';\n const lastSpace = name?.lastIndexOf(' ');\n if (lastSpace && lastSpace !== -1) {\n firstName = name?.substr(0, lastSpace);\n lastName = name?.substr(lastSpace);\n }\n\n const customer = new CustomerInfo({\n email: paymentData.email,\n firstName,\n lastName,\n });\n\n const billing = new BillingInfo({\n firstName,\n lastName,\n streetAddress: billingInfo?.address1,\n extendedAddress: billingInfo?.address2,\n locality: billingInfo?.locality,\n region: billingInfo?.administrativeArea,\n postalCode: billingInfo?.postalCode,\n countryCodeAlpha2: billingInfo?.countryCode,\n });\n\n this.donationFlowModalManager.startDonationSubmissionFlow({\n nonce: result.nonce,\n paymentProvider: PaymentProvider.GooglePay,\n bin: result.details.bin,\n binName: result.binData.issuingBank,\n donationInfo: donationInfo,\n customerInfo: customer,\n billingInfo: billing,\n });\n } catch {\n this.emitter.emit('paymentCancelled');\n this.donationFlowModalManager.closeModal();\n }\n }\n}\n"]}
@@ -81,6 +81,8 @@ export class PayPalFlowHandler {
81
81
  });
82
82
  const shippingAddress = details.shippingAddress;
83
83
  const billingInfo = new BillingInfo({
84
+ firstName: details === null || details === void 0 ? void 0 : details.firstName,
85
+ lastName: details === null || details === void 0 ? void 0 : details.lastName,
84
86
  streetAddress: shippingAddress === null || shippingAddress === void 0 ? void 0 : shippingAddress.line1,
85
87
  extendedAddress: shippingAddress === null || shippingAddress === void 0 ? void 0 : shippingAddress.line2,
86
88
  locality: shippingAddress === null || shippingAddress === void 0 ? void 0 : shippingAddress.city,
@@ -1 +1 @@
1
- {"version":3,"file":"paypal-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/paypal-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNanoEvents, Emitter, Unsubscribe } from 'nanoevents';\r\n\r\nimport {\r\n PayPalButtonDataSourceInterface,\r\n PayPalButtonDataSourceDelegate,\r\n} from '../../braintree-manager/payment-providers/paypal/paypal-button-datasource';\r\nimport {\r\n DonationResponse,\r\n DonationType,\r\n DonationPaymentInfo,\r\n SuccessResponse,\r\n CustomerInfo,\r\n BillingInfo,\r\n PaymentProvider,\r\n ErrorResponse,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\r\n\r\nimport { UpsellModalCTAMode } from '../../modals/upsell-modal-content';\r\nimport {\r\n DonationFlowModalManagerInterface,\r\n DonationFlowModalManager,\r\n} from '../donation-flow-modal-manager';\r\n\r\nexport interface PayPalFlowHandlerInterface {\r\n updateDonationInfo(donationInfo: DonationPaymentInfo): void;\r\n updateUpsellDonationInfo(donationInfo: DonationPaymentInfo): void;\r\n renderPayPalButton(donationInfo: DonationPaymentInfo): Promise<void>;\r\n on<E extends keyof PayPalFlowHandlerEvents>(\r\n event: E,\r\n callback: PayPalFlowHandlerEvents[E],\r\n ): Unsubscribe;\r\n}\r\n\r\n/**\r\n * This is a class to combine the data from the one-time purchase to the upsell\r\n *\r\n * @class UpsellDataSourceContainer\r\n */\r\nclass UpsellDataSourceContainer {\r\n upsellButtonDataSource: PayPalButtonDataSourceInterface;\r\n oneTimePayload: paypal.TokenizePayload;\r\n oneTimeSuccessResponse: SuccessResponse;\r\n\r\n constructor(options: {\r\n upsellButtonDataSource: PayPalButtonDataSourceInterface;\r\n oneTimePayload: paypal.TokenizePayload;\r\n oneTimeSuccessResponse: SuccessResponse;\r\n }) {\r\n this.upsellButtonDataSource = options.upsellButtonDataSource;\r\n this.oneTimePayload = options.oneTimePayload;\r\n this.oneTimeSuccessResponse = options.oneTimeSuccessResponse;\r\n }\r\n}\r\n\r\nexport interface PayPalFlowHandlerEvents {\r\n payPalPaymentStarted: (dataSource: PayPalButtonDataSourceInterface, options: object) => void;\r\n payPalPaymentCancelled: (dataSource: PayPalButtonDataSourceInterface, data: object) => void;\r\n payPalPaymentError: (dataSource: PayPalButtonDataSourceInterface, error: string) => void;\r\n payPalPaymentConfirmed: (dataSource: PayPalButtonDataSourceInterface, data: object) => void;\r\n}\r\n\r\n/**\r\n * This class manages the user-flow for PayPal.\r\n *\r\n * @export\r\n * @class PayPalFlowHandler\r\n * @implements {PayPalFlowHandlerInterface}\r\n * @implements {PayPalButtonDataSourceDelegate}\r\n */\r\nexport class PayPalFlowHandler\r\n implements PayPalFlowHandlerInterface, PayPalButtonDataSourceDelegate\r\n{\r\n private upsellButtonDataSourceContainer?: UpsellDataSourceContainer;\r\n\r\n private buttonDataSource?: PayPalButtonDataSourceInterface;\r\n\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private emitter: Emitter<PayPalFlowHandlerEvents> = createNanoEvents<PayPalFlowHandlerEvents>();\r\n\r\n updateDonationInfo(donationInfo: DonationPaymentInfo): void {\r\n if (this.buttonDataSource) {\r\n this.buttonDataSource.donationInfo = donationInfo;\r\n }\r\n }\r\n\r\n updateUpsellDonationInfo(donationInfo: DonationPaymentInfo): void {\r\n if (this.upsellButtonDataSourceContainer) {\r\n this.upsellButtonDataSourceContainer.upsellButtonDataSource.donationInfo = donationInfo;\r\n }\r\n }\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n donationFlowModalManager: DonationFlowModalManagerInterface;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.donationFlowModalManager = options.donationFlowModalManager;\r\n }\r\n\r\n on<E extends keyof PayPalFlowHandlerEvents>(\r\n event: E,\r\n callback: PayPalFlowHandlerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n\r\n async payPalPaymentStarted(\r\n dataSource: PayPalButtonDataSourceInterface,\r\n\r\n options: object,\r\n ): Promise<void> {\r\n this.emitter.emit('payPalPaymentStarted', dataSource, options);\r\n }\r\n\r\n /**\r\n * Once we have the dataSource & payload, we ask patron to confirm donation.\r\n * Once confirmed, we move forward to: `payPalPaymentConfirmed`\r\n */\r\n async payPalPaymentAuthorized(\r\n dataSource: PayPalButtonDataSourceInterface,\r\n payload: paypal.TokenizePayload,\r\n ): Promise<void> {\r\n const { donationType, total } = dataSource.donationInfo;\r\n this.donationFlowModalManager.showConfirmationStepModal({\r\n donationType,\r\n amount: total,\r\n currencyType: 'USD', // defaults to USD for now\r\n confirmDonationCB: () => {\r\n this.payPalPaymentConfirmed(dataSource, payload);\r\n },\r\n cancelDonationCB: () => {\r\n this.donationFlowModalManager.closeModal();\r\n this.payPalPaymentCancelled(dataSource, {});\r\n },\r\n });\r\n }\r\n\r\n async payPalPaymentConfirmed(\r\n dataSource: PayPalButtonDataSourceInterface,\r\n payload: paypal.TokenizePayload,\r\n ): Promise<void> {\r\n this.emitter.emit('payPalPaymentConfirmed', dataSource, {});\r\n this.donationFlowModalManager.showProcessingModal();\r\n\r\n const donationType = dataSource.donationInfo.donationType;\r\n\r\n const details = payload?.details;\r\n\r\n const customerInfo = new CustomerInfo({\r\n email: details?.email,\r\n firstName: details?.firstName,\r\n lastName: details?.lastName,\r\n });\r\n\r\n const shippingAddress = details.shippingAddress;\r\n\r\n const billingInfo = new BillingInfo({\r\n streetAddress: shippingAddress?.line1,\r\n extendedAddress: shippingAddress?.line2,\r\n locality: shippingAddress?.city,\r\n region: shippingAddress?.state,\r\n postalCode: shippingAddress?.postalCode,\r\n countryCodeAlpha2: shippingAddress?.countryCode,\r\n });\r\n\r\n const oneTimeTransaction = this.upsellButtonDataSourceContainer\r\n ? this.upsellButtonDataSourceContainer.oneTimeSuccessResponse.transaction_id\r\n : undefined;\r\n\r\n const response: DonationResponse = await this.braintreeManager.submitDonation({\r\n nonce: payload.nonce,\r\n paymentProvider: PaymentProvider.PayPal,\r\n donationInfo: dataSource.donationInfo,\r\n customerInfo: customerInfo,\r\n billingInfo: billingInfo,\r\n upsellOnetimeTransactionId: oneTimeTransaction,\r\n });\r\n\r\n if (!response.success) {\r\n const error = response.value as ErrorResponse;\r\n this.donationFlowModalManager.showErrorModal({\r\n message: error.message,\r\n });\r\n return;\r\n }\r\n\r\n const successResponse = response.value as SuccessResponse;\r\n\r\n switch (donationType) {\r\n case DonationType.OneTime:\r\n this.showUpsellModal(payload, successResponse);\r\n break;\r\n case DonationType.Monthly:\r\n // show thank you, redirect\r\n this.donationFlowModalManager.showThankYouModal({ successResponse });\r\n break;\r\n case DonationType.Upsell:\r\n if (this.upsellButtonDataSourceContainer) {\r\n this.donationFlowModalManager.showThankYouModal({\r\n successResponse: this.upsellButtonDataSourceContainer.oneTimeSuccessResponse,\r\n upsellSuccessResponse: successResponse,\r\n });\r\n } else {\r\n // we're in the upsell flow, but no upsell data source container.. this should not happen\r\n this.donationFlowModalManager.showErrorModal({\r\n message: 'Error setting up monthly donation',\r\n });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n async payPalPaymentCancelled(\r\n dataSource: PayPalButtonDataSourceInterface,\r\n\r\n data: object,\r\n ): Promise<void> {\r\n this.emitter.emit('payPalPaymentCancelled', dataSource, data);\r\n }\r\n\r\n async payPalPaymentError(\r\n dataSource: PayPalButtonDataSourceInterface,\r\n error: string,\r\n ): Promise<void> {\r\n this.emitter.emit('payPalPaymentError', dataSource, error);\r\n console.error(\r\n 'PaymentSector:payPalPaymentError error:',\r\n dataSource,\r\n dataSource.donationInfo,\r\n error,\r\n );\r\n }\r\n\r\n async renderPayPalButton(donationInfo: DonationPaymentInfo): Promise<void> {\r\n const handler = await this.braintreeManager?.paymentProviders.paypalHandler.get();\r\n\r\n this.buttonDataSource = await handler?.renderPayPalButton({\r\n selector: '#paypal-button',\r\n style: {\r\n color: 'blue' as paypal.ButtonColorOption, // I'm not sure why I can't access the enum directly here.. I get a UMD error\r\n label: 'paypal' as paypal.ButtonLabelOption,\r\n shape: 'rect' as paypal.ButtonShapeOption,\r\n size: 'medium' as paypal.ButtonSizeOption,\r\n tagline: false,\r\n },\r\n donationInfo: donationInfo,\r\n });\r\n\r\n if (this.buttonDataSource) {\r\n this.buttonDataSource.delegate = this;\r\n }\r\n }\r\n\r\n private async showUpsellModal(\r\n oneTimePayload: paypal.TokenizePayload,\r\n oneTimeSuccessResponse: SuccessResponse,\r\n ): Promise<void> {\r\n this.donationFlowModalManager.showUpsellModal({\r\n oneTimeAmount: oneTimeSuccessResponse.amount,\r\n amountChanged: this.upsellAmountChanged.bind(this),\r\n noSelected: () => {\r\n this.donationFlowModalManager.showThankYouModal({\r\n successResponse: oneTimeSuccessResponse,\r\n });\r\n },\r\n ctaMode: UpsellModalCTAMode.PayPalUpsellSlot,\r\n userClosedModalCallback: () => {\r\n this.donationFlowModalManager.showThankYouModal({\r\n successResponse: oneTimeSuccessResponse,\r\n });\r\n },\r\n });\r\n\r\n const amount = DonationFlowModalManager.getDefaultUpsellAmount(oneTimeSuccessResponse.amount);\r\n\r\n const upsellDonationInfo = new DonationPaymentInfo({\r\n amount: amount,\r\n donationType: DonationType.Upsell,\r\n coverFees: false,\r\n });\r\n\r\n if (!this.upsellButtonDataSourceContainer) {\r\n this.renderUpsellPayPalButton({\r\n donationInfo: upsellDonationInfo,\r\n oneTimePayload,\r\n oneTimeSuccessResponse,\r\n });\r\n }\r\n }\r\n\r\n private upsellAmountChanged(amount: number): void {\r\n if (this.upsellButtonDataSourceContainer) {\r\n this.upsellButtonDataSourceContainer.upsellButtonDataSource.donationInfo.amount = amount;\r\n }\r\n }\r\n\r\n private async renderUpsellPayPalButton(options: {\r\n donationInfo: DonationPaymentInfo;\r\n oneTimePayload: paypal.TokenizePayload;\r\n oneTimeSuccessResponse: SuccessResponse;\r\n }): Promise<void> {\r\n const handler = await this.braintreeManager?.paymentProviders.paypalHandler.get();\r\n\r\n const upsellButtonDataSource = await handler?.renderPayPalButton({\r\n selector: '#paypal-upsell-button',\r\n style: {\r\n color: 'blue' as paypal.ButtonColorOption,\r\n label: 'paypal' as paypal.ButtonLabelOption,\r\n shape: 'rect' as paypal.ButtonShapeOption,\r\n size: 'responsive' as paypal.ButtonSizeOption,\r\n tagline: false,\r\n },\r\n donationInfo: options.donationInfo,\r\n });\r\n\r\n if (upsellButtonDataSource) {\r\n upsellButtonDataSource.delegate = this;\r\n this.upsellButtonDataSourceContainer = new UpsellDataSourceContainer({\r\n upsellButtonDataSource: upsellButtonDataSource,\r\n oneTimePayload: options.oneTimePayload,\r\n oneTimeSuccessResponse: options.oneTimeSuccessResponse,\r\n });\r\n } else {\r\n console.error('error rendering paypal upsell button');\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"paypal-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/paypal-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNanoEvents, Emitter, Unsubscribe } from 'nanoevents';\n\nimport {\n PayPalButtonDataSourceInterface,\n PayPalButtonDataSourceDelegate,\n} from '../../braintree-manager/payment-providers/paypal/paypal-button-datasource';\nimport {\n DonationResponse,\n DonationType,\n DonationPaymentInfo,\n SuccessResponse,\n CustomerInfo,\n BillingInfo,\n PaymentProvider,\n ErrorResponse,\n} from '@internetarchive/donation-form-data-models';\nimport { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\n\nimport { UpsellModalCTAMode } from '../../modals/upsell-modal-content';\nimport {\n DonationFlowModalManagerInterface,\n DonationFlowModalManager,\n} from '../donation-flow-modal-manager';\n\nexport interface PayPalFlowHandlerInterface {\n updateDonationInfo(donationInfo: DonationPaymentInfo): void;\n updateUpsellDonationInfo(donationInfo: DonationPaymentInfo): void;\n renderPayPalButton(donationInfo: DonationPaymentInfo): Promise<void>;\n on<E extends keyof PayPalFlowHandlerEvents>(\n event: E,\n callback: PayPalFlowHandlerEvents[E],\n ): Unsubscribe;\n}\n\n/**\n * This is a class to combine the data from the one-time purchase to the upsell\n *\n * @class UpsellDataSourceContainer\n */\nclass UpsellDataSourceContainer {\n upsellButtonDataSource: PayPalButtonDataSourceInterface;\n oneTimePayload: paypal.TokenizePayload;\n oneTimeSuccessResponse: SuccessResponse;\n\n constructor(options: {\n upsellButtonDataSource: PayPalButtonDataSourceInterface;\n oneTimePayload: paypal.TokenizePayload;\n oneTimeSuccessResponse: SuccessResponse;\n }) {\n this.upsellButtonDataSource = options.upsellButtonDataSource;\n this.oneTimePayload = options.oneTimePayload;\n this.oneTimeSuccessResponse = options.oneTimeSuccessResponse;\n }\n}\n\nexport interface PayPalFlowHandlerEvents {\n payPalPaymentStarted: (dataSource: PayPalButtonDataSourceInterface, options: object) => void;\n payPalPaymentCancelled: (dataSource: PayPalButtonDataSourceInterface, data: object) => void;\n payPalPaymentError: (dataSource: PayPalButtonDataSourceInterface, error: string) => void;\n payPalPaymentConfirmed: (dataSource: PayPalButtonDataSourceInterface, data: object) => void;\n}\n\n/**\n * This class manages the user-flow for PayPal.\n *\n * @export\n * @class PayPalFlowHandler\n * @implements {PayPalFlowHandlerInterface}\n * @implements {PayPalButtonDataSourceDelegate}\n */\nexport class PayPalFlowHandler\n implements PayPalFlowHandlerInterface, PayPalButtonDataSourceDelegate\n{\n private upsellButtonDataSourceContainer?: UpsellDataSourceContainer;\n\n private buttonDataSource?: PayPalButtonDataSourceInterface;\n\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n\n private braintreeManager: BraintreeManagerInterface;\n\n private emitter: Emitter<PayPalFlowHandlerEvents> = createNanoEvents<PayPalFlowHandlerEvents>();\n\n updateDonationInfo(donationInfo: DonationPaymentInfo): void {\n if (this.buttonDataSource) {\n this.buttonDataSource.donationInfo = donationInfo;\n }\n }\n\n updateUpsellDonationInfo(donationInfo: DonationPaymentInfo): void {\n if (this.upsellButtonDataSourceContainer) {\n this.upsellButtonDataSourceContainer.upsellButtonDataSource.donationInfo = donationInfo;\n }\n }\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n donationFlowModalManager: DonationFlowModalManagerInterface;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.donationFlowModalManager = options.donationFlowModalManager;\n }\n\n on<E extends keyof PayPalFlowHandlerEvents>(\n event: E,\n callback: PayPalFlowHandlerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n\n async payPalPaymentStarted(\n dataSource: PayPalButtonDataSourceInterface,\n\n options: object,\n ): Promise<void> {\n this.emitter.emit('payPalPaymentStarted', dataSource, options);\n }\n\n /**\n * Once we have the dataSource & payload, we ask patron to confirm donation.\n * Once confirmed, we move forward to: `payPalPaymentConfirmed`\n */\n async payPalPaymentAuthorized(\n dataSource: PayPalButtonDataSourceInterface,\n payload: paypal.TokenizePayload,\n ): Promise<void> {\n const { donationType, total } = dataSource.donationInfo;\n this.donationFlowModalManager.showConfirmationStepModal({\n donationType,\n amount: total,\n currencyType: 'USD', // defaults to USD for now\n confirmDonationCB: () => {\n this.payPalPaymentConfirmed(dataSource, payload);\n },\n cancelDonationCB: () => {\n this.donationFlowModalManager.closeModal();\n this.payPalPaymentCancelled(dataSource, {});\n },\n });\n }\n\n async payPalPaymentConfirmed(\n dataSource: PayPalButtonDataSourceInterface,\n payload: paypal.TokenizePayload,\n ): Promise<void> {\n this.emitter.emit('payPalPaymentConfirmed', dataSource, {});\n this.donationFlowModalManager.showProcessingModal();\n\n const donationType = dataSource.donationInfo.donationType;\n\n const details = payload?.details;\n\n const customerInfo = new CustomerInfo({\n email: details?.email,\n firstName: details?.firstName,\n lastName: details?.lastName,\n });\n\n const shippingAddress = details.shippingAddress;\n\n const billingInfo = new BillingInfo({\n firstName: details?.firstName,\n lastName: details?.lastName,\n streetAddress: shippingAddress?.line1,\n extendedAddress: shippingAddress?.line2,\n locality: shippingAddress?.city,\n region: shippingAddress?.state,\n postalCode: shippingAddress?.postalCode,\n countryCodeAlpha2: shippingAddress?.countryCode,\n });\n\n const oneTimeTransaction = this.upsellButtonDataSourceContainer\n ? this.upsellButtonDataSourceContainer.oneTimeSuccessResponse.transaction_id\n : undefined;\n\n const response: DonationResponse = await this.braintreeManager.submitDonation({\n nonce: payload.nonce,\n paymentProvider: PaymentProvider.PayPal,\n donationInfo: dataSource.donationInfo,\n customerInfo: customerInfo,\n billingInfo: billingInfo,\n upsellOnetimeTransactionId: oneTimeTransaction,\n });\n\n if (!response.success) {\n const error = response.value as ErrorResponse;\n this.donationFlowModalManager.showErrorModal({\n message: error.message,\n });\n return;\n }\n\n const successResponse = response.value as SuccessResponse;\n\n switch (donationType) {\n case DonationType.OneTime:\n this.showUpsellModal(payload, successResponse);\n break;\n case DonationType.Monthly:\n // show thank you, redirect\n this.donationFlowModalManager.showThankYouModal({ successResponse });\n break;\n case DonationType.Upsell:\n if (this.upsellButtonDataSourceContainer) {\n this.donationFlowModalManager.showThankYouModal({\n successResponse: this.upsellButtonDataSourceContainer.oneTimeSuccessResponse,\n upsellSuccessResponse: successResponse,\n });\n } else {\n // we're in the upsell flow, but no upsell data source container.. this should not happen\n this.donationFlowModalManager.showErrorModal({\n message: 'Error setting up monthly donation',\n });\n }\n break;\n }\n }\n\n async payPalPaymentCancelled(\n dataSource: PayPalButtonDataSourceInterface,\n\n data: object,\n ): Promise<void> {\n this.emitter.emit('payPalPaymentCancelled', dataSource, data);\n }\n\n async payPalPaymentError(\n dataSource: PayPalButtonDataSourceInterface,\n error: string,\n ): Promise<void> {\n this.emitter.emit('payPalPaymentError', dataSource, error);\n console.error(\n 'PaymentSector:payPalPaymentError error:',\n dataSource,\n dataSource.donationInfo,\n error,\n );\n }\n\n async renderPayPalButton(donationInfo: DonationPaymentInfo): Promise<void> {\n const handler = await this.braintreeManager?.paymentProviders.paypalHandler.get();\n\n this.buttonDataSource = await handler?.renderPayPalButton({\n selector: '#paypal-button',\n style: {\n color: 'blue' as paypal.ButtonColorOption, // I'm not sure why I can't access the enum directly here.. I get a UMD error\n label: 'paypal' as paypal.ButtonLabelOption,\n shape: 'rect' as paypal.ButtonShapeOption,\n size: 'medium' as paypal.ButtonSizeOption,\n tagline: false,\n },\n donationInfo: donationInfo,\n });\n\n if (this.buttonDataSource) {\n this.buttonDataSource.delegate = this;\n }\n }\n\n private async showUpsellModal(\n oneTimePayload: paypal.TokenizePayload,\n oneTimeSuccessResponse: SuccessResponse,\n ): Promise<void> {\n this.donationFlowModalManager.showUpsellModal({\n oneTimeAmount: oneTimeSuccessResponse.amount,\n amountChanged: this.upsellAmountChanged.bind(this),\n noSelected: () => {\n this.donationFlowModalManager.showThankYouModal({\n successResponse: oneTimeSuccessResponse,\n });\n },\n ctaMode: UpsellModalCTAMode.PayPalUpsellSlot,\n userClosedModalCallback: () => {\n this.donationFlowModalManager.showThankYouModal({\n successResponse: oneTimeSuccessResponse,\n });\n },\n });\n\n const amount = DonationFlowModalManager.getDefaultUpsellAmount(oneTimeSuccessResponse.amount);\n\n const upsellDonationInfo = new DonationPaymentInfo({\n amount: amount,\n donationType: DonationType.Upsell,\n coverFees: false,\n });\n\n if (!this.upsellButtonDataSourceContainer) {\n this.renderUpsellPayPalButton({\n donationInfo: upsellDonationInfo,\n oneTimePayload,\n oneTimeSuccessResponse,\n });\n }\n }\n\n private upsellAmountChanged(amount: number): void {\n if (this.upsellButtonDataSourceContainer) {\n this.upsellButtonDataSourceContainer.upsellButtonDataSource.donationInfo.amount = amount;\n }\n }\n\n private async renderUpsellPayPalButton(options: {\n donationInfo: DonationPaymentInfo;\n oneTimePayload: paypal.TokenizePayload;\n oneTimeSuccessResponse: SuccessResponse;\n }): Promise<void> {\n const handler = await this.braintreeManager?.paymentProviders.paypalHandler.get();\n\n const upsellButtonDataSource = await handler?.renderPayPalButton({\n selector: '#paypal-upsell-button',\n style: {\n color: 'blue' as paypal.ButtonColorOption,\n label: 'paypal' as paypal.ButtonLabelOption,\n shape: 'rect' as paypal.ButtonShapeOption,\n size: 'responsive' as paypal.ButtonSizeOption,\n tagline: false,\n },\n donationInfo: options.donationInfo,\n });\n\n if (upsellButtonDataSource) {\n upsellButtonDataSource.delegate = this;\n this.upsellButtonDataSourceContainer = new UpsellDataSourceContainer({\n upsellButtonDataSource: upsellButtonDataSource,\n oneTimePayload: options.oneTimePayload,\n oneTimeSuccessResponse: options.oneTimeSuccessResponse,\n });\n } else {\n console.error('error rendering paypal upsell button');\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"venmo-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/venmo-flow-handler.ts"],"names":[],"mappings":";AACA,OAAO,EAGL,eAAe,GAChB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAEL,4BAA4B,GAC7B,MAAM,mCAAmC,CAAC;AAS3C,MAAM,OAAO,gBAAgB;IAO3B,YAAY,OAIX;;QACC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;QACjE,IAAI,CAAC,uBAAuB;YAC1B,MAAA,OAAO,CAAC,uBAAuB,mCAAI,IAAI,4BAA4B,EAAE,CAAC;IAC1E,CAAC;IAED;;;;;;;OAOG;IACG,OAAO;;YACX,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAChF,MAAM,QAAQ,GAAG,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC,GAAG,EAAE,CAAA,CAAC;YAC/C,IAAI,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,qBAAqB,EAAE,EAAE,CAAC;gBACtC,uFAAuF;gBACvF,oDAAoD;gBACpD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,CAAC;gBAC9E,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC7E,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACrC,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;wBAC3C,OAAO,EAAE,kCAAkC;qBAC5C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAED,wCAAwC;IAClC,gBAAgB,CACpB,WAA6B,EAC7B,YAAiC;;YAEjC,uFAAuF;YACvF,uEAAuE;YACvE,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAErE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChF,MAAM,MAAM,GAAG,MAAM,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,EAAE,CAAA,CAAC;gBAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC;oBAC1C,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;wBAC3C,OAAO,EAAE,+BAA+B;qBACzC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC;gBAC1C,IAAI,CAAC,uBAAuB,CAAC,aAA+B,CAAC,CAAC;gBAC9D,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC;oBAC3C,OAAO,EAAE,0EAA0E;iBACpF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KAAA;IAEa,wBAAwB,CACpC,OAAuC,EACvC,WAA6B,EAC7B,YAAiC;;YAEjC,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,CAAC;YAE1C,IAAI,CAAC,wBAAwB,CAAC,2BAA2B,CAAC;gBACxD,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,eAAe,EAAE,eAAe,CAAC,KAAK;gBACtC,YAAY,EAAE,YAAY;gBAC1B,YAAY,EAAE,WAAW,CAAC,QAAQ;gBAClC,WAAW,EAAE,WAAW,CAAC,OAAO;aACjC,CAAC,CAAC;QACL,CAAC;KAAA;IAEO,uBAAuB,CAAC,aAAuC;QACrE,+CAA+C;QAC/C,QAAQ,aAAa,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,oBAAoB;gBACvB,MAAM;YACR,KAAK,gBAAgB;gBACnB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\r\nimport {\r\n DonorContactInfo,\r\n DonationPaymentInfo,\r\n PaymentProvider,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport {\r\n VenmoRestorationStateHandlerInterface,\r\n VenmoRestorationStateHandler,\r\n} from './venmo-restoration-state-handler';\r\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\r\nimport { BraintreeError } from '../../@types/braintree-web';\r\n\r\nexport interface VenmoFlowHandlerInterface {\r\n startup(): Promise<void>;\r\n paymentInitiated(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): Promise<void>;\r\n}\r\n\r\nexport class VenmoFlowHandler implements VenmoFlowHandlerInterface {\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private restorationStateHandler: VenmoRestorationStateHandlerInterface;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n donationFlowModalManager: DonationFlowModalManagerInterface;\r\n restorationStateHandler?: VenmoRestorationStateHandlerInterface;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.donationFlowModalManager = options.donationFlowModalManager;\r\n this.restorationStateHandler =\r\n options.restorationStateHandler ?? new VenmoRestorationStateHandler();\r\n }\r\n\r\n /**\r\n * Check if we have any results from Venmo on startup.\r\n *\r\n * This happens if the app redirects to us in a new tab so we can resume the session.\r\n *\r\n * @returns {Promise<void>}\r\n * @memberof VenmoFlowHandler\r\n */\r\n async startup(): Promise<void> {\r\n const handler = await this.braintreeManager.paymentProviders.venmoHandler.get();\r\n const instance = await handler?.instance.get();\r\n if (instance?.hasTokenizationResult()) {\r\n // if we get redirected back from venmo in a different tab, we need to restore the data\r\n // that was persisted when the payment was initiated\r\n const restoredInfo = await this.restorationStateHandler.getRestorationState();\r\n if (restoredInfo) {\r\n this.paymentInitiated(restoredInfo.contactInfo, restoredInfo.donationInfo);\r\n } else {\r\n console.error('no restoration info');\r\n this.donationFlowModalManager.showErrorModal({\r\n message: 'Error restoring donation session',\r\n });\r\n }\r\n }\r\n }\r\n\r\n // VenmoFlowHandlerInterface conformance\r\n async paymentInitiated(\r\n contactInfo: DonorContactInfo,\r\n donationInfo: DonationPaymentInfo,\r\n ): Promise<void> {\r\n // if we get redirected back from venmo in a different tab, we need to restore the data\r\n // that was persisted when the payment was initiated so persist it here\r\n this.restorationStateHandler.persistState(contactInfo, donationInfo);\r\n\r\n try {\r\n const handler = await this.braintreeManager.paymentProviders.venmoHandler.get();\r\n const result = await handler?.startPayment();\r\n if (!result) {\r\n this.restorationStateHandler.clearState();\r\n this.donationFlowModalManager.showErrorModal({\r\n message: 'Error setting up the donation',\r\n });\r\n return;\r\n }\r\n this.handleTokenizationResult(result, contactInfo, donationInfo);\r\n } catch (tokenizeError) {\r\n this.restorationStateHandler.clearState();\r\n this.handleTokenizationError(tokenizeError as BraintreeError);\r\n this.donationFlowModalManager.showErrorModal({\r\n message: `There was a problem loading your donation information. Please try again.`,\r\n });\r\n }\r\n }\r\n\r\n private async handleTokenizationResult(\r\n payload: braintree.VenmoTokenizePayload,\r\n contactInfo: DonorContactInfo,\r\n donationInfo: DonationPaymentInfo,\r\n ): Promise<void> {\r\n this.restorationStateHandler.clearState();\r\n\r\n this.donationFlowModalManager.startDonationSubmissionFlow({\r\n nonce: payload.nonce,\r\n paymentProvider: PaymentProvider.Venmo,\r\n donationInfo: donationInfo,\r\n customerInfo: contactInfo.customer,\r\n billingInfo: contactInfo.billing,\r\n });\r\n }\r\n\r\n private handleTokenizationError(tokenizeError: braintree.BraintreeError): void {\r\n // Handle flow errors or premature flow closure\r\n switch (tokenizeError.code) {\r\n case 'VENMO_APP_CANCELED':\r\n break;\r\n case 'VENMO_CANCELED':\r\n break;\r\n default:\r\n console.error('Error!', tokenizeError);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"venmo-flow-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/venmo-flow-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { BraintreeManagerInterface } from '../../braintree-manager/braintree-interfaces';\nimport {\n DonorContactInfo,\n DonationPaymentInfo,\n PaymentProvider,\n} from '@internetarchive/donation-form-data-models';\nimport {\n VenmoRestorationStateHandlerInterface,\n VenmoRestorationStateHandler,\n} from './venmo-restoration-state-handler';\nimport { DonationFlowModalManagerInterface } from '../donation-flow-modal-manager';\nimport { BraintreeError } from '../../@types/braintree-web';\n\nexport interface VenmoFlowHandlerInterface {\n startup(): Promise<void>;\n paymentInitiated(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): Promise<void>;\n}\n\nexport class VenmoFlowHandler implements VenmoFlowHandlerInterface {\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n\n private braintreeManager: BraintreeManagerInterface;\n\n private restorationStateHandler: VenmoRestorationStateHandlerInterface;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n donationFlowModalManager: DonationFlowModalManagerInterface;\n restorationStateHandler?: VenmoRestorationStateHandlerInterface;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.donationFlowModalManager = options.donationFlowModalManager;\n this.restorationStateHandler =\n options.restorationStateHandler ?? new VenmoRestorationStateHandler();\n }\n\n /**\n * Check if we have any results from Venmo on startup.\n *\n * This happens if the app redirects to us in a new tab so we can resume the session.\n *\n * @returns {Promise<void>}\n * @memberof VenmoFlowHandler\n */\n async startup(): Promise<void> {\n const handler = await this.braintreeManager.paymentProviders.venmoHandler.get();\n const instance = await handler?.instance.get();\n if (instance?.hasTokenizationResult()) {\n // if we get redirected back from venmo in a different tab, we need to restore the data\n // that was persisted when the payment was initiated\n const restoredInfo = await this.restorationStateHandler.getRestorationState();\n if (restoredInfo) {\n this.paymentInitiated(restoredInfo.contactInfo, restoredInfo.donationInfo);\n } else {\n console.error('no restoration info');\n this.donationFlowModalManager.showErrorModal({\n message: 'Error restoring donation session',\n });\n }\n }\n }\n\n // VenmoFlowHandlerInterface conformance\n async paymentInitiated(\n contactInfo: DonorContactInfo,\n donationInfo: DonationPaymentInfo,\n ): Promise<void> {\n // if we get redirected back from venmo in a different tab, we need to restore the data\n // that was persisted when the payment was initiated so persist it here\n this.restorationStateHandler.persistState(contactInfo, donationInfo);\n\n try {\n const handler = await this.braintreeManager.paymentProviders.venmoHandler.get();\n const result = await handler?.startPayment();\n if (!result) {\n this.restorationStateHandler.clearState();\n this.donationFlowModalManager.showErrorModal({\n message: 'Error setting up the donation',\n });\n return;\n }\n this.handleTokenizationResult(result, contactInfo, donationInfo);\n } catch (tokenizeError) {\n this.restorationStateHandler.clearState();\n this.handleTokenizationError(tokenizeError as BraintreeError);\n this.donationFlowModalManager.showErrorModal({\n message: `There was a problem loading your donation information. Please try again.`,\n });\n }\n }\n\n private async handleTokenizationResult(\n payload: braintree.VenmoTokenizePayload,\n contactInfo: DonorContactInfo,\n donationInfo: DonationPaymentInfo,\n ): Promise<void> {\n this.restorationStateHandler.clearState();\n\n this.donationFlowModalManager.startDonationSubmissionFlow({\n nonce: payload.nonce,\n paymentProvider: PaymentProvider.Venmo,\n donationInfo: donationInfo,\n customerInfo: contactInfo.customer,\n billingInfo: contactInfo.billing,\n });\n }\n\n private handleTokenizationError(tokenizeError: braintree.BraintreeError): void {\n // Handle flow errors or premature flow closure\n switch (tokenizeError.code) {\n case 'VENMO_APP_CANCELED':\n break;\n case 'VENMO_CANCELED':\n break;\n default:\n console.error('Error!', tokenizeError);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"venmo-restoration-state-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/venmo-restoration-state-handler.ts"],"names":[],"mappings":";AA4BA;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IAIhC,yCAAyC;IACzC,YAAY,MAA4E;QACtF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,4BAA4B;IAKvC,YAAY,OAAqC;QAJzC,mBAAc,GAAG,2BAA2B,CAAC;QAKnD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACtC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,UAAU;;QACR,MAAA,IAAI,CAAC,aAAa,0CAAE,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,WAA6B,EAAE,YAAiC;;QAC3E,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,CAAC;YACjD,WAAW;YACX,YAAY;SACb,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,kBAAkB;IACZ,mBAAmB;;;YACvB,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAE7D,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;IAED;;;;;;;OAOG;IACK,sBAAsB,CAAC,MAAe;QAC5C,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF","sourcesContent":["import { DonorContactInfo, DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\n\r\nexport interface VenmoRestorationStateHandlerInterface {\r\n /**\r\n * Persist the session state\r\n *\r\n * @param {DonorContactInfo} contactInfo\r\n * @param {DonationPaymentInfo} donationInfo\r\n * @memberof VenmoRestorationStateHandlerInterface\r\n */\r\n persistState(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): void;\r\n\r\n /**\r\n * Get the session restoration state\r\n *\r\n * @returns {(Promise<VenmoRestorationState | undefined>)}\r\n * @memberof VenmoRestorationStateHandlerInterface\r\n */\r\n getRestorationState(): Promise<VenmoRestorationState | undefined>;\r\n\r\n /**\r\n * Clear the restoration state\r\n *\r\n * @memberof VenmoRestorationStateHandlerInterface\r\n */\r\n clearState(): void;\r\n}\r\n\r\n/**\r\n * Structure to store the session restoration state\r\n *\r\n * @export\r\n * @class VenmoRestorationState\r\n */\r\nexport class VenmoRestorationState {\r\n contactInfo: DonorContactInfo;\r\n donationInfo: DonationPaymentInfo;\r\n\r\n // TODO: Add restoration state expiration\r\n constructor(params: { contactInfo: DonorContactInfo; donationInfo: DonationPaymentInfo }) {\r\n this.contactInfo = params.contactInfo;\r\n this.donationInfo = params.donationInfo;\r\n }\r\n}\r\n\r\n/**\r\n * The VenmoRestorationStateHandler is used to persist and restore a Venmo checkout session.\r\n *\r\n * Venmo takes the user out of the web browser and into their app to authorize the purchase.\r\n * It then redirects the user back to the website to finish the transaction. The problem is\r\n * it may open a new browser tab so it's like starting a new session. We need to persist\r\n * the session information from the start of the Venmo session and restore it when it resumes.\r\n *\r\n * This class stores the session information in localStorage when the Venmo session is started\r\n * and retrieves it when the session is restored.\r\n *\r\n * @export\r\n * @class VenmoRestorationStateHandler\r\n * @implements {VenmoRestorationStateHandlerInterface}\r\n */\r\nexport class VenmoRestorationStateHandler implements VenmoRestorationStateHandlerInterface {\r\n private persistanceKey = 'venmoRestorationStateInfo';\r\n\r\n private storageSystem?: Storage;\r\n\r\n constructor(options?: { storageSystem?: Storage }) {\r\n if (options?.storageSystem) {\r\n this.storageSystem = options.storageSystem;\r\n } else if (this.storageSystemAvailable(localStorage)) {\r\n this.storageSystem = localStorage;\r\n } else if (this.storageSystemAvailable(sessionStorage)) {\r\n this.storageSystem = sessionStorage;\r\n }\r\n }\r\n\r\n /** @inheritdoc */\r\n clearState(): void {\r\n this.storageSystem?.removeItem(this.persistanceKey);\r\n }\r\n\r\n /** @inheritdoc */\r\n persistState(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): void {\r\n const venmoRestoration = new VenmoRestorationState({\r\n contactInfo,\r\n donationInfo,\r\n });\r\n const serialized = JSON.stringify(venmoRestoration);\r\n this.storageSystem?.setItem(this.persistanceKey, serialized);\r\n }\r\n\r\n /** @inheritdoc */\r\n async getRestorationState(): Promise<VenmoRestorationState | undefined> {\r\n const stored = this.storageSystem?.getItem(this.persistanceKey);\r\n if (!stored) {\r\n console.error('restoreState: No stored data');\r\n return undefined;\r\n }\r\n\r\n const deserialized = JSON.parse(stored);\r\n if (!deserialized) {\r\n console.error('restoreState: Data could not be deserialized');\r\n return undefined;\r\n }\r\n\r\n const donationInfo = new VenmoRestorationState(deserialized);\r\n\r\n return donationInfo;\r\n }\r\n\r\n /**\r\n * Check if a particular storage system (localStorage/sessionStorage) is availble\r\n *\r\n * @private\r\n * @param {Storage} system\r\n * @returns {boolean}\r\n * @memberof VenmoRestorationStateHandler\r\n */\r\n private storageSystemAvailable(system: Storage): boolean {\r\n try {\r\n system.setItem('foo', 'bar');\r\n system.removeItem('foo');\r\n return true;\r\n } catch (exception) {\r\n return false;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"venmo-restoration-state-handler.js","sourceRoot":"","sources":["../../../../src/payment-flow-handlers/handlers/venmo-restoration-state-handler.ts"],"names":[],"mappings":";AA4BA;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IAIhC,yCAAyC;IACzC,YAAY,MAA4E;QACtF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,4BAA4B;IAKvC,YAAY,OAAqC;QAJzC,mBAAc,GAAG,2BAA2B,CAAC;QAKnD,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC7C,CAAC;aAAM,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,aAAa,GAAG,cAAc,CAAC;QACtC,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,UAAU;;QACR,MAAA,IAAI,CAAC,aAAa,0CAAE,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,WAA6B,EAAE,YAAiC;;QAC3E,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,CAAC;YACjD,WAAW;YACX,YAAY;SACb,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,kBAAkB;IACZ,mBAAmB;;;YACvB,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,aAAa,0CAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAE7D,OAAO,YAAY,CAAC;QACtB,CAAC;KAAA;IAED;;;;;;;OAOG;IACK,sBAAsB,CAAC,MAAe;QAC5C,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF","sourcesContent":["import { DonorContactInfo, DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\n\nexport interface VenmoRestorationStateHandlerInterface {\n /**\n * Persist the session state\n *\n * @param {DonorContactInfo} contactInfo\n * @param {DonationPaymentInfo} donationInfo\n * @memberof VenmoRestorationStateHandlerInterface\n */\n persistState(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): void;\n\n /**\n * Get the session restoration state\n *\n * @returns {(Promise<VenmoRestorationState | undefined>)}\n * @memberof VenmoRestorationStateHandlerInterface\n */\n getRestorationState(): Promise<VenmoRestorationState | undefined>;\n\n /**\n * Clear the restoration state\n *\n * @memberof VenmoRestorationStateHandlerInterface\n */\n clearState(): void;\n}\n\n/**\n * Structure to store the session restoration state\n *\n * @export\n * @class VenmoRestorationState\n */\nexport class VenmoRestorationState {\n contactInfo: DonorContactInfo;\n donationInfo: DonationPaymentInfo;\n\n // TODO: Add restoration state expiration\n constructor(params: { contactInfo: DonorContactInfo; donationInfo: DonationPaymentInfo }) {\n this.contactInfo = params.contactInfo;\n this.donationInfo = params.donationInfo;\n }\n}\n\n/**\n * The VenmoRestorationStateHandler is used to persist and restore a Venmo checkout session.\n *\n * Venmo takes the user out of the web browser and into their app to authorize the purchase.\n * It then redirects the user back to the website to finish the transaction. The problem is\n * it may open a new browser tab so it's like starting a new session. We need to persist\n * the session information from the start of the Venmo session and restore it when it resumes.\n *\n * This class stores the session information in localStorage when the Venmo session is started\n * and retrieves it when the session is restored.\n *\n * @export\n * @class VenmoRestorationStateHandler\n * @implements {VenmoRestorationStateHandlerInterface}\n */\nexport class VenmoRestorationStateHandler implements VenmoRestorationStateHandlerInterface {\n private persistanceKey = 'venmoRestorationStateInfo';\n\n private storageSystem?: Storage;\n\n constructor(options?: { storageSystem?: Storage }) {\n if (options?.storageSystem) {\n this.storageSystem = options.storageSystem;\n } else if (this.storageSystemAvailable(localStorage)) {\n this.storageSystem = localStorage;\n } else if (this.storageSystemAvailable(sessionStorage)) {\n this.storageSystem = sessionStorage;\n }\n }\n\n /** @inheritdoc */\n clearState(): void {\n this.storageSystem?.removeItem(this.persistanceKey);\n }\n\n /** @inheritdoc */\n persistState(contactInfo: DonorContactInfo, donationInfo: DonationPaymentInfo): void {\n const venmoRestoration = new VenmoRestorationState({\n contactInfo,\n donationInfo,\n });\n const serialized = JSON.stringify(venmoRestoration);\n this.storageSystem?.setItem(this.persistanceKey, serialized);\n }\n\n /** @inheritdoc */\n async getRestorationState(): Promise<VenmoRestorationState | undefined> {\n const stored = this.storageSystem?.getItem(this.persistanceKey);\n if (!stored) {\n console.error('restoreState: No stored data');\n return undefined;\n }\n\n const deserialized = JSON.parse(stored);\n if (!deserialized) {\n console.error('restoreState: Data could not be deserialized');\n return undefined;\n }\n\n const donationInfo = new VenmoRestorationState(deserialized);\n\n return donationInfo;\n }\n\n /**\n * Check if a particular storage system (localStorage/sessionStorage) is availble\n *\n * @private\n * @param {Storage} system\n * @returns {boolean}\n * @memberof VenmoRestorationStateHandler\n */\n private storageSystemAvailable(system: Storage): boolean {\n try {\n system.setItem('foo', 'bar');\n system.removeItem('foo');\n return true;\n } catch (exception) {\n return false;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"payment-flow-handlers.js","sourceRoot":"","sources":["../../../src/payment-flow-handlers/payment-flow-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ModalManagerInterface } from '@internetarchive/modal-manager';\r\n\r\nimport {\r\n CreditCardFlowHandlerInterface,\r\n CreditCardFlowHandler,\r\n} from './handlers/creditcard-flow-handler';\r\nimport { PayPalFlowHandlerInterface, PayPalFlowHandler } from './handlers/paypal-flow-handler';\r\nimport { BraintreeManagerInterface } from '../braintree-manager/braintree-interfaces';\r\nimport { RecaptchaManagerInterface } from '../recaptcha-manager/recaptcha-manager';\r\nimport {\r\n ApplePayFlowHandlerInterface,\r\n ApplePayFlowHandler,\r\n} from './handlers/applepay-flow-handler';\r\nimport { VenmoFlowHandlerInterface, VenmoFlowHandler } from './handlers/venmo-flow-handler';\r\nimport {\r\n DonationFlowModalManagerInterface,\r\n DonationFlowModalManager,\r\n} from './donation-flow-modal-manager';\r\nimport {\r\n GooglePayFlowHandlerInterface,\r\n GooglePayFlowHandler,\r\n} from './handlers/googlepay-flow-handler';\r\nimport { UpsellModalCTAMode } from '../modals/upsell-modal-content';\r\nimport { DonationType } from '@internetarchive/donation-form-data-models';\r\n\r\nexport interface PaymentFlowHandlersInterface {\r\n startup(): Promise<void>;\r\n /**\r\n * Show the upsell modal\r\n *\r\n * @param {{\r\n * ctaMode?: UpsellModalCTAMode;\r\n * yesSelected?: (amount: number) => void;\r\n * noSelected?: () => void;\r\n * amountChanged?: (amount: number) => void;\r\n * userClosedModalCallback?: () => void;\r\n * }} [options]\r\n * @returns {Promise<void>}\r\n * @memberof DonationFlowModalManagerInterface\r\n */\r\n showUpsellModal(options: {\r\n oneTimeAmount: number;\r\n ctaMode?: UpsellModalCTAMode;\r\n yesSelected?: (amount: number) => void;\r\n noSelected?: () => void;\r\n amountChanged?: (amount: number) => void;\r\n userClosedModalCallback?: () => void;\r\n }): Promise<void>;\r\n\r\n showConfirmationStepModal(options: {\r\n amount: number;\r\n donationType: DonationType;\r\n currencyType: string;\r\n confirmDonationCB: Function;\r\n cancelDonationCB: Function;\r\n }): Promise<void>;\r\n\r\n creditCardHandler: CreditCardFlowHandlerInterface | undefined;\r\n paypalHandler: PayPalFlowHandlerInterface | undefined;\r\n applePayHandler: ApplePayFlowHandlerInterface | undefined;\r\n venmoHandler: VenmoFlowHandlerInterface | undefined;\r\n googlePayHandler: GooglePayFlowHandlerInterface | undefined;\r\n}\r\n\r\n/**\r\n * This class is a container for all of the individual flow handlers.\r\n *\r\n * Flow Handlers are responsible for handling the provider-specific interactions between\r\n * the UI and the Data.\r\n *\r\n * For instance, when the user clicks on the \"Donate\" button for credit cards, we\r\n * pull in contact info from the form, trigger the recaptcha, tokenize the form,\r\n * submit, show the upsell, complete. The Credit Card Flow Handler is responsible for\r\n * managing that series of steps.\r\n *\r\n * For PayPal, the user initiates the payment from the PayPal button and once they're\r\n * done, we show the modal. The PayPal Flow Handler is responsible for handling that\r\n * series of events.\r\n *\r\n * @export\r\n * @class PaymentFlowHandlers\r\n * @implements {PaymentFlowHandlersInterface}\r\n */\r\nexport class PaymentFlowHandlers implements PaymentFlowHandlersInterface {\r\n async startup(): Promise<void> {\r\n this.venmoHandler?.startup();\r\n this.creditCardHandler?.startup();\r\n }\r\n\r\n /** @inheritdoc */\r\n async showUpsellModal(options: {\r\n oneTimeAmount: number;\r\n ctaMode?: UpsellModalCTAMode;\r\n yesSelected?: (amount: number) => void;\r\n noSelected?: () => void;\r\n amountChanged?: (amount: number) => void;\r\n userClosedModalCallback?: () => void;\r\n }): Promise<void> {\r\n return this.donationFlowModalManager.showUpsellModal(options);\r\n }\r\n\r\n /** @inheritdoc */\r\n showConfirmationStepModal(options: {\r\n amount: number;\r\n donationType: DonationType;\r\n currencyType: string;\r\n confirmDonationCB: Function;\r\n cancelDonationCB: Function;\r\n }): Promise<void> {\r\n return this.donationFlowModalManager.showConfirmationStepModal(options);\r\n }\r\n\r\n get creditCardHandler(): CreditCardFlowHandlerInterface | undefined {\r\n if (this.creditCardHandlerCache) {\r\n return this.creditCardHandlerCache;\r\n }\r\n\r\n this.creditCardHandlerCache = new CreditCardFlowHandler({\r\n braintreeManager: this.braintreeManager,\r\n donationFlowModalManager: this.donationFlowModalManager,\r\n recaptchaManager: this.recaptchaManager,\r\n });\r\n\r\n return this.creditCardHandlerCache;\r\n }\r\n\r\n get paypalHandler(): PayPalFlowHandlerInterface | undefined {\r\n if (this.paypalHandlerCache) {\r\n return this.paypalHandlerCache;\r\n }\r\n\r\n this.paypalHandlerCache = new PayPalFlowHandler({\r\n braintreeManager: this.braintreeManager,\r\n donationFlowModalManager: this.donationFlowModalManager,\r\n });\r\n\r\n return this.paypalHandlerCache;\r\n }\r\n\r\n get applePayHandler(): ApplePayFlowHandlerInterface | undefined {\r\n if (this.applePayHandlerCache) {\r\n return this.applePayHandlerCache;\r\n }\r\n\r\n this.applePayHandlerCache = new ApplePayFlowHandler({\r\n braintreeManager: this.braintreeManager,\r\n donationFlowModalManager: this.donationFlowModalManager,\r\n });\r\n\r\n return this.applePayHandlerCache;\r\n }\r\n\r\n get venmoHandler(): VenmoFlowHandlerInterface | undefined {\r\n if (this.venmoHandlerCache) {\r\n return this.venmoHandlerCache;\r\n }\r\n\r\n this.venmoHandlerCache = new VenmoFlowHandler({\r\n braintreeManager: this.braintreeManager,\r\n donationFlowModalManager: this.donationFlowModalManager,\r\n });\r\n\r\n return this.venmoHandlerCache;\r\n }\r\n\r\n get googlePayHandler(): GooglePayFlowHandlerInterface | undefined {\r\n if (this.googlePayHandlerCache) {\r\n return this.googlePayHandlerCache;\r\n }\r\n\r\n this.googlePayHandlerCache = new GooglePayFlowHandler({\r\n braintreeManager: this.braintreeManager,\r\n donationFlowModalManager: this.donationFlowModalManager,\r\n });\r\n\r\n return this.googlePayHandlerCache;\r\n }\r\n\r\n private creditCardHandlerCache?: CreditCardFlowHandlerInterface;\r\n private paypalHandlerCache?: PayPalFlowHandlerInterface;\r\n private applePayHandlerCache?: ApplePayFlowHandlerInterface;\r\n private venmoHandlerCache?: VenmoFlowHandlerInterface;\r\n private googlePayHandlerCache?: GooglePayFlowHandlerInterface;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n modalManager: ModalManagerInterface;\r\n recaptchaManager: RecaptchaManagerInterface;\r\n resources: {\r\n analytics: {\r\n logEvent: (action: string, label: string) => void;\r\n logDonationFlowEvent: (action: string, label: string) => void;\r\n };\r\n };\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.modalManager = options.modalManager;\r\n this.recaptchaManager = options.recaptchaManager;\r\n this.resources = options.resources;\r\n\r\n this.donationFlowModalManager = new DonationFlowModalManager({\r\n braintreeManager: this.braintreeManager,\r\n modalManager: this.modalManager,\r\n analytics: this.resources.analytics,\r\n });\r\n }\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n private modalManager: ModalManagerInterface;\r\n private recaptchaManager: RecaptchaManagerInterface;\r\n private donationFlowModalManager: DonationFlowModalManagerInterface;\r\n private resources: {\r\n analytics: {\r\n logEvent: (action: string, label: string) => void;\r\n logDonationFlowEvent: (action: string, label: string) => void;\r\n };\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"payment-flow-handlers.js","sourceRoot":"","sources":["../../../src/payment-flow-handlers/payment-flow-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ModalManagerInterface } from '@internetarchive/modal-manager';\n\nimport {\n CreditCardFlowHandlerInterface,\n CreditCardFlowHandler,\n} from './handlers/creditcard-flow-handler';\nimport { PayPalFlowHandlerInterface, PayPalFlowHandler } from './handlers/paypal-flow-handler';\nimport { BraintreeManagerInterface } from '../braintree-manager/braintree-interfaces';\nimport { RecaptchaManagerInterface } from '../recaptcha-manager/recaptcha-manager';\nimport {\n ApplePayFlowHandlerInterface,\n ApplePayFlowHandler,\n} from './handlers/applepay-flow-handler';\nimport { VenmoFlowHandlerInterface, VenmoFlowHandler } from './handlers/venmo-flow-handler';\nimport {\n DonationFlowModalManagerInterface,\n DonationFlowModalManager,\n} from './donation-flow-modal-manager';\nimport {\n GooglePayFlowHandlerInterface,\n GooglePayFlowHandler,\n} from './handlers/googlepay-flow-handler';\nimport { UpsellModalCTAMode } from '../modals/upsell-modal-content';\nimport { DonationType } from '@internetarchive/donation-form-data-models';\n\nexport interface PaymentFlowHandlersInterface {\n startup(): Promise<void>;\n /**\n * Show the upsell modal\n *\n * @param {{\n * ctaMode?: UpsellModalCTAMode;\n * yesSelected?: (amount: number) => void;\n * noSelected?: () => void;\n * amountChanged?: (amount: number) => void;\n * userClosedModalCallback?: () => void;\n * }} [options]\n * @returns {Promise<void>}\n * @memberof DonationFlowModalManagerInterface\n */\n showUpsellModal(options: {\n oneTimeAmount: number;\n ctaMode?: UpsellModalCTAMode;\n yesSelected?: (amount: number) => void;\n noSelected?: () => void;\n amountChanged?: (amount: number) => void;\n userClosedModalCallback?: () => void;\n }): Promise<void>;\n\n showConfirmationStepModal(options: {\n amount: number;\n donationType: DonationType;\n currencyType: string;\n confirmDonationCB: Function;\n cancelDonationCB: Function;\n }): Promise<void>;\n\n creditCardHandler: CreditCardFlowHandlerInterface | undefined;\n paypalHandler: PayPalFlowHandlerInterface | undefined;\n applePayHandler: ApplePayFlowHandlerInterface | undefined;\n venmoHandler: VenmoFlowHandlerInterface | undefined;\n googlePayHandler: GooglePayFlowHandlerInterface | undefined;\n}\n\n/**\n * This class is a container for all of the individual flow handlers.\n *\n * Flow Handlers are responsible for handling the provider-specific interactions between\n * the UI and the Data.\n *\n * For instance, when the user clicks on the \"Donate\" button for credit cards, we\n * pull in contact info from the form, trigger the recaptcha, tokenize the form,\n * submit, show the upsell, complete. The Credit Card Flow Handler is responsible for\n * managing that series of steps.\n *\n * For PayPal, the user initiates the payment from the PayPal button and once they're\n * done, we show the modal. The PayPal Flow Handler is responsible for handling that\n * series of events.\n *\n * @export\n * @class PaymentFlowHandlers\n * @implements {PaymentFlowHandlersInterface}\n */\nexport class PaymentFlowHandlers implements PaymentFlowHandlersInterface {\n async startup(): Promise<void> {\n this.venmoHandler?.startup();\n this.creditCardHandler?.startup();\n }\n\n /** @inheritdoc */\n async showUpsellModal(options: {\n oneTimeAmount: number;\n ctaMode?: UpsellModalCTAMode;\n yesSelected?: (amount: number) => void;\n noSelected?: () => void;\n amountChanged?: (amount: number) => void;\n userClosedModalCallback?: () => void;\n }): Promise<void> {\n return this.donationFlowModalManager.showUpsellModal(options);\n }\n\n /** @inheritdoc */\n showConfirmationStepModal(options: {\n amount: number;\n donationType: DonationType;\n currencyType: string;\n confirmDonationCB: Function;\n cancelDonationCB: Function;\n }): Promise<void> {\n return this.donationFlowModalManager.showConfirmationStepModal(options);\n }\n\n get creditCardHandler(): CreditCardFlowHandlerInterface | undefined {\n if (this.creditCardHandlerCache) {\n return this.creditCardHandlerCache;\n }\n\n this.creditCardHandlerCache = new CreditCardFlowHandler({\n braintreeManager: this.braintreeManager,\n donationFlowModalManager: this.donationFlowModalManager,\n recaptchaManager: this.recaptchaManager,\n });\n\n return this.creditCardHandlerCache;\n }\n\n get paypalHandler(): PayPalFlowHandlerInterface | undefined {\n if (this.paypalHandlerCache) {\n return this.paypalHandlerCache;\n }\n\n this.paypalHandlerCache = new PayPalFlowHandler({\n braintreeManager: this.braintreeManager,\n donationFlowModalManager: this.donationFlowModalManager,\n });\n\n return this.paypalHandlerCache;\n }\n\n get applePayHandler(): ApplePayFlowHandlerInterface | undefined {\n if (this.applePayHandlerCache) {\n return this.applePayHandlerCache;\n }\n\n this.applePayHandlerCache = new ApplePayFlowHandler({\n braintreeManager: this.braintreeManager,\n donationFlowModalManager: this.donationFlowModalManager,\n });\n\n return this.applePayHandlerCache;\n }\n\n get venmoHandler(): VenmoFlowHandlerInterface | undefined {\n if (this.venmoHandlerCache) {\n return this.venmoHandlerCache;\n }\n\n this.venmoHandlerCache = new VenmoFlowHandler({\n braintreeManager: this.braintreeManager,\n donationFlowModalManager: this.donationFlowModalManager,\n });\n\n return this.venmoHandlerCache;\n }\n\n get googlePayHandler(): GooglePayFlowHandlerInterface | undefined {\n if (this.googlePayHandlerCache) {\n return this.googlePayHandlerCache;\n }\n\n this.googlePayHandlerCache = new GooglePayFlowHandler({\n braintreeManager: this.braintreeManager,\n donationFlowModalManager: this.donationFlowModalManager,\n });\n\n return this.googlePayHandlerCache;\n }\n\n private creditCardHandlerCache?: CreditCardFlowHandlerInterface;\n private paypalHandlerCache?: PayPalFlowHandlerInterface;\n private applePayHandlerCache?: ApplePayFlowHandlerInterface;\n private venmoHandlerCache?: VenmoFlowHandlerInterface;\n private googlePayHandlerCache?: GooglePayFlowHandlerInterface;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n modalManager: ModalManagerInterface;\n recaptchaManager: RecaptchaManagerInterface;\n resources: {\n analytics: {\n logEvent: (action: string, label: string) => void;\n logDonationFlowEvent: (action: string, label: string) => void;\n };\n };\n }) {\n this.braintreeManager = options.braintreeManager;\n this.modalManager = options.modalManager;\n this.recaptchaManager = options.recaptchaManager;\n this.resources = options.resources;\n\n this.donationFlowModalManager = new DonationFlowModalManager({\n braintreeManager: this.braintreeManager,\n modalManager: this.modalManager,\n analytics: this.resources.analytics,\n });\n }\n\n private braintreeManager: BraintreeManagerInterface;\n private modalManager: ModalManagerInterface;\n private recaptchaManager: RecaptchaManagerInterface;\n private donationFlowModalManager: DonationFlowModalManagerInterface;\n private resources: {\n analytics: {\n logEvent: (action: string, label: string) => void;\n logDonationFlowEvent: (action: string, label: string) => void;\n };\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"recaptcha-manager.js","sourceRoot":"","sources":["../../../src/recaptcha-manager/recaptcha-manager.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,gBAAgB;IAK3B,YAAY,OAAsE;QAW1E,gBAAW,GAAG,KAAK,CAAC;QAV1B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAUD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAa,EAAQ,EAAE;gBACnD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YAEF,IAAI,CAAC,qBAAqB,GAAG,GAAS,EAAE;gBACtC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,CAAC;YACpB,CAAC,CAAC;YAEF,IAAI,CAAC,mBAAmB,GAAG,GAAS,EAAE;gBACpC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CACH,SAAsB,EACtB,QAAgB,EAChB,KAAwB,EACxB,IAAsB;QAEtB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE;YACvC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAClD,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IAED,8DAA8D;IACtD,eAAe,CAAC,QAAa;QACnC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACvC,CAAC;IACH,CAAC;CACF","sourcesContent":["export interface RecaptchaManagerInterface {\r\n execute(): Promise<string>;\r\n setup(\r\n container: HTMLElement,\r\n tabIndex: number,\r\n theme: ReCaptchaV2.Theme,\r\n type: ReCaptchaV2.Type,\r\n ): void;\r\n}\r\n\r\nexport class RecaptchaManager implements RecaptchaManagerInterface {\r\n private grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\r\n\r\n private siteKey: string;\r\n\r\n constructor(options: { grecaptchaLibrary: ReCaptchaV2.ReCaptcha; siteKey: string }) {\r\n this.grecaptchaLibrary = options.grecaptchaLibrary;\r\n this.siteKey = options.siteKey;\r\n }\r\n\r\n private executionSuccessBlock?: (token: string) => void;\r\n\r\n private executionExpiredBlock?: () => void;\r\n\r\n private executionErrorBlock?: () => void;\r\n\r\n private isExecuting = false;\r\n\r\n /**\r\n * Execute Recaptcha and return a Promise containing the response token.\r\n *\r\n * This is an interesting flow.. we call `execute()` here, but have to wait for the\r\n * response and expiration handlers that we bind during the inital `setup` call.\r\n * For consumers, we want to be able to just call `execute()` and wait for a response.\r\n * To allow this, we assign two callbacks:\r\n * - `executionSuccessBlock`\r\n * - `executionExpiredBlock`\r\n *\r\n * We then call those callbacks from inside `responseHandler` and `expiredHandler` to\r\n * either resolve or reject the Promise.\r\n *\r\n * ie:\r\n *\r\n * try {\r\n * const recaptchaResult = await recaptchaManager.execute();\r\n * console.log('recaptcha token:', recaptchaResult);\r\n * } catch {\r\n * console.error('something happened')\r\n * }\r\n *\r\n * @returns {Promise<string>}\r\n * @memberof RecaptchaManager\r\n */\r\n execute(): Promise<string> {\r\n if (this.isExecuting) {\r\n this.finishExecution();\r\n }\r\n this.isExecuting = true;\r\n return new Promise((resolve, reject) => {\r\n this.executionSuccessBlock = (token: string): void => {\r\n this.finishExecution();\r\n resolve(token);\r\n };\r\n\r\n this.executionExpiredBlock = (): void => {\r\n this.finishExecution();\r\n reject('expired');\r\n };\r\n\r\n this.executionErrorBlock = (): void => {\r\n this.finishExecution();\r\n reject('error');\r\n };\r\n\r\n this.grecaptchaLibrary.execute();\r\n });\r\n }\r\n\r\n private finishExecution(): void {\r\n this.isExecuting = false;\r\n this.grecaptchaLibrary.reset();\r\n }\r\n\r\n setup(\r\n container: HTMLElement,\r\n tabIndex: number,\r\n theme: ReCaptchaV2.Theme,\r\n type: ReCaptchaV2.Type,\r\n ): void {\r\n this.grecaptchaLibrary.render(container, {\r\n callback: this.responseHandler.bind(this),\r\n 'expired-callback': this.expiredHandler.bind(this),\r\n 'error-callback': this.errorHandler.bind(this),\r\n sitekey: this.siteKey,\r\n tabindex: tabIndex,\r\n theme: theme,\r\n type: type,\r\n size: 'invisible',\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private responseHandler(response: any): void {\r\n if (this.executionSuccessBlock) {\r\n this.executionSuccessBlock(response);\r\n this.executionSuccessBlock = undefined;\r\n }\r\n }\r\n\r\n private expiredHandler(): void {\r\n if (this.executionExpiredBlock) {\r\n this.executionExpiredBlock();\r\n this.executionExpiredBlock = undefined;\r\n }\r\n }\r\n\r\n private errorHandler(): void {\r\n if (this.executionErrorBlock) {\r\n this.executionErrorBlock();\r\n this.executionErrorBlock = undefined;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"recaptcha-manager.js","sourceRoot":"","sources":["../../../src/recaptcha-manager/recaptcha-manager.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,gBAAgB;IAK3B,YAAY,OAAsE;QAW1E,gBAAW,GAAG,KAAK,CAAC;QAV1B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAUD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAa,EAAQ,EAAE;gBACnD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YAEF,IAAI,CAAC,qBAAqB,GAAG,GAAS,EAAE;gBACtC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,CAAC;YACpB,CAAC,CAAC;YAEF,IAAI,CAAC,mBAAmB,GAAG,GAAS,EAAE;gBACpC,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CACH,SAAsB,EACtB,QAAgB,EAChB,KAAwB,EACxB,IAAsB;QAEtB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE;YACvC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAClD,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IAED,8DAA8D;IACtD,eAAe,CAAC,QAAa;QACnC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACvC,CAAC;IACH,CAAC;CACF","sourcesContent":["export interface RecaptchaManagerInterface {\n execute(): Promise<string>;\n setup(\n container: HTMLElement,\n tabIndex: number,\n theme: ReCaptchaV2.Theme,\n type: ReCaptchaV2.Type,\n ): void;\n}\n\nexport class RecaptchaManager implements RecaptchaManagerInterface {\n private grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\n\n private siteKey: string;\n\n constructor(options: { grecaptchaLibrary: ReCaptchaV2.ReCaptcha; siteKey: string }) {\n this.grecaptchaLibrary = options.grecaptchaLibrary;\n this.siteKey = options.siteKey;\n }\n\n private executionSuccessBlock?: (token: string) => void;\n\n private executionExpiredBlock?: () => void;\n\n private executionErrorBlock?: () => void;\n\n private isExecuting = false;\n\n /**\n * Execute Recaptcha and return a Promise containing the response token.\n *\n * This is an interesting flow.. we call `execute()` here, but have to wait for the\n * response and expiration handlers that we bind during the inital `setup` call.\n * For consumers, we want to be able to just call `execute()` and wait for a response.\n * To allow this, we assign two callbacks:\n * - `executionSuccessBlock`\n * - `executionExpiredBlock`\n *\n * We then call those callbacks from inside `responseHandler` and `expiredHandler` to\n * either resolve or reject the Promise.\n *\n * ie:\n *\n * try {\n * const recaptchaResult = await recaptchaManager.execute();\n * console.log('recaptcha token:', recaptchaResult);\n * } catch {\n * console.error('something happened')\n * }\n *\n * @returns {Promise<string>}\n * @memberof RecaptchaManager\n */\n execute(): Promise<string> {\n if (this.isExecuting) {\n this.finishExecution();\n }\n this.isExecuting = true;\n return new Promise((resolve, reject) => {\n this.executionSuccessBlock = (token: string): void => {\n this.finishExecution();\n resolve(token);\n };\n\n this.executionExpiredBlock = (): void => {\n this.finishExecution();\n reject('expired');\n };\n\n this.executionErrorBlock = (): void => {\n this.finishExecution();\n reject('error');\n };\n\n this.grecaptchaLibrary.execute();\n });\n }\n\n private finishExecution(): void {\n this.isExecuting = false;\n this.grecaptchaLibrary.reset();\n }\n\n setup(\n container: HTMLElement,\n tabIndex: number,\n theme: ReCaptchaV2.Theme,\n type: ReCaptchaV2.Type,\n ): void {\n this.grecaptchaLibrary.render(container, {\n callback: this.responseHandler.bind(this),\n 'expired-callback': this.expiredHandler.bind(this),\n 'error-callback': this.errorHandler.bind(this),\n sitekey: this.siteKey,\n tabindex: tabIndex,\n theme: theme,\n type: type,\n size: 'invisible',\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private responseHandler(response: any): void {\n if (this.executionSuccessBlock) {\n this.executionSuccessBlock(response);\n this.executionSuccessBlock = undefined;\n }\n }\n\n private expiredHandler(): void {\n if (this.executionExpiredBlock) {\n this.executionExpiredBlock();\n this.executionExpiredBlock = undefined;\n }\n }\n\n private errorHandler(): void {\n if (this.executionErrorBlock) {\n this.executionErrorBlock();\n this.executionErrorBlock = undefined;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"promisedSleep.js","sourceRoot":"","sources":["../../../src/util/promisedSleep.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC","sourcesContent":["export function promisedSleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n"]}
1
+ {"version":3,"file":"promisedSleep.js","sourceRoot":"","sources":["../../../src/util/promisedSleep.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC","sourcesContent":["export function promisedSleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fillInContactForm.js","sourceRoot":"","sources":["../../../test/helpers/fillInContactForm.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAgB,iBAAiB,CAAC,WAAwB;;QAC9D,WAAW,CAAC,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QAC7C,WAAW,CAAC,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC;QAC3C,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/C,WAAW,CAAC,kBAAkB,CAAC,KAAK,GAAG,aAAa,CAAC;QACrD,WAAW,CAAC,oBAAoB,CAAC,KAAK,GAAG,SAAS,CAAC;QACnD,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QACrC,WAAW,CAAC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC;QAE5C,4DAA4D;QAC5D,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,cAAc,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC;CAAA","sourcesContent":["import { ContactForm } from '../../src/form-elements/contact-form/contact-form';\r\nimport { elementUpdated } from '@open-wc/testing';\r\n\r\nexport async function fillInContactForm(contactForm: ContactForm): Promise<void> {\r\n contactForm.emailField.value = 'foo@bar.com';\r\n contactForm.firstNameField.value = 'Fooey';\r\n contactForm.lastNameField.value = 'McBarrison';\r\n contactForm.streetAddressField.value = '123 Fake St';\r\n contactForm.extendedAddressField.value = 'Apt 123';\r\n contactForm.localityField.value = 'SF';\r\n contactForm.regionField.value = 'CA';\r\n contactForm.postalCodeField.value = '12345';\r\n\r\n // setting the values above does not trigger any validations\r\n // you have to send an `input` Event like what would happen in the browser\r\n const inputEvent = new Event('input');\r\n contactForm.postalCodeField.dispatchEvent(inputEvent);\r\n\r\n await elementUpdated(contactForm.postalCodeField);\r\n}\r\n"]}
1
+ {"version":3,"file":"fillInContactForm.js","sourceRoot":"","sources":["../../../test/helpers/fillInContactForm.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAgB,iBAAiB,CAAC,WAAwB;;QAC9D,WAAW,CAAC,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;QAC7C,WAAW,CAAC,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC;QAC3C,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC;QAC/C,WAAW,CAAC,kBAAkB,CAAC,KAAK,GAAG,aAAa,CAAC;QACrD,WAAW,CAAC,oBAAoB,CAAC,KAAK,GAAG,SAAS,CAAC;QACnD,WAAW,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;QACrC,WAAW,CAAC,eAAe,CAAC,KAAK,GAAG,OAAO,CAAC;QAE5C,4DAA4D;QAC5D,0EAA0E;QAC1E,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAEtD,MAAM,cAAc,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC;CAAA","sourcesContent":["import { ContactForm } from '../../src/form-elements/contact-form/contact-form';\nimport { elementUpdated } from '@open-wc/testing';\n\nexport async function fillInContactForm(contactForm: ContactForm): Promise<void> {\n contactForm.emailField.value = 'foo@bar.com';\n contactForm.firstNameField.value = 'Fooey';\n contactForm.lastNameField.value = 'McBarrison';\n contactForm.streetAddressField.value = '123 Fake St';\n contactForm.extendedAddressField.value = 'Apt 123';\n contactForm.localityField.value = 'SF';\n contactForm.regionField.value = 'CA';\n contactForm.postalCodeField.value = '12345';\n\n // setting the values above does not trigger any validations\n // you have to send an `input` Event like what would happen in the browser\n const inputEvent = new Event('input');\n contactForm.postalCodeField.dispatchEvent(inputEvent);\n\n await elementUpdated(contactForm.postalCodeField);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-applepay-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.ts"],"names":[],"mappings":";AAGA,MAAM,OAAO,uBAAuB;IAI5B,gBAAgB,CAAC,YAAiC,EAAE,CAAQ;;YAChE,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;YACjD,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QACjC,CAAC;KAAA;CACF","sourcesContent":["import { ApplePayFlowHandlerInterface } from '../../../../src/payment-flow-handlers/handlers/applepay-flow-handler';\r\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\n\r\nexport class MockApplePayFlowHandler implements ApplePayFlowHandlerInterface {\r\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\r\n paymentInitiatedEvent?: Event;\r\n\r\n async paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void> {\r\n this.paymentInitiatedDonationInfo = donationInfo;\r\n this.paymentInitiatedEvent = e;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"mock-applepay-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.ts"],"names":[],"mappings":";AAGA,MAAM,OAAO,uBAAuB;IAI5B,gBAAgB,CAAC,YAAiC,EAAE,CAAQ;;YAChE,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;YACjD,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QACjC,CAAC;KAAA;CACF","sourcesContent":["import { ApplePayFlowHandlerInterface } from '../../../../src/payment-flow-handlers/handlers/applepay-flow-handler';\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\n\nexport class MockApplePayFlowHandler implements ApplePayFlowHandlerInterface {\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\n paymentInitiatedEvent?: Event;\n\n async paymentInitiated(donationInfo: DonationPaymentInfo, e: Event): Promise<void> {\n this.paymentInitiatedDonationInfo = donationInfo;\n this.paymentInitiatedEvent = e;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-creditcard-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAOpE,MAAM,OAAO,yBAAyB;IAAtC;QACE,kBAAa,GAAG,KAAK,CAAC;QAKd,YAAO,GACb,gBAAgB,EAA+B,CAAC;IA8BpD,CAAC;IA5BC,0BAA0B;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAEK,OAAO;;YACX,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;KAAA;IAEK,cAAc;;YAClB,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEK,gBAAgB,CACpB,oBAA2D,EAC3D,YAAiC,EACjC,gBAAkC;;YAElC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;YACjD,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;YACjD,IAAI,CAAC,gCAAgC,GAAG,gBAAgB,CAAC;QAC3D,CAAC;KAAA;IAED,EAAE,CACA,KAAQ,EACR,QAAwC;QAExC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { Emitter, createNanoEvents, Unsubscribe } from 'nanoevents';\r\nimport {\r\n CreditCardFlowHandlerInterface,\r\n CreditCardFlowHandlerEvents,\r\n} from '../../../../src/payment-flow-handlers/handlers/creditcard-flow-handler';\r\nimport { DonationPaymentInfo, DonorContactInfo } from '@internetarchive/donation-form-data-models';\r\n\r\nexport class MockCreditCardFlowHandler implements CreditCardFlowHandlerInterface {\r\n startupCalled = false;\r\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\r\n paymentInitiatedDonorContactInfo?: DonorContactInfo;\r\n hostedFieldsResponse?: braintree.HostedFieldsTokenizePayload;\r\n\r\n private emitter: Emitter<CreditCardFlowHandlerEvents> =\r\n createNanoEvents<CreditCardFlowHandlerEvents>();\r\n\r\n emitValidHostedFieldsEvent(): void {\r\n this.emitter.emit('validityChanged', true);\r\n }\r\n\r\n async startup(): Promise<void> {\r\n this.startupCalled = true;\r\n }\r\n\r\n async tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined> {\r\n return undefined;\r\n }\r\n\r\n async paymentInitiated(\r\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\r\n donationInfo: DonationPaymentInfo,\r\n donorContactInfo: DonorContactInfo,\r\n ): Promise<void> {\r\n this.hostedFieldsResponse = hostedFieldsResponse;\r\n this.paymentInitiatedDonationInfo = donationInfo;\r\n this.paymentInitiatedDonorContactInfo = donorContactInfo;\r\n }\r\n\r\n on<E extends keyof CreditCardFlowHandlerEvents>(\r\n event: E,\r\n callback: CreditCardFlowHandlerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"mock-creditcard-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAOpE,MAAM,OAAO,yBAAyB;IAAtC;QACE,kBAAa,GAAG,KAAK,CAAC;QAKd,YAAO,GACb,gBAAgB,EAA+B,CAAC;IA8BpD,CAAC;IA5BC,0BAA0B;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAEK,OAAO;;YACX,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;KAAA;IAEK,cAAc;;YAClB,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEK,gBAAgB,CACpB,oBAA2D,EAC3D,YAAiC,EACjC,gBAAkC;;YAElC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;YACjD,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;YACjD,IAAI,CAAC,gCAAgC,GAAG,gBAAgB,CAAC;QAC3D,CAAC;KAAA;IAED,EAAE,CACA,KAAQ,EACR,QAAwC;QAExC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { Emitter, createNanoEvents, Unsubscribe } from 'nanoevents';\nimport {\n CreditCardFlowHandlerInterface,\n CreditCardFlowHandlerEvents,\n} from '../../../../src/payment-flow-handlers/handlers/creditcard-flow-handler';\nimport { DonationPaymentInfo, DonorContactInfo } from '@internetarchive/donation-form-data-models';\n\nexport class MockCreditCardFlowHandler implements CreditCardFlowHandlerInterface {\n startupCalled = false;\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\n paymentInitiatedDonorContactInfo?: DonorContactInfo;\n hostedFieldsResponse?: braintree.HostedFieldsTokenizePayload;\n\n private emitter: Emitter<CreditCardFlowHandlerEvents> =\n createNanoEvents<CreditCardFlowHandlerEvents>();\n\n emitValidHostedFieldsEvent(): void {\n this.emitter.emit('validityChanged', true);\n }\n\n async startup(): Promise<void> {\n this.startupCalled = true;\n }\n\n async tokenizeFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined> {\n return undefined;\n }\n\n async paymentInitiated(\n hostedFieldsResponse: braintree.HostedFieldsTokenizePayload,\n donationInfo: DonationPaymentInfo,\n donorContactInfo: DonorContactInfo,\n ): Promise<void> {\n this.hostedFieldsResponse = hostedFieldsResponse;\n this.paymentInitiatedDonationInfo = donationInfo;\n this.paymentInitiatedDonorContactInfo = donorContactInfo;\n }\n\n on<E extends keyof CreditCardFlowHandlerEvents>(\n event: E,\n callback: CreditCardFlowHandlerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-googlepay-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.ts"],"names":[],"mappings":";AAKA,OAAO,EAAe,gBAAgB,EAAW,MAAM,YAAY,CAAC;AAEpE,MAAM,OAAO,wBAAwB;IAArC;QACU,YAAO,GACb,gBAAgB,EAA8B,CAAC;IAcnD,CAAC;IAZC,EAAE,CACA,KAAQ,EACR,QAAuC;QAEvC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAIK,gBAAgB,CAAC,YAAiC;;YACtD,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;QACnD,CAAC;KAAA;CACF","sourcesContent":["import {\r\n GooglePayFlowHandlerInterface,\r\n GooglePayFlowHandlerEvents,\r\n} from '../../../../src/payment-flow-handlers/handlers/googlepay-flow-handler';\r\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\nimport { Unsubscribe, createNanoEvents, Emitter } from 'nanoevents';\r\n\r\nexport class MockGooglePayFlowHandler implements GooglePayFlowHandlerInterface {\r\n private emitter: Emitter<GooglePayFlowHandlerEvents> =\r\n createNanoEvents<GooglePayFlowHandlerEvents>();\r\n\r\n on<E extends keyof GooglePayFlowHandlerEvents>(\r\n event: E,\r\n callback: GooglePayFlowHandlerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n\r\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\r\n\r\n async paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void> {\r\n this.paymentInitiatedDonationInfo = donationInfo;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"mock-googlepay-flow-handler.js","sourceRoot":"","sources":["../../../../../test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.ts"],"names":[],"mappings":";AAKA,OAAO,EAAe,gBAAgB,EAAW,MAAM,YAAY,CAAC;AAEpE,MAAM,OAAO,wBAAwB;IAArC;QACU,YAAO,GACb,gBAAgB,EAA8B,CAAC;IAcnD,CAAC;IAZC,EAAE,CACA,KAAQ,EACR,QAAuC;QAEvC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAIK,gBAAgB,CAAC,YAAiC;;YACtD,IAAI,CAAC,4BAA4B,GAAG,YAAY,CAAC;QACnD,CAAC;KAAA;CACF","sourcesContent":["import {\n GooglePayFlowHandlerInterface,\n GooglePayFlowHandlerEvents,\n} from '../../../../src/payment-flow-handlers/handlers/googlepay-flow-handler';\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\nimport { Unsubscribe, createNanoEvents, Emitter } from 'nanoevents';\n\nexport class MockGooglePayFlowHandler implements GooglePayFlowHandlerInterface {\n private emitter: Emitter<GooglePayFlowHandlerEvents> =\n createNanoEvents<GooglePayFlowHandlerEvents>();\n\n on<E extends keyof GooglePayFlowHandlerEvents>(\n event: E,\n callback: GooglePayFlowHandlerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n\n paymentInitiatedDonationInfo?: DonationPaymentInfo;\n\n async paymentInitiated(donationInfo: DonationPaymentInfo): Promise<void> {\n this.paymentInitiatedDonationInfo = donationInfo;\n }\n}\n"]}