@internetarchive/donation-form 0.5.18-alpha.1 → 0.5.18

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 (420) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +115 -115
  3. package/dist/demo/braintree-endpoint-manager.d.ts +9 -9
  4. package/dist/demo/braintree-endpoint-manager.js +45 -45
  5. package/dist/demo/braintree-endpoint-manager.js.map +1 -1
  6. package/dist/demo/demo-analytics-handler.d.ts +17 -17
  7. package/dist/demo/demo-analytics-handler.js +13 -13
  8. package/dist/demo/demo-analytics-handler.js.map +1 -1
  9. package/dist/demo/submit-form-with.d.ts +7 -7
  10. package/dist/demo/submit-form-with.js +21 -21
  11. package/dist/demo/submit-form-with.js.map +1 -1
  12. package/dist/index.d.ts +7 -7
  13. package/dist/index.js +7 -7
  14. package/dist/index.js.map +1 -1
  15. package/dist/src/braintree-manager/braintree-interfaces.d.ts +147 -147
  16. package/dist/src/braintree-manager/braintree-interfaces.js +5 -5
  17. package/dist/src/braintree-manager/braintree-interfaces.js.map +1 -1
  18. package/dist/src/braintree-manager/braintree-manager.d.ts +124 -124
  19. package/dist/src/braintree-manager/braintree-manager.js +149 -149
  20. package/dist/src/braintree-manager/braintree-manager.js.map +1 -1
  21. package/dist/src/braintree-manager/payment-clients.d.ts +47 -47
  22. package/dist/src/braintree-manager/payment-clients.js +116 -116
  23. package/dist/src/braintree-manager/payment-clients.js.map +1 -1
  24. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.d.ts +8 -8
  25. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.js.map +1 -1
  26. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.d.ts +6 -6
  27. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.js.map +1 -1
  28. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.d.ts +10 -10
  29. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.js.map +1 -1
  30. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.d.ts +21 -21
  31. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.js +99 -99
  32. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.js.map +1 -1
  33. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.d.ts +10 -10
  34. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.js +12 -12
  35. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.js.map +1 -1
  36. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay.d.ts +20 -20
  37. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay.js +71 -71
  38. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay.js.map +1 -1
  39. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card-interface.d.ts +16 -16
  40. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card-interface.js.map +1 -1
  41. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card.d.ts +29 -29
  42. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card.js +99 -99
  43. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card.js.map +1 -1
  44. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.d.ts +11 -11
  45. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.js +7 -7
  46. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.js.map +1 -1
  47. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-container.d.ts +34 -34
  48. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-container.js +52 -52
  49. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-container.js.map +1 -1
  50. package/dist/src/braintree-manager/payment-providers/google-pay-interface.d.ts +7 -7
  51. package/dist/src/braintree-manager/payment-providers/google-pay-interface.js.map +1 -1
  52. package/dist/src/braintree-manager/payment-providers/google-pay.d.ts +18 -18
  53. package/dist/src/braintree-manager/payment-providers/google-pay.js +40 -40
  54. package/dist/src/braintree-manager/payment-providers/google-pay.js.map +1 -1
  55. package/dist/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.d.ts +145 -145
  56. package/dist/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.js +60 -60
  57. package/dist/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.js.map +1 -1
  58. package/dist/src/braintree-manager/payment-providers/paypal/paypal-interface.d.ts +11 -11
  59. package/dist/src/braintree-manager/payment-providers/paypal/paypal-interface.js.map +1 -1
  60. package/dist/src/braintree-manager/payment-providers/paypal/paypal.d.ts +23 -23
  61. package/dist/src/braintree-manager/payment-providers/paypal/paypal.js +46 -46
  62. package/dist/src/braintree-manager/payment-providers/paypal/paypal.js.map +1 -1
  63. package/dist/src/braintree-manager/payment-providers/venmo-interface.d.ts +6 -6
  64. package/dist/src/braintree-manager/payment-providers/venmo-interface.js.map +1 -1
  65. package/dist/src/braintree-manager/payment-providers/venmo.d.ts +28 -28
  66. package/dist/src/braintree-manager/payment-providers/venmo.js +50 -50
  67. package/dist/src/braintree-manager/payment-providers/venmo.js.map +1 -1
  68. package/dist/src/braintree-manager/payment-providers-interface.d.ts +16 -16
  69. package/dist/src/braintree-manager/payment-providers-interface.js.map +1 -1
  70. package/dist/src/braintree-manager/payment-providers.d.ts +45 -45
  71. package/dist/src/braintree-manager/payment-providers.js +105 -105
  72. package/dist/src/braintree-manager/payment-providers.js.map +1 -1
  73. package/dist/src/donation-form-controller.d.ts +116 -116
  74. package/dist/src/donation-form-controller.js +562 -562
  75. package/dist/src/donation-form-controller.js.map +1 -1
  76. package/dist/src/donation-form-error.d.ts +3 -3
  77. package/dist/src/donation-form-error.js +6 -6
  78. package/dist/src/donation-form-error.js.map +1 -1
  79. package/dist/src/donation-form.d.ts +120 -120
  80. package/dist/src/donation-form.js +530 -530
  81. package/dist/src/donation-form.js.map +1 -1
  82. package/dist/src/form-elements/badged-input.d.ts +32 -32
  83. package/dist/src/form-elements/badged-input.js +124 -124
  84. package/dist/src/form-elements/badged-input.js.map +1 -1
  85. package/dist/src/form-elements/contact-form/autocomplete-field-options.d.ts +1 -1
  86. package/dist/src/form-elements/contact-form/autocomplete-field-options.js.map +1 -1
  87. package/dist/src/form-elements/contact-form/contact-form.d.ts +53 -53
  88. package/dist/src/form-elements/contact-form/contact-form.js +428 -428
  89. package/dist/src/form-elements/contact-form/contact-form.js.map +1 -1
  90. package/dist/src/form-elements/contact-form/countries.d.ts +3 -3
  91. package/dist/src/form-elements/contact-form/countries.js +252 -252
  92. package/dist/src/form-elements/contact-form/countries.js.map +1 -1
  93. package/dist/src/form-elements/header/donation-form-header.d.ts +27 -27
  94. package/dist/src/form-elements/header/donation-form-header.js +97 -97
  95. package/dist/src/form-elements/header/donation-form-header.js.map +1 -1
  96. package/dist/src/form-elements/header/donation-summary.d.ts +11 -11
  97. package/dist/src/form-elements/header/donation-summary.js +57 -57
  98. package/dist/src/form-elements/header/donation-summary.js.map +1 -1
  99. package/dist/src/form-elements/payment-selector.d.ts +25 -25
  100. package/dist/src/form-elements/payment-selector.js +286 -286
  101. package/dist/src/form-elements/payment-selector.js.map +1 -1
  102. package/dist/src/form-elements/total-amount.d.ts +8 -8
  103. package/dist/src/form-elements/total-amount.js +47 -47
  104. package/dist/src/form-elements/total-amount.js.map +1 -1
  105. package/dist/src/modals/confirm-donation-modal-content.d.ts +31 -31
  106. package/dist/src/modals/confirm-donation-modal-content.js +168 -168
  107. package/dist/src/modals/confirm-donation-modal-content.js.map +1 -1
  108. package/dist/src/modals/error-modal-content.d.ts +14 -14
  109. package/dist/src/modals/error-modal-content.js +49 -49
  110. package/dist/src/modals/error-modal-content.js.map +1 -1
  111. package/dist/src/modals/upsell-modal-content.d.ts +32 -32
  112. package/dist/src/modals/upsell-modal-content.js +294 -294
  113. package/dist/src/modals/upsell-modal-content.js.map +1 -1
  114. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.d.ts +181 -181
  115. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js +252 -252
  116. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js.map +1 -1
  117. package/dist/src/payment-flow-handlers/handlers/applepay-flow-handler.d.ts +21 -21
  118. package/dist/src/payment-flow-handlers/handlers/applepay-flow-handler.js +76 -76
  119. package/dist/src/payment-flow-handlers/handlers/applepay-flow-handler.js.map +1 -1
  120. package/dist/src/payment-flow-handlers/handlers/creditcard-flow-handler.d.ts +70 -70
  121. package/dist/src/payment-flow-handlers/handlers/creditcard-flow-handler.js +140 -140
  122. package/dist/src/payment-flow-handlers/handlers/creditcard-flow-handler.js.map +1 -1
  123. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.d.ts +22 -22
  124. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.js +74 -74
  125. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.js.map +1 -1
  126. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.d.ts +52 -52
  127. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.js +239 -239
  128. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.js.map +1 -1
  129. package/dist/src/payment-flow-handlers/handlers/venmo-flow-handler.d.ts +30 -30
  130. package/dist/src/payment-flow-handlers/handlers/venmo-flow-handler.js +89 -89
  131. package/dist/src/payment-flow-handlers/handlers/venmo-flow-handler.js.map +1 -1
  132. package/dist/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.d.ts +75 -75
  133. package/dist/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.js +94 -94
  134. package/dist/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.js.map +1 -1
  135. package/dist/src/payment-flow-handlers/payment-flow-handlers.d.ts +111 -111
  136. package/dist/src/payment-flow-handlers/payment-flow-handlers.js +107 -107
  137. package/dist/src/payment-flow-handlers/payment-flow-handlers.js.map +1 -1
  138. package/dist/src/recaptcha-manager/recaptcha-manager.d.ts +48 -48
  139. package/dist/src/recaptcha-manager/recaptcha-manager.js +88 -88
  140. package/dist/src/recaptcha-manager/recaptcha-manager.js.map +1 -1
  141. package/dist/src/util/promisedSleep.d.ts +1 -1
  142. package/dist/src/util/promisedSleep.js +3 -3
  143. package/dist/src/util/promisedSleep.js.map +1 -1
  144. package/dist/test/helpers/fillInContactForm.d.ts +2 -2
  145. package/dist/test/helpers/fillInContactForm.js +19 -19
  146. package/dist/test/helpers/fillInContactForm.js.map +1 -1
  147. package/dist/test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.d.ts +7 -7
  148. package/dist/test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.js +9 -9
  149. package/dist/test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.js.map +1 -1
  150. package/dist/test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.d.ts +15 -15
  151. package/dist/test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.js +32 -32
  152. package/dist/test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.js.map +1 -1
  153. package/dist/test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.d.ts +9 -9
  154. package/dist/test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.js +15 -15
  155. package/dist/test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.js.map +1 -1
  156. package/dist/test/mocks/flow-handlers/individual-handlers/mock-paypal-flow-handler.d.ts +15 -15
  157. package/dist/test/mocks/flow-handlers/individual-handlers/mock-paypal-flow-handler.js +30 -30
  158. package/dist/test/mocks/flow-handlers/individual-handlers/mock-paypal-flow-handler.js.map +1 -1
  159. package/dist/test/mocks/flow-handlers/individual-handlers/mock-venmo-flow-handler.d.ts +9 -9
  160. package/dist/test/mocks/flow-handlers/individual-handlers/mock-venmo-flow-handler.js +17 -17
  161. package/dist/test/mocks/flow-handlers/individual-handlers/mock-venmo-flow-handler.js.map +1 -1
  162. package/dist/test/mocks/flow-handlers/mock-payment-flow-handlers.d.ts +30 -30
  163. package/dist/test/mocks/flow-handlers/mock-payment-flow-handlers.js +29 -29
  164. package/dist/test/mocks/flow-handlers/mock-payment-flow-handlers.js.map +1 -1
  165. package/dist/test/mocks/mock-analytics-handler.d.ts +8 -0
  166. package/dist/test/mocks/mock-analytics-handler.js +10 -0
  167. package/dist/test/mocks/mock-analytics-handler.js.map +1 -0
  168. package/dist/test/mocks/mock-braintree-manager.d.ts +45 -45
  169. package/dist/test/mocks/mock-braintree-manager.js +71 -71
  170. package/dist/test/mocks/mock-braintree-manager.js.map +1 -1
  171. package/dist/test/mocks/mock-donation-info.d.ts +4 -4
  172. package/dist/test/mocks/mock-donation-info.js +10 -10
  173. package/dist/test/mocks/mock-donation-info.js.map +1 -1
  174. package/dist/test/mocks/mock-endpoint-manager.d.ts +12 -12
  175. package/dist/test/mocks/mock-endpoint-manager.js +19 -19
  176. package/dist/test/mocks/mock-endpoint-manager.js.map +1 -1
  177. package/dist/test/mocks/mock-hosted-fields-config.d.ts +4 -4
  178. package/dist/test/mocks/mock-hosted-fields-config.js +37 -37
  179. package/dist/test/mocks/mock-hosted-fields-config.js.map +1 -1
  180. package/dist/test/mocks/mock-hosted-fields-container.d.ts +13 -13
  181. package/dist/test/mocks/mock-hosted-fields-container.js +27 -27
  182. package/dist/test/mocks/mock-hosted-fields-container.js.map +1 -1
  183. package/dist/test/mocks/mock-lazy-loader.d.ts +15 -15
  184. package/dist/test/mocks/mock-lazy-loader.js +20 -20
  185. package/dist/test/mocks/mock-lazy-loader.js.map +1 -1
  186. package/dist/test/mocks/mock-modal-manager.d.ts +17 -17
  187. package/dist/test/mocks/mock-modal-manager.js +26 -26
  188. package/dist/test/mocks/mock-modal-manager.js.map +1 -1
  189. package/dist/test/mocks/mock-payment-clients.d.ts +29 -29
  190. package/dist/test/mocks/mock-payment-clients.js +78 -78
  191. package/dist/test/mocks/mock-payment-clients.js.map +1 -1
  192. package/dist/test/mocks/mock-paypal-button-renderer.d.ts +5 -5
  193. package/dist/test/mocks/mock-paypal-button-renderer.js +6 -6
  194. package/dist/test/mocks/mock-paypal-button-renderer.js.map +1 -1
  195. package/dist/test/mocks/mock-recaptcha-manager.d.ts +7 -7
  196. package/dist/test/mocks/mock-recaptcha-manager.js +14 -14
  197. package/dist/test/mocks/mock-recaptcha-manager.js.map +1 -1
  198. package/dist/test/mocks/models/mock-billing-info.d.ts +2 -2
  199. package/dist/test/mocks/models/mock-billing-info.js +9 -9
  200. package/dist/test/mocks/models/mock-billing-info.js.map +1 -1
  201. package/dist/test/mocks/models/mock-custom-fields.d.ts +2 -2
  202. package/dist/test/mocks/models/mock-custom-fields.js +7 -7
  203. package/dist/test/mocks/models/mock-custom-fields.js.map +1 -1
  204. package/dist/test/mocks/models/mock-customer-info.d.ts +2 -2
  205. package/dist/test/mocks/models/mock-customer-info.js +6 -6
  206. package/dist/test/mocks/models/mock-customer-info.js.map +1 -1
  207. package/dist/test/mocks/models/mock-donation-request.d.ts +2 -2
  208. package/dist/test/mocks/models/mock-donation-request.js +18 -18
  209. package/dist/test/mocks/models/mock-donation-request.js.map +1 -1
  210. package/dist/test/mocks/models/mock-success-response.d.ts +2 -2
  211. package/dist/test/mocks/models/mock-success-response.js +14 -14
  212. package/dist/test/mocks/models/mock-success-response.js.map +1 -1
  213. package/dist/test/mocks/payment-clients/mock-applepay-client.d.ts +21 -21
  214. package/dist/test/mocks/payment-clients/mock-applepay-client.js +72 -72
  215. package/dist/test/mocks/payment-clients/mock-applepay-client.js.map +1 -1
  216. package/dist/test/mocks/payment-clients/mock-applepay-payment.d.ts +6 -6
  217. package/dist/test/mocks/payment-clients/mock-applepay-payment.js +42 -42
  218. package/dist/test/mocks/payment-clients/mock-applepay-payment.js.map +1 -1
  219. package/dist/test/mocks/payment-clients/mock-applepay-paymentauthorizedevent.d.ts +22 -22
  220. package/dist/test/mocks/payment-clients/mock-applepay-paymentauthorizedevent.js +35 -35
  221. package/dist/test/mocks/payment-clients/mock-applepay-paymentauthorizedevent.js.map +1 -1
  222. package/dist/test/mocks/payment-clients/mock-applepay-session.d.ts +30 -30
  223. package/dist/test/mocks/payment-clients/mock-applepay-session.js +52 -52
  224. package/dist/test/mocks/payment-clients/mock-applepay-session.js.map +1 -1
  225. package/dist/test/mocks/payment-clients/mock-applepay-sessionmanager.d.ts +10 -10
  226. package/dist/test/mocks/payment-clients/mock-applepay-sessionmanager.js +12 -12
  227. package/dist/test/mocks/payment-clients/mock-applepay-sessionmanager.js.map +1 -1
  228. package/dist/test/mocks/payment-clients/mock-applepay-validatemerchantevent.d.ts +22 -22
  229. package/dist/test/mocks/payment-clients/mock-applepay-validatemerchantevent.js +34 -34
  230. package/dist/test/mocks/payment-clients/mock-applepay-validatemerchantevent.js.map +1 -1
  231. package/dist/test/mocks/payment-clients/mock-braintree-client.d.ts +14 -14
  232. package/dist/test/mocks/payment-clients/mock-braintree-client.js +19 -19
  233. package/dist/test/mocks/payment-clients/mock-braintree-client.js.map +1 -1
  234. package/dist/test/mocks/payment-clients/mock-data-collector.d.ts +11 -11
  235. package/dist/test/mocks/payment-clients/mock-data-collector.js +17 -17
  236. package/dist/test/mocks/payment-clients/mock-data-collector.js.map +1 -1
  237. package/dist/test/mocks/payment-clients/mock-googlepay-client.d.ts +22 -22
  238. package/dist/test/mocks/payment-clients/mock-googlepay-client.js +42 -42
  239. package/dist/test/mocks/payment-clients/mock-googlepay-client.js.map +1 -1
  240. package/dist/test/mocks/payment-clients/mock-googlepay-library.d.ts +10 -10
  241. package/dist/test/mocks/payment-clients/mock-googlepay-library.js +22 -22
  242. package/dist/test/mocks/payment-clients/mock-googlepay-library.js.map +1 -1
  243. package/dist/test/mocks/payment-clients/mock-grecaptcha.d.ts +23 -23
  244. package/dist/test/mocks/payment-clients/mock-grecaptcha.js +62 -62
  245. package/dist/test/mocks/payment-clients/mock-grecaptcha.js.map +1 -1
  246. package/dist/test/mocks/payment-clients/mock-hostedfields-client.d.ts +33 -33
  247. package/dist/test/mocks/payment-clients/mock-hostedfields-client.js +54 -54
  248. package/dist/test/mocks/payment-clients/mock-hostedfields-client.js.map +1 -1
  249. package/dist/test/mocks/payment-clients/mock-hostedfieldstateobject-generator.d.ts +1 -1
  250. package/dist/test/mocks/payment-clients/mock-hostedfieldstateobject-generator.js +50 -50
  251. package/dist/test/mocks/payment-clients/mock-hostedfieldstateobject-generator.js.map +1 -1
  252. package/dist/test/mocks/payment-clients/mock-hostedfieldtokenizepayload.d.ts +1 -1
  253. package/dist/test/mocks/payment-clients/mock-hostedfieldtokenizepayload.js +13 -13
  254. package/dist/test/mocks/payment-clients/mock-hostedfieldtokenizepayload.js.map +1 -1
  255. package/dist/test/mocks/payment-clients/mock-paypal-client.d.ts +23 -23
  256. package/dist/test/mocks/payment-clients/mock-paypal-client.js +62 -62
  257. package/dist/test/mocks/payment-clients/mock-paypal-client.js.map +1 -1
  258. package/dist/test/mocks/payment-clients/mock-paypal-library.d.ts +4 -4
  259. package/dist/test/mocks/payment-clients/mock-paypal-library.js +9 -9
  260. package/dist/test/mocks/payment-clients/mock-paypal-library.js.map +1 -1
  261. package/dist/test/mocks/payment-clients/mock-venmo-client.d.ts +22 -22
  262. package/dist/test/mocks/payment-clients/mock-venmo-client.js +36 -36
  263. package/dist/test/mocks/payment-clients/mock-venmo-client.js.map +1 -1
  264. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-datasource-delegate.d.ts +10 -10
  265. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-datasource-delegate.js +14 -14
  266. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-datasource-delegate.js.map +1 -1
  267. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-handler.d.ts +9 -9
  268. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-handler.js +19 -19
  269. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-handler.js.map +1 -1
  270. package/dist/test/mocks/payment-providers/individual-providers/mock-creditcard-handler.d.ts +18 -18
  271. package/dist/test/mocks/payment-providers/individual-providers/mock-creditcard-handler.js +41 -41
  272. package/dist/test/mocks/payment-providers/individual-providers/mock-creditcard-handler.js.map +1 -1
  273. package/dist/test/mocks/payment-providers/individual-providers/mock-googlepay-handler.d.ts +8 -8
  274. package/dist/test/mocks/payment-providers/individual-providers/mock-googlepay-handler.js +16 -16
  275. package/dist/test/mocks/payment-providers/individual-providers/mock-googlepay-handler.js.map +1 -1
  276. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource-delegate.d.ts +28 -28
  277. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource-delegate.js +52 -52
  278. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource-delegate.js.map +1 -1
  279. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource.d.ts +11 -11
  280. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource.js +37 -37
  281. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource.js.map +1 -1
  282. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-handler.d.ts +12 -12
  283. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-handler.js +15 -15
  284. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-handler.js.map +1 -1
  285. package/dist/test/mocks/payment-providers/individual-providers/mock-venmo-handler.d.ts +7 -7
  286. package/dist/test/mocks/payment-providers/individual-providers/mock-venmo-handler.js +22 -22
  287. package/dist/test/mocks/payment-providers/individual-providers/mock-venmo-handler.js.map +1 -1
  288. package/dist/test/mocks/payment-providers/mock-payment-providers.d.ts +21 -21
  289. package/dist/test/mocks/payment-providers/mock-payment-providers.js +45 -45
  290. package/dist/test/mocks/payment-providers/mock-payment-providers.js.map +1 -1
  291. package/dist/test/tests/braintree-manager.test.d.ts +1 -1
  292. package/dist/test/tests/braintree-manager.test.js +166 -166
  293. package/dist/test/tests/braintree-manager.test.js.map +1 -1
  294. package/dist/test/tests/donation-form-controller.test.d.ts +1 -1
  295. package/dist/test/tests/donation-form-controller.test.js +188 -188
  296. package/dist/test/tests/donation-form-controller.test.js.map +1 -1
  297. package/dist/test/tests/donation-form.test.d.ts +1 -1
  298. package/dist/test/tests/donation-form.test.js +109 -109
  299. package/dist/test/tests/donation-form.test.js.map +1 -1
  300. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.d.ts +1 -1
  301. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js +216 -216
  302. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js.map +1 -1
  303. package/dist/test/tests/form-elements/donation-summary.test.d.ts +1 -1
  304. package/dist/test/tests/form-elements/donation-summary.test.js +36 -36
  305. package/dist/test/tests/form-elements/donation-summary.test.js.map +1 -1
  306. package/dist/test/tests/form-elements/payment-selector.test.d.ts +1 -1
  307. package/dist/test/tests/form-elements/payment-selector.test.js +69 -69
  308. package/dist/test/tests/form-elements/payment-selector.test.js.map +1 -1
  309. package/dist/test/tests/modals/error-modal-content.test.d.ts +1 -1
  310. package/dist/test/tests/modals/error-modal-content.test.js +14 -14
  311. package/dist/test/tests/modals/error-modal-content.test.js.map +1 -1
  312. package/dist/test/tests/modals/upsell-modal-content.test.d.ts +1 -1
  313. package/dist/test/tests/modals/upsell-modal-content.test.js +163 -163
  314. package/dist/test/tests/modals/upsell-modal-content.test.js.map +1 -1
  315. package/dist/test/tests/models/donation-payment-info.test.d.ts +1 -1
  316. package/dist/test/tests/models/donation-payment-info.test.js +74 -74
  317. package/dist/test/tests/models/donation-payment-info.test.js.map +1 -1
  318. package/dist/test/tests/payment-clients.test.d.ts +1 -1
  319. package/dist/test/tests/payment-clients.test.js +130 -130
  320. package/dist/test/tests/payment-clients.test.js.map +1 -1
  321. package/dist/test/tests/payment-providers/applepay-sessiondatasource.test.d.ts +1 -1
  322. package/dist/test/tests/payment-providers/applepay-sessiondatasource.test.js +160 -160
  323. package/dist/test/tests/payment-providers/applepay-sessiondatasource.test.js.map +1 -1
  324. package/dist/test/tests/payment-providers/applepay-sessionmanager.test.d.ts +1 -1
  325. package/dist/test/tests/payment-providers/applepay-sessionmanager.test.js +36 -36
  326. package/dist/test/tests/payment-providers/applepay-sessionmanager.test.js.map +1 -1
  327. package/dist/test/tests/payment-providers/applepay.test.d.ts +1 -1
  328. package/dist/test/tests/payment-providers/applepay.test.js +78 -78
  329. package/dist/test/tests/payment-providers/applepay.test.js.map +1 -1
  330. package/dist/test/tests/payment-providers/creditcard.test.d.ts +1 -1
  331. package/dist/test/tests/payment-providers/creditcard.test.js +190 -190
  332. package/dist/test/tests/payment-providers/creditcard.test.js.map +1 -1
  333. package/dist/test/tests/payment-providers/googlepay.test.d.ts +1 -1
  334. package/dist/test/tests/payment-providers/googlepay.test.js +48 -48
  335. package/dist/test/tests/payment-providers/googlepay.test.js.map +1 -1
  336. package/dist/test/tests/payment-providers/payment-providers.test.d.ts +1 -1
  337. package/dist/test/tests/payment-providers/payment-providers.test.js +38 -38
  338. package/dist/test/tests/payment-providers/payment-providers.test.js.map +1 -1
  339. package/dist/test/tests/payment-providers/paypal-button-datasource.test.d.ts +1 -1
  340. package/dist/test/tests/payment-providers/paypal-button-datasource.test.js +162 -162
  341. package/dist/test/tests/payment-providers/paypal-button-datasource.test.js.map +1 -1
  342. package/dist/test/tests/payment-providers/paypal.test.d.ts +1 -1
  343. package/dist/test/tests/payment-providers/paypal.test.js +38 -38
  344. package/dist/test/tests/payment-providers/paypal.test.js.map +1 -1
  345. package/dist/test/tests/payment-providers/venmo.test.d.ts +1 -1
  346. package/dist/test/tests/payment-providers/venmo.test.js +77 -77
  347. package/dist/test/tests/payment-providers/venmo.test.js.map +1 -1
  348. package/dist/test/tests/recaptcha-manager.test.d.ts +1 -1
  349. package/dist/test/tests/recaptcha-manager.test.js +70 -70
  350. package/dist/test/tests/recaptcha-manager.test.js.map +1 -1
  351. package/package.json +101 -101
  352. package/src/@types/analytics-handler/index.d.ts +8 -8
  353. package/src/@types/braintree-web/LICENSE +21 -21
  354. package/src/@types/braintree-web/index.d.ts +93 -93
  355. package/src/@types/braintree-web/modules/american-express.d.ts +50 -50
  356. package/src/@types/braintree-web/modules/apple-pay.d.ts +213 -213
  357. package/src/@types/braintree-web/modules/client.d.ts +103 -103
  358. package/src/@types/braintree-web/modules/core.d.ts +34 -34
  359. package/src/@types/braintree-web/modules/data-collector.d.ts +13 -13
  360. package/src/@types/braintree-web/modules/google-payment.d.ts +269 -269
  361. package/src/@types/braintree-web/modules/hosted-fields.d.ts +366 -366
  362. package/src/@types/braintree-web/modules/paypal-checkout.d.ts +262 -262
  363. package/src/@types/braintree-web/modules/paypal.d.ts +177 -177
  364. package/src/@types/braintree-web/modules/three-d-secure.d.ts +141 -141
  365. package/src/@types/braintree-web/modules/unionpay.d.ts +224 -224
  366. package/src/@types/braintree-web/modules/us-bank-account.d.ts +81 -81
  367. package/src/@types/braintree-web/modules/venmo.d.ts +110 -110
  368. package/src/@types/braintree-web/package.json +64 -64
  369. package/src/@types/paypal-checkout-components/LICENSE +21 -21
  370. package/src/@types/paypal-checkout-components/index.d.ts +67 -67
  371. package/src/@types/paypal-checkout-components/modules/button.d.ts +50 -50
  372. package/src/@types/paypal-checkout-components/modules/callback-data.d.ts +244 -244
  373. package/src/@types/paypal-checkout-components/modules/configuration.d.ts +114 -114
  374. package/src/@types/paypal-checkout-components/package.json +58 -58
  375. package/src/braintree-manager/braintree-interfaces.ts +172 -172
  376. package/src/braintree-manager/braintree-manager.ts +283 -283
  377. package/src/braintree-manager/payment-clients.ts +148 -148
  378. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.ts +13 -13
  379. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.ts +8 -8
  380. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.ts +10 -10
  381. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.ts +119 -119
  382. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.ts +21 -21
  383. package/src/braintree-manager/payment-providers/apple-pay/apple-pay.ts +98 -98
  384. package/src/braintree-manager/payment-providers/credit-card/credit-card-interface.ts +21 -21
  385. package/src/braintree-manager/payment-providers/credit-card/credit-card.ts +130 -130
  386. package/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.ts +19 -19
  387. package/src/braintree-manager/payment-providers/credit-card/hosted-field-container.ts +85 -85
  388. package/src/braintree-manager/payment-providers/google-pay-interface.ts +8 -8
  389. package/src/braintree-manager/payment-providers/google-pay.ts +59 -59
  390. package/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.ts +218 -218
  391. package/src/braintree-manager/payment-providers/paypal/paypal-interface.ts +13 -13
  392. package/src/braintree-manager/payment-providers/paypal/paypal.ts +78 -78
  393. package/src/braintree-manager/payment-providers/venmo-interface.ts +8 -8
  394. package/src/braintree-manager/payment-providers/venmo.ts +67 -67
  395. package/src/braintree-manager/payment-providers-interface.ts +25 -25
  396. package/src/braintree-manager/payment-providers.ts +147 -147
  397. package/src/donation-form-controller.ts +619 -619
  398. package/src/donation-form-error.ts +6 -6
  399. package/src/donation-form.ts +566 -566
  400. package/src/form-elements/badged-input.ts +113 -113
  401. package/src/form-elements/contact-form/autocomplete-field-options.ts +63 -63
  402. package/src/form-elements/contact-form/contact-form.ts +427 -427
  403. package/src/form-elements/contact-form/countries.ts +252 -252
  404. package/src/form-elements/header/donation-form-header.ts +100 -100
  405. package/src/form-elements/header/donation-summary.ts +61 -61
  406. package/src/form-elements/payment-selector.ts +293 -293
  407. package/src/form-elements/total-amount.ts +46 -46
  408. package/src/modals/confirm-donation-modal-content.ts +160 -160
  409. package/src/modals/error-modal-content.ts +48 -48
  410. package/src/modals/upsell-modal-content.ts +294 -294
  411. package/src/payment-flow-handlers/donation-flow-modal-manager.ts +450 -450
  412. package/src/payment-flow-handlers/handlers/applepay-flow-handler.ts +108 -108
  413. package/src/payment-flow-handlers/handlers/creditcard-flow-handler.ts +231 -231
  414. package/src/payment-flow-handlers/handlers/googlepay-flow-handler.ts +113 -113
  415. package/src/payment-flow-handlers/handlers/paypal-flow-handler.ts +332 -332
  416. package/src/payment-flow-handlers/handlers/venmo-flow-handler.ts +118 -118
  417. package/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.ts +127 -127
  418. package/src/payment-flow-handlers/payment-flow-handlers.ts +218 -218
  419. package/src/recaptcha-manager/recaptcha-manager.ts +123 -123
  420. package/src/util/promisedSleep.ts +3 -3
@@ -1,427 +1,427 @@
1
- import { LitElement, html, css, TemplateResult } from 'lit';
2
- import { customElement, property, query } from 'lit/decorators.js';
3
- import { ifDefined } from 'lit/directives/if-defined.js';
4
-
5
- import {
6
- BillingInfo,
7
- CustomerInfo,
8
- DonorContactInfo,
9
- } from '@internetarchive/donation-form-data-models';
10
- import { AutoCompleteFieldOptions } from './autocomplete-field-options';
11
- import { SpacerOption } from '../badged-input';
12
- import { BadgedInput } from '../badged-input';
13
- import '../badged-input';
14
-
15
- import emailImg from '@internetarchive/icon-email';
16
- import localePinImg from '@internetarchive/icon-locale-pin';
17
- import userIcon from '@internetarchive/icon-user';
18
-
19
- import { countries } from './countries';
20
-
21
- @customElement('contact-form')
22
- export class ContactForm extends LitElement {
23
- @query('badged-input.donation-contact-form-email') emailBadgedInput!: BadgedInput;
24
- @query('#donation-contact-form-email') emailField!: HTMLInputElement;
25
-
26
- @query('badged-input.donation-contact-form-first-name') firstNameBadgedInput!: BadgedInput;
27
- @query('#donation-contact-form-first-name') firstNameField!: HTMLInputElement;
28
-
29
- @query('badged-input.donation-contact-form-last-name') lastNameBadgedInput!: BadgedInput;
30
- @query('#donation-contact-form-last-name') lastNameField!: HTMLInputElement;
31
-
32
- @query('badged-input.donation-contact-form-postal-code') postalBadgedInput!: BadgedInput;
33
- @query('#donation-contact-form-postal-code') postalCodeField!: HTMLInputElement;
34
-
35
- @query('badged-input.donation-contact-form-street-address')
36
- streetAddressBadgedInput!: BadgedInput;
37
- @query('#donation-contact-form-street-address') streetAddressField!: HTMLInputElement;
38
-
39
- @query('badged-input.donation-contact-form-extended-address')
40
- extendedAddressBadgedInput!: BadgedInput;
41
- @query('#donation-contact-form-extended-address') extendedAddressField!: HTMLInputElement;
42
-
43
- @query('badged-input.donation-contact-form-locality') localityBadgedInput!: BadgedInput;
44
- @query('#donation-contact-form-locality') localityField!: HTMLInputElement;
45
-
46
- @query('badged-input.donation-contact-form-region') regionBadgedInput!: BadgedInput;
47
- @query('#donation-contact-form-region') regionField!: HTMLInputElement;
48
-
49
- @query('#donation-contact-form-countryCodeAlpha2') countryCodeAlpha2Field!: HTMLSelectElement;
50
-
51
- @query('#donation-contact-form-error-message') errorMessage!: HTMLDivElement;
52
- @query('form') form!: HTMLFormElement;
53
-
54
- /** @keyof countries */
55
- @property({ type: String }) selectedCountry = 'US';
56
-
57
- reportValidity(): boolean {
58
- const fieldBadgedInputs: Array<[HTMLInputElement, BadgedInput]> = [
59
- [this.emailField, this.emailBadgedInput],
60
- [this.firstNameField, this.firstNameBadgedInput],
61
- [this.lastNameField, this.lastNameBadgedInput],
62
- [this.regionField, this.regionBadgedInput],
63
- [this.localityField, this.localityBadgedInput],
64
- [this.streetAddressField, this.streetAddressBadgedInput],
65
- [this.postalCodeField, this.postalBadgedInput],
66
- ];
67
-
68
- let isValid = true;
69
- fieldBadgedInputs.forEach(([inputElement, badgedInput]) => {
70
- const fieldValid = inputElement.checkValidity();
71
- isValid = isValid && fieldValid;
72
- if (!fieldValid) {
73
- badgedInput.error = true;
74
- }
75
- });
76
-
77
- if (!isValid) {
78
- this.errorMessage.innerText = 'Please enter any missing contact information below';
79
- } else {
80
- this.errorMessage.innerText = '';
81
- }
82
-
83
- return isValid;
84
- }
85
-
86
- focus(): void {
87
- this.emailField.focus();
88
- }
89
-
90
- /** @inheritdoc */
91
- render(): TemplateResult {
92
- return html`
93
- <div id="donation-contact-form-error-message"></div>
94
- <form>
95
- <fieldset>
96
- <div class="row">
97
- ${this.generateInput({
98
- id: 'donation-contact-form-email',
99
- placeholder: 'Email',
100
- required: true,
101
- fieldType: 'email',
102
- name: 'email',
103
- autocomplete: 'email',
104
- maxlength: 255,
105
- icon: emailImg,
106
- })}
107
- </div>
108
- </fieldset>
109
-
110
- <fieldset>
111
- <div class="row">
112
- ${this.generateInput({
113
- id: 'donation-contact-form-first-name',
114
- placeholder: 'First name',
115
- name: 'fname',
116
- required: true,
117
- maxlength: 255,
118
- autocomplete: 'given-name',
119
- icon: userIcon,
120
- })}
121
- </div>
122
- <div class="row">
123
- ${this.generateInput({
124
- id: 'donation-contact-form-last-name',
125
- placeholder: 'Last name',
126
- name: 'lname',
127
- autocomplete: 'family-name',
128
- required: true,
129
- maxlength: 255,
130
- })}
131
- </div>
132
- </fieldset>
133
- <fieldset>
134
- <div class="row">
135
- ${this.generateInput({
136
- id: 'donation-contact-form-street-address',
137
- placeholder: 'Address Line 1',
138
- required: true,
139
- autocomplete: 'address-line1',
140
- icon: localePinImg,
141
- name: 'street-address',
142
- })}
143
- </div>
144
- <div class="row">
145
- ${this.generateInput({
146
- id: 'donation-contact-form-extended-address',
147
- placeholder: 'Address Line 2 (optional)',
148
- autocomplete: 'address-line2',
149
- required: false,
150
- name: 'extended-address',
151
- })}
152
- </div>
153
- <div class="row">
154
- ${this.generateInput({
155
- id: 'donation-contact-form-locality',
156
- placeholder: 'City',
157
- autocomplete: 'address-level2',
158
- required: true,
159
- name: 'locality',
160
- })}
161
- </div>
162
- <div class="row">
163
- ${this.generateInput({
164
- id: 'donation-contact-form-region',
165
- placeholder: 'State / Province',
166
- autocomplete: 'address-level1',
167
- required: true,
168
- name: 'region',
169
- })}
170
- ${this.generateInput({
171
- id: 'donation-contact-form-postal-code',
172
- placeholder: 'Zip / Postal',
173
- autocomplete: 'postal-code',
174
- required: true,
175
- name: 'postal',
176
- maxlength: 9,
177
- // must start with a character, then may contain spaces
178
- validationPattern: '[a-zA-Z\\-\\d]+[a-zA-Z\\-\\d\\s]*',
179
- iconSpaceOption: SpacerOption.CompressSpace,
180
- })}
181
- </div>
182
- <div class="row">
183
- ${this.countrySelectorTemplate}
184
- </div>
185
- </fieldset>
186
- </form>
187
- ${this.getStyles}
188
- `;
189
- }
190
-
191
- private get countrySelectorTemplate(): TemplateResult {
192
- return html`
193
- <badged-input>
194
- <select id="donation-contact-form-countryCodeAlpha2"
195
- @change=${(e: Event) => {
196
- const currCountry = this.selectedCountry;
197
- this.selectedCountry = (e.target as HTMLInputElement)?.value ? (e.target as HTMLInputElement)?.value as string : currCountry;
198
- // update required visual cue on region/state/province & postal code fields
199
- if (this.selectedCountry === 'US') {
200
- this.postalBadgedInput?.setAttribute('required', '');
201
- this.postalCodeField?.setAttribute('required', '');
202
- this.regionBadgedInput?.setAttribute('required', '');
203
- this.regionField?.setAttribute('required', '');
204
- } else {
205
- this.postalBadgedInput?.removeAttribute('required');
206
- this.postalCodeField?.removeAttribute('required');
207
- this.regionBadgedInput?.removeAttribute('required');
208
- this.regionField?.removeAttribute('required');
209
- }
210
- }}>
211
- ${Object.keys(countries).map(key => {
212
- const name = countries[key];
213
- return html`
214
- <option value=${key} ?selected=${key === this.selectedCountry}>${name}</option>
215
- `;
216
- })}
217
- </select>
218
- </badged-input>
219
- `;
220
- }
221
-
222
- /** @inheritdoc */
223
- createRenderRoot(): this {
224
- // Render template without shadow DOM. Note that shadow DOM features like
225
- // encapsulated CSS and slots are unavailable.
226
- // Form autofill does not work properly in the shadow DOM
227
- // so we need our form fields in the light DOM
228
- return this;
229
- }
230
-
231
- // reset the error state when the user focuses the input
232
- private inputFocused(e: KeyboardEvent): void {
233
- this.errorMessage.innerText = '';
234
- const input = e.target as HTMLInputElement;
235
- const inputIdentifier = input.id;
236
- const badgedInput = this.querySelector(`badged-input.${inputIdentifier}`) as BadgedInput;
237
- badgedInput.error = false;
238
- }
239
-
240
- private generateInput(options: {
241
- id: string;
242
- placeholder: string;
243
- required?: boolean;
244
- fieldType?: 'text' | 'email';
245
- autocomplete?: AutoCompleteFieldOptions;
246
- maxlength?: number;
247
- name: string;
248
- icon?: TemplateResult;
249
- iconSpaceOption?: SpacerOption;
250
- validationPattern?: string;
251
- }): TemplateResult {
252
- const required = options.required ?? true;
253
- const fieldType = options.fieldType ?? 'text';
254
- const iconOption = options.iconSpaceOption ?? SpacerOption.LeaveSpace;
255
-
256
- return html`
257
- <badged-input
258
- class=${options.id}
259
- .icon=${options.icon}
260
- .iconSpaceOption=${iconOption}
261
- ?required=${options.required}
262
- >
263
- <label for=${options.id}>${options.placeholder}</label>
264
- <input
265
- type=${fieldType}
266
- id=${options.id}
267
- class="donation-contact-form-input"
268
- name=${options.name}
269
- aria-label=${options.placeholder}
270
- placeholder=${options.placeholder}
271
- maxlength=${ifDefined(options.maxlength)}
272
- autocomplete=${options.autocomplete ?? 'on'}
273
- pattern=${ifDefined(options.validationPattern)}
274
- @focus=${this.inputFocused}
275
- ?required=${required}
276
- />
277
- </badged-input>
278
- `;
279
- }
280
-
281
- get donorContactInfo(): DonorContactInfo {
282
- return new DonorContactInfo({
283
- billing: this.billingInfo,
284
- customer: this.contactInfo,
285
- });
286
- }
287
-
288
- get billingInfo(): BillingInfo {
289
- const billingInfo = new BillingInfo({
290
- streetAddress: this.streetAddressField.value,
291
- extendedAddress: this.extendedAddressField.value,
292
- locality: this.localityField.value,
293
- region: this.regionField.value,
294
- postalCode: this.postalCodeField.value,
295
- countryCodeAlpha2: this.countryCodeAlpha2Field.value,
296
- });
297
- return billingInfo;
298
- }
299
-
300
- get contactInfo(): CustomerInfo {
301
- return new CustomerInfo({
302
- email: this.emailField.value,
303
- firstName: this.firstNameField.value,
304
- lastName: this.lastNameField.value,
305
- });
306
- }
307
-
308
- /**
309
- * This is not the normal LitElement styles block.
310
- *
311
- * This element uses the clear DOM instead of the shadow DOM so it can't use
312
- * the shadowRoot's isolated styling. This is a bit of a workaround to keep all of
313
- * the styling local by writing out our own <style> tag and just be careful about
314
- * the selectors since they will leak outside of this component.
315
- *
316
- * @readonly
317
- * @private
318
- * @type {TemplateResult}
319
- * @memberof ContactForm
320
- */
321
- private get getStyles(): TemplateResult {
322
- const noIconSpacerWidth = css`var(--badgedInputNoIconSpacerWidth, 3rem)`;
323
- const iconSpacerWidth = css`var(--badgedInputIconSpacerWidth, 5rem)`;
324
-
325
- const fieldSetSpacing = css`var(--fieldSetSpacing, 1rem)`;
326
- const fieldFontFamily = css`var(--fontFamily, "Helvetica Neue", Helvetica, Arial, sans-serif)`;
327
- const fieldFontSize = css`var(--contactFieldFontSize, 1.6rem)`;
328
- const fieldFontColor = css`var(--inputFieldFontColor, #333)`;
329
-
330
- const iconFieldWidth = css`calc(100% - ${iconSpacerWidth})`;
331
- const noIconFieldWidth = css`calc(100% - ${noIconSpacerWidth})`;
332
-
333
- return html`
334
- <style>
335
- /*
336
- **NOTE**
337
- This element is in the lightDOM so be sure to prefix all styles
338
- with "contact-form" so styles don't leak.
339
- */
340
- contact-form fieldset {
341
- border: 0;
342
- padding: 0;
343
- margin: 0;
344
- margin-bottom: ${fieldSetSpacing};
345
- background-color: white;
346
- }
347
-
348
- /* These 1px and 0 margins in the next few selectors are to account for the
349
- double outlines caused by the fields being right next to each other */
350
- contact-form .row {
351
- display: flex;
352
- margin: -1px 0 0 0;
353
- }
354
-
355
- contact-form fieldset .row:first-child {
356
- margin-top: 0;
357
- }
358
-
359
- contact-form badged-input.donation-contact-form-region {
360
- width: 60%;
361
- }
362
-
363
- contact-form badged-input.donation-contact-form-postal-code {
364
- width: 40%;
365
- }
366
-
367
- contact-form #donation-contact-form-region {
368
- width: ${iconFieldWidth};
369
- }
370
-
371
- contact-form #donation-contact-form-postal-code {
372
- width: ${noIconFieldWidth};
373
- }
374
-
375
- contact-form #donation-contact-form-error-message {
376
- color: red;
377
- font-size: 1.4rem;
378
- margin-bottom: 0.6rem;
379
- }
380
-
381
- contact-form #donation-contact-form-last-name {
382
- width: ${noIconFieldWidth};
383
- }
384
-
385
- /* only show for screen readers */
386
- contact-form label {
387
- position: absolute;
388
- left: -10000px;
389
- top: auto;
390
- width: 1px;
391
- height: 1px;
392
- overflow: hidden;
393
- }
394
-
395
- contact-form .donation-contact-form-input {
396
- width: ${iconFieldWidth};
397
- border: 0;
398
- outline: 0;
399
- background: transparent;
400
- font-weight: bold;
401
- color: ${fieldFontColor};
402
- font-size: ${fieldFontSize};
403
- padding: 0;
404
- font-family: ${fieldFontFamily};
405
- }
406
-
407
- contact-form .donation-contact-form-input::placeholder {
408
- color: revert;
409
- }
410
-
411
- contact-form #donation-contact-form-countryCodeAlpha2 {
412
- width: ${iconFieldWidth};
413
- height: 100%;
414
- box-sizing: border-box;
415
- font-weight: bold;
416
- font-size: ${fieldFontSize};
417
- font-family: ${fieldFontFamily};
418
- border: 0;
419
- background: #fff;
420
- -webkit-appearance: none;
421
- -moz-appearance: none;
422
- appearance: none;
423
- }
424
- </style>
425
- `;
426
- }
427
- }
1
+ import { LitElement, html, css, TemplateResult } from 'lit';
2
+ import { customElement, property, query } from 'lit/decorators.js';
3
+ import { ifDefined } from 'lit/directives/if-defined.js';
4
+
5
+ import {
6
+ BillingInfo,
7
+ CustomerInfo,
8
+ DonorContactInfo,
9
+ } from '@internetarchive/donation-form-data-models';
10
+ import { AutoCompleteFieldOptions } from './autocomplete-field-options';
11
+ import { SpacerOption } from '../badged-input';
12
+ import { BadgedInput } from '../badged-input';
13
+ import '../badged-input';
14
+
15
+ import emailImg from '@internetarchive/icon-email';
16
+ import localePinImg from '@internetarchive/icon-locale-pin';
17
+ import userIcon from '@internetarchive/icon-user';
18
+
19
+ import { countries } from './countries';
20
+
21
+ @customElement('contact-form')
22
+ export class ContactForm extends LitElement {
23
+ @query('badged-input.donation-contact-form-email') emailBadgedInput!: BadgedInput;
24
+ @query('#donation-contact-form-email') emailField!: HTMLInputElement;
25
+
26
+ @query('badged-input.donation-contact-form-first-name') firstNameBadgedInput!: BadgedInput;
27
+ @query('#donation-contact-form-first-name') firstNameField!: HTMLInputElement;
28
+
29
+ @query('badged-input.donation-contact-form-last-name') lastNameBadgedInput!: BadgedInput;
30
+ @query('#donation-contact-form-last-name') lastNameField!: HTMLInputElement;
31
+
32
+ @query('badged-input.donation-contact-form-postal-code') postalBadgedInput!: BadgedInput;
33
+ @query('#donation-contact-form-postal-code') postalCodeField!: HTMLInputElement;
34
+
35
+ @query('badged-input.donation-contact-form-street-address')
36
+ streetAddressBadgedInput!: BadgedInput;
37
+ @query('#donation-contact-form-street-address') streetAddressField!: HTMLInputElement;
38
+
39
+ @query('badged-input.donation-contact-form-extended-address')
40
+ extendedAddressBadgedInput!: BadgedInput;
41
+ @query('#donation-contact-form-extended-address') extendedAddressField!: HTMLInputElement;
42
+
43
+ @query('badged-input.donation-contact-form-locality') localityBadgedInput!: BadgedInput;
44
+ @query('#donation-contact-form-locality') localityField!: HTMLInputElement;
45
+
46
+ @query('badged-input.donation-contact-form-region') regionBadgedInput!: BadgedInput;
47
+ @query('#donation-contact-form-region') regionField!: HTMLInputElement;
48
+
49
+ @query('#donation-contact-form-countryCodeAlpha2') countryCodeAlpha2Field!: HTMLSelectElement;
50
+
51
+ @query('#donation-contact-form-error-message') errorMessage!: HTMLDivElement;
52
+ @query('form') form!: HTMLFormElement;
53
+
54
+ /** @keyof countries */
55
+ @property({ type: String }) selectedCountry = 'US';
56
+
57
+ reportValidity(): boolean {
58
+ const fieldBadgedInputs: Array<[HTMLInputElement, BadgedInput]> = [
59
+ [this.emailField, this.emailBadgedInput],
60
+ [this.firstNameField, this.firstNameBadgedInput],
61
+ [this.lastNameField, this.lastNameBadgedInput],
62
+ [this.regionField, this.regionBadgedInput],
63
+ [this.localityField, this.localityBadgedInput],
64
+ [this.streetAddressField, this.streetAddressBadgedInput],
65
+ [this.postalCodeField, this.postalBadgedInput],
66
+ ];
67
+
68
+ let isValid = true;
69
+ fieldBadgedInputs.forEach(([inputElement, badgedInput]) => {
70
+ const fieldValid = inputElement.checkValidity();
71
+ isValid = isValid && fieldValid;
72
+ if (!fieldValid) {
73
+ badgedInput.error = true;
74
+ }
75
+ });
76
+
77
+ if (!isValid) {
78
+ this.errorMessage.innerText = 'Please enter any missing contact information below';
79
+ } else {
80
+ this.errorMessage.innerText = '';
81
+ }
82
+
83
+ return isValid;
84
+ }
85
+
86
+ focus(): void {
87
+ this.emailField.focus();
88
+ }
89
+
90
+ /** @inheritdoc */
91
+ render(): TemplateResult {
92
+ return html`
93
+ <div id="donation-contact-form-error-message"></div>
94
+ <form>
95
+ <fieldset>
96
+ <div class="row">
97
+ ${this.generateInput({
98
+ id: 'donation-contact-form-email',
99
+ placeholder: 'Email',
100
+ required: true,
101
+ fieldType: 'email',
102
+ name: 'email',
103
+ autocomplete: 'email',
104
+ maxlength: 255,
105
+ icon: emailImg,
106
+ })}
107
+ </div>
108
+ </fieldset>
109
+
110
+ <fieldset>
111
+ <div class="row">
112
+ ${this.generateInput({
113
+ id: 'donation-contact-form-first-name',
114
+ placeholder: 'First name',
115
+ name: 'fname',
116
+ required: true,
117
+ maxlength: 255,
118
+ autocomplete: 'given-name',
119
+ icon: userIcon,
120
+ })}
121
+ </div>
122
+ <div class="row">
123
+ ${this.generateInput({
124
+ id: 'donation-contact-form-last-name',
125
+ placeholder: 'Last name',
126
+ name: 'lname',
127
+ autocomplete: 'family-name',
128
+ required: true,
129
+ maxlength: 255,
130
+ })}
131
+ </div>
132
+ </fieldset>
133
+ <fieldset>
134
+ <div class="row">
135
+ ${this.generateInput({
136
+ id: 'donation-contact-form-street-address',
137
+ placeholder: 'Address Line 1',
138
+ required: true,
139
+ autocomplete: 'address-line1',
140
+ icon: localePinImg,
141
+ name: 'street-address',
142
+ })}
143
+ </div>
144
+ <div class="row">
145
+ ${this.generateInput({
146
+ id: 'donation-contact-form-extended-address',
147
+ placeholder: 'Address Line 2 (optional)',
148
+ autocomplete: 'address-line2',
149
+ required: false,
150
+ name: 'extended-address',
151
+ })}
152
+ </div>
153
+ <div class="row">
154
+ ${this.generateInput({
155
+ id: 'donation-contact-form-locality',
156
+ placeholder: 'City',
157
+ autocomplete: 'address-level2',
158
+ required: true,
159
+ name: 'locality',
160
+ })}
161
+ </div>
162
+ <div class="row">
163
+ ${this.generateInput({
164
+ id: 'donation-contact-form-region',
165
+ placeholder: 'State / Province',
166
+ autocomplete: 'address-level1',
167
+ required: true,
168
+ name: 'region',
169
+ })}
170
+ ${this.generateInput({
171
+ id: 'donation-contact-form-postal-code',
172
+ placeholder: 'Zip / Postal',
173
+ autocomplete: 'postal-code',
174
+ required: true,
175
+ name: 'postal',
176
+ maxlength: 9,
177
+ // must start with a character, then may contain spaces
178
+ validationPattern: '[a-zA-Z\\-\\d]+[a-zA-Z\\-\\d\\s]*',
179
+ iconSpaceOption: SpacerOption.CompressSpace,
180
+ })}
181
+ </div>
182
+ <div class="row">
183
+ ${this.countrySelectorTemplate}
184
+ </div>
185
+ </fieldset>
186
+ </form>
187
+ ${this.getStyles}
188
+ `;
189
+ }
190
+
191
+ private get countrySelectorTemplate(): TemplateResult {
192
+ return html`
193
+ <badged-input>
194
+ <select id="donation-contact-form-countryCodeAlpha2"
195
+ @change=${(e: Event) => {
196
+ const currCountry = this.selectedCountry;
197
+ this.selectedCountry = (e.target as HTMLInputElement)?.value ? (e.target as HTMLInputElement)?.value as string : currCountry;
198
+ // update required visual cue on region/state/province & postal code fields
199
+ if (this.selectedCountry === 'US') {
200
+ this.postalBadgedInput?.setAttribute('required', '');
201
+ this.postalCodeField?.setAttribute('required', '');
202
+ this.regionBadgedInput?.setAttribute('required', '');
203
+ this.regionField?.setAttribute('required', '');
204
+ } else {
205
+ this.postalBadgedInput?.removeAttribute('required');
206
+ this.postalCodeField?.removeAttribute('required');
207
+ this.regionBadgedInput?.removeAttribute('required');
208
+ this.regionField?.removeAttribute('required');
209
+ }
210
+ }}>
211
+ ${Object.keys(countries).map(key => {
212
+ const name = countries[key];
213
+ return html`
214
+ <option value=${key} ?selected=${key === this.selectedCountry}>${name}</option>
215
+ `;
216
+ })}
217
+ </select>
218
+ </badged-input>
219
+ `;
220
+ }
221
+
222
+ /** @inheritdoc */
223
+ createRenderRoot(): this {
224
+ // Render template without shadow DOM. Note that shadow DOM features like
225
+ // encapsulated CSS and slots are unavailable.
226
+ // Form autofill does not work properly in the shadow DOM
227
+ // so we need our form fields in the light DOM
228
+ return this;
229
+ }
230
+
231
+ // reset the error state when the user focuses the input
232
+ private inputFocused(e: KeyboardEvent): void {
233
+ this.errorMessage.innerText = '';
234
+ const input = e.target as HTMLInputElement;
235
+ const inputIdentifier = input.id;
236
+ const badgedInput = this.querySelector(`badged-input.${inputIdentifier}`) as BadgedInput;
237
+ badgedInput.error = false;
238
+ }
239
+
240
+ private generateInput(options: {
241
+ id: string;
242
+ placeholder: string;
243
+ required?: boolean;
244
+ fieldType?: 'text' | 'email';
245
+ autocomplete?: AutoCompleteFieldOptions;
246
+ maxlength?: number;
247
+ name: string;
248
+ icon?: TemplateResult;
249
+ iconSpaceOption?: SpacerOption;
250
+ validationPattern?: string;
251
+ }): TemplateResult {
252
+ const required = options.required ?? true;
253
+ const fieldType = options.fieldType ?? 'text';
254
+ const iconOption = options.iconSpaceOption ?? SpacerOption.LeaveSpace;
255
+
256
+ return html`
257
+ <badged-input
258
+ class=${options.id}
259
+ .icon=${options.icon}
260
+ .iconSpaceOption=${iconOption}
261
+ ?required=${options.required}
262
+ >
263
+ <label for=${options.id}>${options.placeholder}</label>
264
+ <input
265
+ type=${fieldType}
266
+ id=${options.id}
267
+ class="donation-contact-form-input"
268
+ name=${options.name}
269
+ aria-label=${options.placeholder}
270
+ placeholder=${options.placeholder}
271
+ maxlength=${ifDefined(options.maxlength)}
272
+ autocomplete=${options.autocomplete ?? 'on'}
273
+ pattern=${ifDefined(options.validationPattern)}
274
+ @focus=${this.inputFocused}
275
+ ?required=${required}
276
+ />
277
+ </badged-input>
278
+ `;
279
+ }
280
+
281
+ get donorContactInfo(): DonorContactInfo {
282
+ return new DonorContactInfo({
283
+ billing: this.billingInfo,
284
+ customer: this.contactInfo,
285
+ });
286
+ }
287
+
288
+ get billingInfo(): BillingInfo {
289
+ const billingInfo = new BillingInfo({
290
+ streetAddress: this.streetAddressField.value,
291
+ extendedAddress: this.extendedAddressField.value,
292
+ locality: this.localityField.value,
293
+ region: this.regionField.value,
294
+ postalCode: this.postalCodeField.value,
295
+ countryCodeAlpha2: this.countryCodeAlpha2Field.value,
296
+ });
297
+ return billingInfo;
298
+ }
299
+
300
+ get contactInfo(): CustomerInfo {
301
+ return new CustomerInfo({
302
+ email: this.emailField.value,
303
+ firstName: this.firstNameField.value,
304
+ lastName: this.lastNameField.value,
305
+ });
306
+ }
307
+
308
+ /**
309
+ * This is not the normal LitElement styles block.
310
+ *
311
+ * This element uses the clear DOM instead of the shadow DOM so it can't use
312
+ * the shadowRoot's isolated styling. This is a bit of a workaround to keep all of
313
+ * the styling local by writing out our own <style> tag and just be careful about
314
+ * the selectors since they will leak outside of this component.
315
+ *
316
+ * @readonly
317
+ * @private
318
+ * @type {TemplateResult}
319
+ * @memberof ContactForm
320
+ */
321
+ private get getStyles(): TemplateResult {
322
+ const noIconSpacerWidth = css`var(--badgedInputNoIconSpacerWidth, 3rem)`;
323
+ const iconSpacerWidth = css`var(--badgedInputIconSpacerWidth, 5rem)`;
324
+
325
+ const fieldSetSpacing = css`var(--fieldSetSpacing, 1rem)`;
326
+ const fieldFontFamily = css`var(--fontFamily, "Helvetica Neue", Helvetica, Arial, sans-serif)`;
327
+ const fieldFontSize = css`var(--contactFieldFontSize, 1.6rem)`;
328
+ const fieldFontColor = css`var(--inputFieldFontColor, #333)`;
329
+
330
+ const iconFieldWidth = css`calc(100% - ${iconSpacerWidth})`;
331
+ const noIconFieldWidth = css`calc(100% - ${noIconSpacerWidth})`;
332
+
333
+ return html`
334
+ <style>
335
+ /*
336
+ **NOTE**
337
+ This element is in the lightDOM so be sure to prefix all styles
338
+ with "contact-form" so styles don't leak.
339
+ */
340
+ contact-form fieldset {
341
+ border: 0;
342
+ padding: 0;
343
+ margin: 0;
344
+ margin-bottom: ${fieldSetSpacing};
345
+ background-color: white;
346
+ }
347
+
348
+ /* These 1px and 0 margins in the next few selectors are to account for the
349
+ double outlines caused by the fields being right next to each other */
350
+ contact-form .row {
351
+ display: flex;
352
+ margin: -1px 0 0 0;
353
+ }
354
+
355
+ contact-form fieldset .row:first-child {
356
+ margin-top: 0;
357
+ }
358
+
359
+ contact-form badged-input.donation-contact-form-region {
360
+ width: 60%;
361
+ }
362
+
363
+ contact-form badged-input.donation-contact-form-postal-code {
364
+ width: 40%;
365
+ }
366
+
367
+ contact-form #donation-contact-form-region {
368
+ width: ${iconFieldWidth};
369
+ }
370
+
371
+ contact-form #donation-contact-form-postal-code {
372
+ width: ${noIconFieldWidth};
373
+ }
374
+
375
+ contact-form #donation-contact-form-error-message {
376
+ color: red;
377
+ font-size: 1.4rem;
378
+ margin-bottom: 0.6rem;
379
+ }
380
+
381
+ contact-form #donation-contact-form-last-name {
382
+ width: ${noIconFieldWidth};
383
+ }
384
+
385
+ /* only show for screen readers */
386
+ contact-form label {
387
+ position: absolute;
388
+ left: -10000px;
389
+ top: auto;
390
+ width: 1px;
391
+ height: 1px;
392
+ overflow: hidden;
393
+ }
394
+
395
+ contact-form .donation-contact-form-input {
396
+ width: ${iconFieldWidth};
397
+ border: 0;
398
+ outline: 0;
399
+ background: transparent;
400
+ font-weight: bold;
401
+ color: ${fieldFontColor};
402
+ font-size: ${fieldFontSize};
403
+ padding: 0;
404
+ font-family: ${fieldFontFamily};
405
+ }
406
+
407
+ contact-form .donation-contact-form-input::placeholder {
408
+ color: revert;
409
+ }
410
+
411
+ contact-form #donation-contact-form-countryCodeAlpha2 {
412
+ width: ${iconFieldWidth};
413
+ height: 100%;
414
+ box-sizing: border-box;
415
+ font-weight: bold;
416
+ font-size: ${fieldFontSize};
417
+ font-family: ${fieldFontFamily};
418
+ border: 0;
419
+ background: #fff;
420
+ -webkit-appearance: none;
421
+ -moz-appearance: none;
422
+ appearance: none;
423
+ }
424
+ </style>
425
+ `;
426
+ }
427
+ }