@stripe/stripe-react-native 0.21.0 → 0.22.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 (359) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/android/build.gradle +1 -0
  3. package/android/proguard-rules.txt +7 -0
  4. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +4 -0
  5. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonManager.kt +5 -0
  6. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +46 -8
  7. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherFragment.kt +132 -0
  8. package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +144 -0
  9. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +123 -8
  10. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +5 -0
  11. package/android/src/main/res/drawable/book_with_googlepay_button_content.xml +14 -0
  12. package/android/src/main/res/drawable/buy_with_googlepay_button_content.xml +14 -0
  13. package/android/src/main/res/drawable/checkout_with_googlepay_button_content.xml +14 -0
  14. package/android/src/main/res/drawable/donate_with_googlepay_button_content.xml +14 -0
  15. package/android/src/main/res/drawable/googlepay_button_background_shape.xml +11 -0
  16. package/android/src/main/res/drawable/googlepay_mark_background.xml +12 -0
  17. package/android/src/main/res/drawable/googlepay_mark_content.xml +27 -0
  18. package/android/src/main/res/drawable/order_with_googlepay_button_content.xml +14 -0
  19. package/android/src/main/res/drawable/pay_with_googlepay_button_content.xml +6 -6
  20. package/android/src/main/res/drawable/subscribe_with_googlepay_button_content.xml +14 -0
  21. package/android/src/main/res/drawable-ar/book_with_googlepay_button_content.xml +14 -0
  22. package/android/src/main/res/drawable-ar/buy_with_googlepay_button_content.xml +14 -0
  23. package/android/src/main/res/drawable-ar/checkout_with_googlepay_button_content.xml +14 -0
  24. package/android/src/main/res/drawable-ar/donate_with_googlepay_button_content.xml +14 -0
  25. package/android/src/main/res/drawable-ar/order_with_googlepay_button_content.xml +14 -0
  26. package/android/src/main/res/drawable-ar/pay_with_googlepay_button_content.xml +6 -6
  27. package/android/src/main/res/drawable-ar/subscribe_with_googlepay_button_content.xml +14 -0
  28. package/android/src/main/res/drawable-bg/book_with_googlepay_button_content.xml +14 -0
  29. package/android/src/main/res/drawable-bg/buy_with_googlepay_button_content.xml +14 -0
  30. package/android/src/main/res/drawable-bg/checkout_with_googlepay_button_content.xml +14 -0
  31. package/android/src/main/res/drawable-bg/donate_with_googlepay_button_content.xml +14 -0
  32. package/android/src/main/res/drawable-bg/order_with_googlepay_button_content.xml +14 -0
  33. package/android/src/main/res/drawable-bg/pay_with_googlepay_button_content.xml +4 -4
  34. package/android/src/main/res/drawable-bg/subscribe_with_googlepay_button_content.xml +14 -0
  35. package/android/src/main/res/drawable-ca/book_with_googlepay_button_content.xml +14 -0
  36. package/android/src/main/res/drawable-ca/buy_with_googlepay_button_content.xml +14 -0
  37. package/android/src/main/res/drawable-ca/checkout_with_googlepay_button_content.xml +14 -0
  38. package/android/src/main/res/drawable-ca/donate_with_googlepay_button_content.xml +14 -0
  39. package/android/src/main/res/drawable-ca/order_with_googlepay_button_content.xml +14 -0
  40. package/android/src/main/res/drawable-ca/pay_with_googlepay_button_content.xml +6 -6
  41. package/android/src/main/res/drawable-ca/subscribe_with_googlepay_button_content.xml +14 -0
  42. package/android/src/main/res/drawable-cs/book_with_googlepay_button_content.xml +14 -0
  43. package/android/src/main/res/drawable-cs/buy_with_googlepay_button_content.xml +14 -0
  44. package/android/src/main/res/drawable-cs/checkout_with_googlepay_button_content.xml +14 -0
  45. package/android/src/main/res/drawable-cs/donate_with_googlepay_button_content.xml +14 -0
  46. package/android/src/main/res/drawable-cs/order_with_googlepay_button_content.xml +14 -0
  47. package/android/src/main/res/drawable-cs/pay_with_googlepay_button_content.xml +6 -6
  48. package/android/src/main/res/drawable-cs/subscribe_with_googlepay_button_content.xml +14 -0
  49. package/android/src/main/res/drawable-da/book_with_googlepay_button_content.xml +14 -0
  50. package/android/src/main/res/drawable-da/buy_with_googlepay_button_content.xml +14 -0
  51. package/android/src/main/res/drawable-da/checkout_with_googlepay_button_content.xml +14 -0
  52. package/android/src/main/res/drawable-da/donate_with_googlepay_button_content.xml +14 -0
  53. package/android/src/main/res/drawable-da/order_with_googlepay_button_content.xml +14 -0
  54. package/android/src/main/res/drawable-da/pay_with_googlepay_button_content.xml +6 -6
  55. package/android/src/main/res/drawable-da/subscribe_with_googlepay_button_content.xml +14 -0
  56. package/android/src/main/res/drawable-de/book_with_googlepay_button_content.xml +15 -0
  57. package/android/src/main/res/drawable-de/buy_with_googlepay_button_content.xml +15 -0
  58. package/android/src/main/res/drawable-de/checkout_with_googlepay_button_content.xml +15 -0
  59. package/android/src/main/res/drawable-de/donate_with_googlepay_button_content.xml +15 -0
  60. package/android/src/main/res/drawable-de/order_with_googlepay_button_content.xml +15 -0
  61. package/android/src/main/res/drawable-de/pay_with_googlepay_button_content.xml +7 -7
  62. package/android/src/main/res/drawable-de/subscribe_with_googlepay_button_content.xml +15 -0
  63. package/android/src/main/res/drawable-el/book_with_googlepay_button_content.xml +14 -0
  64. package/android/src/main/res/drawable-el/buy_with_googlepay_button_content.xml +14 -0
  65. package/android/src/main/res/drawable-el/checkout_with_googlepay_button_content.xml +14 -0
  66. package/android/src/main/res/drawable-el/donate_with_googlepay_button_content.xml +14 -0
  67. package/android/src/main/res/drawable-el/order_with_googlepay_button_content.xml +14 -0
  68. package/android/src/main/res/drawable-el/pay_with_googlepay_button_content.xml +4 -4
  69. package/android/src/main/res/drawable-el/subscribe_with_googlepay_button_content.xml +14 -0
  70. package/android/src/main/res/drawable-et/book_with_googlepay_button_content.xml +15 -0
  71. package/android/src/main/res/drawable-et/buy_with_googlepay_button_content.xml +15 -0
  72. package/android/src/main/res/drawable-et/checkout_with_googlepay_button_content.xml +15 -0
  73. package/android/src/main/res/drawable-et/donate_with_googlepay_button_content.xml +15 -0
  74. package/android/src/main/res/drawable-et/order_with_googlepay_button_content.xml +15 -0
  75. package/android/src/main/res/drawable-et/pay_with_googlepay_button_content.xml +8 -8
  76. package/android/src/main/res/drawable-et/subscribe_with_googlepay_button_content.xml +15 -0
  77. package/android/src/main/res/drawable-fi/book_with_googlepay_button_content.xml +15 -0
  78. package/android/src/main/res/drawable-fi/buy_with_googlepay_button_content.xml +15 -0
  79. package/android/src/main/res/drawable-fi/checkout_with_googlepay_button_content.xml +15 -0
  80. package/android/src/main/res/drawable-fi/donate_with_googlepay_button_content.xml +15 -0
  81. package/android/src/main/res/drawable-fi/order_with_googlepay_button_content.xml +15 -0
  82. package/android/src/main/res/drawable-fi/pay_with_googlepay_button_content.xml +8 -8
  83. package/android/src/main/res/drawable-fi/subscribe_with_googlepay_button_content.xml +15 -0
  84. package/android/src/main/res/drawable-fr/book_with_googlepay_button_content.xml +14 -0
  85. package/android/src/main/res/drawable-fr/buy_with_googlepay_button_content.xml +14 -0
  86. package/android/src/main/res/drawable-fr/checkout_with_googlepay_button_content.xml +14 -0
  87. package/android/src/main/res/drawable-fr/donate_with_googlepay_button_content.xml +14 -0
  88. package/android/src/main/res/drawable-fr/order_with_googlepay_button_content.xml +14 -0
  89. package/android/src/main/res/drawable-fr/pay_with_googlepay_button_content.xml +5 -5
  90. package/android/src/main/res/drawable-fr/subscribe_with_googlepay_button_content.xml +14 -0
  91. package/android/src/main/res/drawable-hr/book_with_googlepay_button_content.xml +14 -0
  92. package/android/src/main/res/drawable-hr/buy_with_googlepay_button_content.xml +14 -0
  93. package/android/src/main/res/drawable-hr/checkout_with_googlepay_button_content.xml +14 -0
  94. package/android/src/main/res/drawable-hr/donate_with_googlepay_button_content.xml +14 -0
  95. package/android/src/main/res/drawable-hr/order_with_googlepay_button_content.xml +14 -0
  96. package/android/src/main/res/drawable-hr/pay_with_googlepay_button_content.xml +4 -4
  97. package/android/src/main/res/drawable-hr/subscribe_with_googlepay_button_content.xml +14 -0
  98. package/android/src/main/res/drawable-id/book_with_googlepay_button_content.xml +14 -0
  99. package/android/src/main/res/drawable-id/buy_with_googlepay_button_content.xml +14 -0
  100. package/android/src/main/res/drawable-id/checkout_with_googlepay_button_content.xml +14 -0
  101. package/android/src/main/res/drawable-id/donate_with_googlepay_button_content.xml +14 -0
  102. package/android/src/main/res/drawable-id/order_with_googlepay_button_content.xml +14 -0
  103. package/android/src/main/res/drawable-id/pay_with_googlepay_button_content.xml +4 -4
  104. package/android/src/main/res/drawable-id/subscribe_with_googlepay_button_content.xml +14 -0
  105. package/android/src/main/res/drawable-it/book_with_googlepay_button_content.xml +14 -0
  106. package/android/src/main/res/drawable-it/buy_with_googlepay_button_content.xml +14 -0
  107. package/android/src/main/res/drawable-it/checkout_with_googlepay_button_content.xml +14 -0
  108. package/android/src/main/res/drawable-it/donate_with_googlepay_button_content.xml +14 -0
  109. package/android/src/main/res/drawable-it/order_with_googlepay_button_content.xml +14 -0
  110. package/android/src/main/res/drawable-it/pay_with_googlepay_button_content.xml +6 -6
  111. package/android/src/main/res/drawable-it/subscribe_with_googlepay_button_content.xml +14 -0
  112. package/android/src/main/res/drawable-ja/book_with_googlepay_button_content.xml +14 -0
  113. package/android/src/main/res/drawable-ja/buy_with_googlepay_button_content.xml +14 -0
  114. package/android/src/main/res/drawable-ja/checkout_with_googlepay_button_content.xml +14 -0
  115. package/android/src/main/res/drawable-ja/donate_with_googlepay_button_content.xml +14 -0
  116. package/android/src/main/res/drawable-ja/order_with_googlepay_button_content.xml +14 -0
  117. package/android/src/main/res/drawable-ja/pay_with_googlepay_button_content.xml +5 -5
  118. package/android/src/main/res/drawable-ja/subscribe_with_googlepay_button_content.xml +14 -0
  119. package/android/src/main/res/drawable-ko/book_with_googlepay_button_content.xml +14 -0
  120. package/android/src/main/res/drawable-ko/buy_with_googlepay_button_content.xml +14 -0
  121. package/android/src/main/res/drawable-ko/checkout_with_googlepay_button_content.xml +14 -0
  122. package/android/src/main/res/drawable-ko/donate_with_googlepay_button_content.xml +14 -0
  123. package/android/src/main/res/drawable-ko/order_with_googlepay_button_content.xml +14 -0
  124. package/android/src/main/res/drawable-ko/pay_with_googlepay_button_content.xml +7 -7
  125. package/android/src/main/res/drawable-ko/subscribe_with_googlepay_button_content.xml +14 -0
  126. package/android/src/main/res/drawable-ms/book_with_googlepay_button_content.xml +14 -0
  127. package/android/src/main/res/drawable-ms/buy_with_googlepay_button_content.xml +14 -0
  128. package/android/src/main/res/drawable-ms/checkout_with_googlepay_button_content.xml +14 -0
  129. package/android/src/main/res/drawable-ms/donate_with_googlepay_button_content.xml +14 -0
  130. package/android/src/main/res/drawable-ms/order_with_googlepay_button_content.xml +14 -0
  131. package/android/src/main/res/drawable-ms/pay_with_googlepay_button_content.xml +4 -4
  132. package/android/src/main/res/drawable-ms/subscribe_with_googlepay_button_content.xml +14 -0
  133. package/android/src/main/res/drawable-nl/book_with_googlepay_button_content.xml +14 -0
  134. package/android/src/main/res/drawable-nl/buy_with_googlepay_button_content.xml +14 -0
  135. package/android/src/main/res/drawable-nl/checkout_with_googlepay_button_content.xml +14 -0
  136. package/android/src/main/res/drawable-nl/donate_with_googlepay_button_content.xml +14 -0
  137. package/android/src/main/res/drawable-nl/order_with_googlepay_button_content.xml +14 -0
  138. package/android/src/main/res/drawable-nl/pay_with_googlepay_button_content.xml +4 -4
  139. package/android/src/main/res/drawable-nl/subscribe_with_googlepay_button_content.xml +14 -0
  140. package/android/src/main/res/drawable-no/book_with_googlepay_button_content.xml +14 -0
  141. package/android/src/main/res/drawable-no/buy_with_googlepay_button_content.xml +14 -0
  142. package/android/src/main/res/drawable-no/checkout_with_googlepay_button_content.xml +14 -0
  143. package/android/src/main/res/drawable-no/donate_with_googlepay_button_content.xml +14 -0
  144. package/android/src/main/res/drawable-no/order_with_googlepay_button_content.xml +14 -0
  145. package/android/src/main/res/drawable-no/pay_with_googlepay_button_content.xml +6 -6
  146. package/android/src/main/res/drawable-no/subscribe_with_googlepay_button_content.xml +14 -0
  147. package/android/src/main/res/drawable-pl/book_with_googlepay_button_content.xml +14 -0
  148. package/android/src/main/res/drawable-pl/buy_with_googlepay_button_content.xml +14 -0
  149. package/android/src/main/res/drawable-pl/checkout_with_googlepay_button_content.xml +14 -0
  150. package/android/src/main/res/drawable-pl/donate_with_googlepay_button_content.xml +14 -0
  151. package/android/src/main/res/drawable-pl/order_with_googlepay_button_content.xml +14 -0
  152. package/android/src/main/res/drawable-pl/pay_with_googlepay_button_content.xml +7 -7
  153. package/android/src/main/res/drawable-pl/subscribe_with_googlepay_button_content.xml +14 -0
  154. package/android/src/main/res/drawable-ru/book_with_googlepay_button_content.xml +14 -0
  155. package/android/src/main/res/drawable-ru/buy_with_googlepay_button_content.xml +14 -0
  156. package/android/src/main/res/drawable-ru/checkout_with_googlepay_button_content.xml +14 -0
  157. package/android/src/main/res/drawable-ru/donate_with_googlepay_button_content.xml +14 -0
  158. package/android/src/main/res/drawable-ru/order_with_googlepay_button_content.xml +14 -0
  159. package/android/src/main/res/drawable-ru/pay_with_googlepay_button_content.xml +7 -7
  160. package/android/src/main/res/drawable-ru/subscribe_with_googlepay_button_content.xml +14 -0
  161. package/android/src/main/res/drawable-sk/book_with_googlepay_button_content.xml +14 -0
  162. package/android/src/main/res/drawable-sk/buy_with_googlepay_button_content.xml +14 -0
  163. package/android/src/main/res/drawable-sk/checkout_with_googlepay_button_content.xml +14 -0
  164. package/android/src/main/res/drawable-sk/donate_with_googlepay_button_content.xml +14 -0
  165. package/android/src/main/res/drawable-sk/order_with_googlepay_button_content.xml +14 -0
  166. package/android/src/main/res/drawable-sk/pay_with_googlepay_button_content.xml +4 -4
  167. package/android/src/main/res/drawable-sk/subscribe_with_googlepay_button_content.xml +14 -0
  168. package/android/src/main/res/drawable-sl/book_with_googlepay_button_content.xml +14 -0
  169. package/android/src/main/res/drawable-sl/buy_with_googlepay_button_content.xml +14 -0
  170. package/android/src/main/res/drawable-sl/checkout_with_googlepay_button_content.xml +14 -0
  171. package/android/src/main/res/drawable-sl/donate_with_googlepay_button_content.xml +14 -0
  172. package/android/src/main/res/drawable-sl/order_with_googlepay_button_content.xml +14 -0
  173. package/android/src/main/res/drawable-sl/pay_with_googlepay_button_content.xml +4 -4
  174. package/android/src/main/res/drawable-sl/subscribe_with_googlepay_button_content.xml +14 -0
  175. package/android/src/main/res/drawable-sr/book_with_googlepay_button_content.xml +14 -0
  176. package/android/src/main/res/drawable-sr/buy_with_googlepay_button_content.xml +14 -0
  177. package/android/src/main/res/drawable-sr/checkout_with_googlepay_button_content.xml +14 -0
  178. package/android/src/main/res/drawable-sr/donate_with_googlepay_button_content.xml +14 -0
  179. package/android/src/main/res/drawable-sr/order_with_googlepay_button_content.xml +14 -0
  180. package/android/src/main/res/drawable-sr/pay_with_googlepay_button_content.xml +7 -7
  181. package/android/src/main/res/drawable-sr/subscribe_with_googlepay_button_content.xml +14 -0
  182. package/android/src/main/res/drawable-sv/book_with_googlepay_button_content.xml +14 -0
  183. package/android/src/main/res/drawable-sv/buy_with_googlepay_button_content.xml +14 -0
  184. package/android/src/main/res/drawable-sv/checkout_with_googlepay_button_content.xml +14 -0
  185. package/android/src/main/res/drawable-sv/donate_with_googlepay_button_content.xml +14 -0
  186. package/android/src/main/res/drawable-sv/order_with_googlepay_button_content.xml +14 -0
  187. package/android/src/main/res/drawable-sv/pay_with_googlepay_button_content.xml +4 -4
  188. package/android/src/main/res/drawable-sv/subscribe_with_googlepay_button_content.xml +14 -0
  189. package/android/src/main/res/drawable-th/book_with_googlepay_button_content.xml +14 -0
  190. package/android/src/main/res/drawable-th/buy_with_googlepay_button_content.xml +14 -0
  191. package/android/src/main/res/drawable-th/checkout_with_googlepay_button_content.xml +14 -0
  192. package/android/src/main/res/drawable-th/donate_with_googlepay_button_content.xml +14 -0
  193. package/android/src/main/res/drawable-th/order_with_googlepay_button_content.xml +14 -0
  194. package/android/src/main/res/drawable-th/pay_with_googlepay_button_content.xml +6 -6
  195. package/android/src/main/res/drawable-th/subscribe_with_googlepay_button_content.xml +14 -0
  196. package/android/src/main/res/drawable-tr/book_with_googlepay_button_content.xml +14 -0
  197. package/android/src/main/res/drawable-tr/buy_with_googlepay_button_content.xml +14 -0
  198. package/android/src/main/res/drawable-tr/checkout_with_googlepay_button_content.xml +14 -0
  199. package/android/src/main/res/drawable-tr/donate_with_googlepay_button_content.xml +14 -0
  200. package/android/src/main/res/drawable-tr/order_with_googlepay_button_content.xml +14 -0
  201. package/android/src/main/res/drawable-tr/pay_with_googlepay_button_content.xml +7 -7
  202. package/android/src/main/res/drawable-tr/subscribe_with_googlepay_button_content.xml +14 -0
  203. package/android/src/main/res/drawable-uk/book_with_googlepay_button_content.xml +14 -0
  204. package/android/src/main/res/drawable-uk/buy_with_googlepay_button_content.xml +14 -0
  205. package/android/src/main/res/drawable-uk/checkout_with_googlepay_button_content.xml +14 -0
  206. package/android/src/main/res/drawable-uk/donate_with_googlepay_button_content.xml +14 -0
  207. package/android/src/main/res/drawable-uk/order_with_googlepay_button_content.xml +14 -0
  208. package/android/src/main/res/drawable-uk/pay_with_googlepay_button_content.xml +5 -5
  209. package/android/src/main/res/drawable-uk/subscribe_with_googlepay_button_content.xml +14 -0
  210. package/android/src/main/res/layout/book_with_googlepay_button.xml +20 -0
  211. package/android/src/main/res/layout/buy_with_googlepay_button.xml +20 -0
  212. package/android/src/main/res/layout/checkout_with_googlepay_button.xml +20 -0
  213. package/android/src/main/res/layout/donate_with_googlepay_button.xml +20 -0
  214. package/android/src/main/res/layout/googlepay_mark_button.xml +18 -0
  215. package/android/src/main/res/layout/order_with_googlepay_button.xml +20 -0
  216. package/android/src/main/res/layout/pay_with_googlepay_button.xml +10 -24
  217. package/android/src/main/res/layout/plain_googlepay_button.xml +17 -0
  218. package/android/src/main/res/layout/subscribe_with_googlepay_button.xml +20 -0
  219. package/android/src/main/res/values/googlepay_strings.xml +3 -2
  220. package/ios/ApplePayButtonManager.m +5 -0
  221. package/ios/ApplePayButtonManager.swift +3 -1
  222. package/ios/ApplePayButtonView.swift +21 -0
  223. package/ios/ApplePayUtils.swift +187 -0
  224. package/ios/ApplePayViewController.swift +279 -0
  225. package/ios/PaymentPassFinder.swift +61 -0
  226. package/ios/PushProvisioning/AddToWalletButtonView.swift +10 -10
  227. package/ios/PushProvisioning/PushProvisioningUtils.swift +39 -16
  228. package/ios/StripeSdk.m +29 -0
  229. package/ios/StripeSdk.swift +193 -129
  230. package/ios/Tests/AddressSheetUtilsTests.swift +1 -7
  231. package/ios/Tests/PushProvisioningTests.swift +14 -11
  232. package/jest/mock.js +44 -0
  233. package/lib/commonjs/NativeStripeSdk.js.map +1 -1
  234. package/lib/commonjs/components/PlatformPayButton.js +2 -0
  235. package/lib/commonjs/components/PlatformPayButton.js.map +1 -0
  236. package/lib/commonjs/functions.js +1 -1
  237. package/lib/commonjs/functions.js.map +1 -1
  238. package/lib/commonjs/hooks/usePlatformPay.js +2 -0
  239. package/lib/commonjs/hooks/usePlatformPay.js.map +1 -0
  240. package/lib/commonjs/hooks/useStripe.js +1 -1
  241. package/lib/commonjs/hooks/useStripe.js.map +1 -1
  242. package/lib/commonjs/index.js +1 -1
  243. package/lib/commonjs/index.js.map +1 -1
  244. package/lib/commonjs/types/Errors.js +1 -1
  245. package/lib/commonjs/types/Errors.js.map +1 -1
  246. package/lib/commonjs/types/PlatformPay.js +2 -0
  247. package/lib/commonjs/types/PlatformPay.js.map +1 -0
  248. package/lib/commonjs/types/PushProvisioning.js +2 -0
  249. package/lib/commonjs/types/PushProvisioning.js.map +1 -0
  250. package/lib/commonjs/types/index.js +1 -1
  251. package/lib/commonjs/types/index.js.map +1 -1
  252. package/lib/module/NativeStripeSdk.js.map +1 -1
  253. package/lib/module/components/PlatformPayButton.js +2 -0
  254. package/lib/module/components/PlatformPayButton.js.map +1 -0
  255. package/lib/module/functions.js +1 -1
  256. package/lib/module/functions.js.map +1 -1
  257. package/lib/module/hooks/usePlatformPay.js +2 -0
  258. package/lib/module/hooks/usePlatformPay.js.map +1 -0
  259. package/lib/module/hooks/useStripe.js +1 -1
  260. package/lib/module/hooks/useStripe.js.map +1 -1
  261. package/lib/module/index.js +1 -1
  262. package/lib/module/index.js.map +1 -1
  263. package/lib/module/types/Errors.js +1 -1
  264. package/lib/module/types/Errors.js.map +1 -1
  265. package/lib/module/types/PlatformPay.js +2 -0
  266. package/lib/module/types/PlatformPay.js.map +1 -0
  267. package/lib/module/types/PushProvisioning.js +2 -0
  268. package/lib/module/types/PushProvisioning.js.map +1 -0
  269. package/lib/module/types/index.js +1 -1
  270. package/lib/module/types/index.js.map +1 -1
  271. package/lib/typescript/src/NativeStripeSdk.d.ts +8 -1
  272. package/lib/typescript/src/components/PlatformPayButton.d.ts +65 -0
  273. package/lib/typescript/src/functions.d.ts +73 -1
  274. package/lib/typescript/src/hooks/usePlatformPay.d.ts +70 -0
  275. package/lib/typescript/src/hooks/useStripe.d.ts +18 -1
  276. package/lib/typescript/src/index.d.ts +2 -0
  277. package/lib/typescript/src/types/ApplePay.d.ts +9 -0
  278. package/lib/typescript/src/types/Errors.d.ts +6 -1
  279. package/lib/typescript/src/types/GooglePay.d.ts +2 -1
  280. package/lib/typescript/src/types/PlatformPay.d.ts +285 -0
  281. package/lib/typescript/src/types/PushProvisioning.d.ts +66 -0
  282. package/lib/typescript/src/types/components/ApplePayButtonComponent.d.ts +2 -2
  283. package/lib/typescript/src/types/index.d.ts +3 -38
  284. package/package.json +8 -1
  285. package/src/NativeStripeSdk.tsx +20 -0
  286. package/src/components/PlatformPayButton.tsx +157 -0
  287. package/src/functions.ts +181 -0
  288. package/src/hooks/usePlatformPay.tsx +174 -0
  289. package/src/hooks/useStripe.tsx +77 -0
  290. package/src/index.tsx +6 -0
  291. package/src/types/ApplePay.ts +9 -0
  292. package/src/types/Errors.ts +7 -1
  293. package/src/types/GooglePay.ts +2 -1
  294. package/src/types/PlatformPay.ts +326 -0
  295. package/src/types/PushProvisioning.ts +76 -0
  296. package/src/types/components/ApplePayButtonComponent.ts +3 -2
  297. package/src/types/index.ts +3 -54
  298. package/android/src/main/res/drawable/googlepay_button_background.xml +0 -6
  299. package/android/src/main/res/drawable/googlepay_button_content.xml +0 -48
  300. package/android/src/main/res/drawable/googlepay_button_overlay.xml +0 -12
  301. package/android/src/main/res/drawable-af/pay_with_googlepay_button_content.xml +0 -14
  302. package/android/src/main/res/drawable-am/pay_with_googlepay_button_content.xml +0 -15
  303. package/android/src/main/res/drawable-as/pay_with_googlepay_button_content.xml +0 -14
  304. package/android/src/main/res/drawable-az/pay_with_googlepay_button_content.xml +0 -14
  305. package/android/src/main/res/drawable-be/pay_with_googlepay_button_content.xml +0 -14
  306. package/android/src/main/res/drawable-bn/pay_with_googlepay_button_content.xml +0 -14
  307. package/android/src/main/res/drawable-bs/pay_with_googlepay_button_content.xml +0 -14
  308. package/android/src/main/res/drawable-cy/pay_with_googlepay_button_content.xml +0 -14
  309. package/android/src/main/res/drawable-en-rau/pay_with_googlepay_button_content.xml +0 -14
  310. package/android/src/main/res/drawable-en-rca/pay_with_googlepay_button_content.xml +0 -14
  311. package/android/src/main/res/drawable-en-rgb/pay_with_googlepay_button_content.xml +0 -14
  312. package/android/src/main/res/drawable-en-rin/pay_with_googlepay_button_content.xml +0 -14
  313. package/android/src/main/res/drawable-es/pay_with_googlepay_button_content.xml +0 -14
  314. package/android/src/main/res/drawable-es-res/pay_with_googlepay_button_content.xml +0 -14
  315. package/android/src/main/res/drawable-eu/pay_with_googlepay_button_content.xml +0 -15
  316. package/android/src/main/res/drawable-fa/pay_with_googlepay_button_content.xml +0 -14
  317. package/android/src/main/res/drawable-fil/pay_with_googlepay_button_content.xml +0 -14
  318. package/android/src/main/res/drawable-fr-rca/pay_with_googlepay_button_content.xml +0 -14
  319. package/android/src/main/res/drawable-ga/pay_with_googlepay_button_content.xml +0 -14
  320. package/android/src/main/res/drawable-gl/pay_with_googlepay_button_content.xml +0 -14
  321. package/android/src/main/res/drawable-gu/pay_with_googlepay_button_content.xml +0 -14
  322. package/android/src/main/res/drawable-hdpi/googlepay_button_background_image.9.png +0 -0
  323. package/android/src/main/res/drawable-hu/pay_with_googlepay_button_content.xml +0 -15
  324. package/android/src/main/res/drawable-hy/pay_with_googlepay_button_content.xml +0 -15
  325. package/android/src/main/res/drawable-is/pay_with_googlepay_button_content.xml +0 -14
  326. package/android/src/main/res/drawable-iw/pay_with_googlepay_button_content.xml +0 -14
  327. package/android/src/main/res/drawable-ka/pay_with_googlepay_button_content.xml +0 -15
  328. package/android/src/main/res/drawable-kk/pay_with_googlepay_button_content.xml +0 -14
  329. package/android/src/main/res/drawable-km/pay_with_googlepay_button_content.xml +0 -14
  330. package/android/src/main/res/drawable-kn/pay_with_googlepay_button_content.xml +0 -14
  331. package/android/src/main/res/drawable-ky/pay_with_googlepay_button_content.xml +0 -14
  332. package/android/src/main/res/drawable-lo/pay_with_googlepay_button_content.xml +0 -14
  333. package/android/src/main/res/drawable-lt/pay_with_googlepay_button_content.xml +0 -14
  334. package/android/src/main/res/drawable-lv/pay_with_googlepay_button_content.xml +0 -14
  335. package/android/src/main/res/drawable-mdpi/googlepay_button_background_image.9.png +0 -0
  336. package/android/src/main/res/drawable-mk/pay_with_googlepay_button_content.xml +0 -14
  337. package/android/src/main/res/drawable-ml/pay_with_googlepay_button_content.xml +0 -14
  338. package/android/src/main/res/drawable-mn/pay_with_googlepay_button_content.xml +0 -14
  339. package/android/src/main/res/drawable-mr/pay_with_googlepay_button_content.xml +0 -14
  340. package/android/src/main/res/drawable-ne/pay_with_googlepay_button_content.xml +0 -14
  341. package/android/src/main/res/drawable-pt-rbr/pay_with_googlepay_button_content.xml +0 -14
  342. package/android/src/main/res/drawable-pt-rpt/pay_with_googlepay_button_content.xml +0 -14
  343. package/android/src/main/res/drawable-ro/pay_with_googlepay_button_content.xml +0 -14
  344. package/android/src/main/res/drawable-sq/pay_with_googlepay_button_content.xml +0 -14
  345. package/android/src/main/res/drawable-sw/pay_with_googlepay_button_content.xml +0 -14
  346. package/android/src/main/res/drawable-ta/pay_with_googlepay_button_content.xml +0 -14
  347. package/android/src/main/res/drawable-te/pay_with_googlepay_button_content.xml +0 -14
  348. package/android/src/main/res/drawable-ur/pay_with_googlepay_button_content.xml +0 -14
  349. package/android/src/main/res/drawable-uz/pay_with_googlepay_button_content.xml +0 -14
  350. package/android/src/main/res/drawable-v21/googlepay_button_background.xml +0 -7
  351. package/android/src/main/res/drawable-vi/pay_with_googlepay_button_content.xml +0 -14
  352. package/android/src/main/res/drawable-xhdpi/googlepay_button_background_image.9.png +0 -0
  353. package/android/src/main/res/drawable-xxhdpi/googlepay_button_background_image.9.png +0 -0
  354. package/android/src/main/res/drawable-xxxhdpi/googlepay_button_background_image.9.png +0 -0
  355. package/android/src/main/res/drawable-zh-rcn/pay_with_googlepay_button_content.xml +0 -15
  356. package/android/src/main/res/drawable-zh-rhk/pay_with_googlepay_button_content.xml +0 -15
  357. package/android/src/main/res/drawable-zh-rtw/pay_with_googlepay_button_content.xml +0 -15
  358. package/android/src/main/res/drawable-zu/pay_with_googlepay_button_content.xml +0 -14
  359. package/android/src/main/res/layout/googlepay_button.xml +0 -39
@@ -10,6 +10,114 @@ import StripePaymentSheet
10
10
 
11
11
  class ApplePayUtils {
12
12
 
13
+ internal class func createPaymentRequest(
14
+ merchantIdentifier: String?,
15
+ params: NSDictionary
16
+ ) -> (error: NSDictionary?, paymentRequest: PKPaymentRequest?) {
17
+ guard let merchantIdentifier = merchantIdentifier else {
18
+ return (Errors.createError(ErrorType.Failed, "You must provide merchantIdentifier"), nil)
19
+ }
20
+
21
+ if let additionalEnabledNetworks = params["additionalEnabledNetworks"] as? [String] {
22
+ do {
23
+ StripeAPI.additionalEnabledApplePayNetworks = try ApplePayUtils.mapToArrayOfPaymentNetworks(arrayOfStrings: additionalEnabledNetworks)
24
+ } catch {
25
+ return (Errors.createError(ErrorType.Failed, error.localizedDescription), nil)
26
+ }
27
+ } else if (params["jcbEnabled"] as? Bool == true) {
28
+ StripeAPI.additionalEnabledApplePayNetworks = [.JCB]
29
+ }
30
+
31
+ guard let summaryItems = params["cartItems"] as? NSArray else {
32
+ return (Errors.createError(ErrorType.Failed, "`cartItems` cannot be null."), nil)
33
+ }
34
+ if (summaryItems.count == 0) {
35
+ return (Errors.createError(ErrorType.Failed, "`cartItems` cannot be empty."), nil)
36
+ }
37
+
38
+ guard let countryCode = ((params.object(forKey: "merchantCountryCode") != nil) ? params["merchantCountryCode"] : params["country"]) as? String else {
39
+ return (Errors.createError(ErrorType.Failed, "You must provide the country"), nil)
40
+ }
41
+ guard let currencyCode = ((params.object(forKey: "currencyCode") != nil) ? params["currencyCode"] : params["currency"]) as? String else {
42
+ return (Errors.createError(ErrorType.Failed, "You must provide the payment currency"), nil)
43
+ }
44
+
45
+ let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: countryCode, currency: currencyCode)
46
+
47
+ let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray()
48
+ let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray()
49
+ let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray()
50
+
51
+ paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map {
52
+ Mappers.mapToPKContactField(field: $0 as! String)
53
+ })
54
+
55
+ paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map {
56
+ Mappers.mapToPKContactField(field: $0 as! String)
57
+ })
58
+
59
+ paymentRequest.shippingMethods = ApplePayUtils.buildShippingMethods(items: shippingMethods as? [[String : Any]])
60
+
61
+ do {
62
+ paymentRequest.paymentSummaryItems = try ApplePayUtils
63
+ .buildPaymentSummaryItems(items: summaryItems as? [[String : Any]])
64
+ } catch {
65
+ return (Errors.createError(ErrorType.Failed, error.localizedDescription), nil)
66
+ }
67
+
68
+ if let capabilities = params["merchantCapabilities"] as? [String] {
69
+ for capability in capabilities {
70
+ paymentRequest.merchantCapabilities.update(with: ApplePayUtils.getMerchantCapabilityFrom(string: capability))
71
+ }
72
+ }
73
+
74
+ paymentRequest.shippingType = ApplePayUtils.getShippingTypeFrom(string: params["shippingType"] as? String)
75
+ if let supportedCountries = params["supportedCountries"] as? Set<String> {
76
+ paymentRequest.supportedCountries = supportedCountries
77
+ }
78
+ if #available(iOS 15.0, *) {
79
+ if (params["supportsCouponCode"] as? Bool == true) {
80
+ paymentRequest.supportsCouponCode = true
81
+ }
82
+ if let couponCode = params["couponCode"] as? String {
83
+ paymentRequest.supportsCouponCode = true
84
+ paymentRequest.couponCode = couponCode
85
+ }
86
+ }
87
+
88
+ return (nil, paymentRequest)
89
+ }
90
+
91
+ internal class func getMerchantCapabilityFrom(string: String?) -> PKMerchantCapability {
92
+ switch string {
93
+ case "supportsDebit":
94
+ return .capabilityDebit
95
+ case "supportsCredit":
96
+ return .capabilityCredit
97
+ case "supportsEMV":
98
+ return .capabilityEMV
99
+ case "supports3DS":
100
+ fallthrough
101
+ default:
102
+ return .capability3DS
103
+ }
104
+ }
105
+
106
+ internal class func getShippingTypeFrom(string: String?) -> PKShippingType {
107
+ switch string {
108
+ case "delivery":
109
+ return .delivery
110
+ case "storePickup":
111
+ return .storePickup
112
+ case "servicePickup":
113
+ return .servicePickup
114
+ case "shipping":
115
+ fallthrough
116
+ default:
117
+ return .shipping
118
+ }
119
+ }
120
+
13
121
  @available(iOS 15.0, *)
14
122
  internal class func createDeferredPaymentSummaryItem(item: [String : Any]) throws -> PKPaymentSummaryItem {
15
123
  let label = item["label"] as? String ?? ""
@@ -111,6 +219,79 @@ class ApplePayUtils {
111
219
  }
112
220
  }
113
221
 
222
+ public class func buildShippingMethods(items: [[String : Any]]?) -> [PKShippingMethod] {
223
+ var shippingMethods: [PKShippingMethod] = []
224
+ if let items = items {
225
+ for item in items {
226
+ let shippingMethod = buildShippingMethod(item: item)
227
+ shippingMethods.append(shippingMethod)
228
+ }
229
+ }
230
+
231
+ return shippingMethods
232
+ }
233
+
234
+ internal class func buildShippingMethod(item: [String : Any]) -> PKShippingMethod {
235
+ let label = item["label"] as? String ?? ""
236
+ let amount = NSDecimalNumber(string: item["amount"] as? String ?? "")
237
+ let shippingMethod = PKShippingMethod(
238
+ label: label,
239
+ amount: amount,
240
+ type: item["isPending"] as? Bool ?? false
241
+ ? PKPaymentSummaryItemType.pending : PKPaymentSummaryItemType.final
242
+ )
243
+ shippingMethod.detail = item["detail"] as? String ?? ""
244
+ shippingMethod.identifier = item["identifier"] as? String ?? ""
245
+ if #available(iOS 15.0, *) {
246
+ if let startDate = item["startDate"] as? Double, let endDate = item["endDate"] as? Double {
247
+ let startDate = Date(timeIntervalSince1970: startDate)
248
+ let endDate = Date(timeIntervalSince1970: endDate)
249
+ shippingMethod.dateComponentsRange = PKDateComponentsRange(
250
+ start: Calendar.current.dateComponents([.calendar, .year, .month, .day],
251
+ from: startDate),
252
+ end: Calendar.current.dateComponents([.calendar, .year, .month, .day],
253
+ from: endDate)
254
+ )
255
+ }
256
+ }
257
+ return shippingMethod
258
+ }
259
+
260
+ public class func buildApplePayErrors(errorItems: [NSDictionary]) throws -> (shippingAddressErrors: [Error], couponCodeErrors: [Error]) {
261
+ var shippingAddressErrors: [Error] = []
262
+ var couponCodeErrors: [Error] = []
263
+
264
+ for item in errorItems {
265
+ let type = item["errorType"] as? String
266
+ let message = item["message"] as? String
267
+ switch type {
268
+ case "InvalidShippingAddress":
269
+ let field = item["field"] as? String ?? "street"
270
+ shippingAddressErrors.append(PKPaymentRequest.paymentShippingAddressInvalidError(withKey: field, localizedDescription: message))
271
+ case "UnserviceableShippingAddress":
272
+ shippingAddressErrors.append(PKPaymentRequest.paymentShippingAddressUnserviceableError(withLocalizedDescription: message))
273
+ case "ExpiredCouponCode":
274
+ if #available(iOS 15.0, *) {
275
+ couponCodeErrors.append(PKPaymentRequest.paymentCouponCodeExpiredError(localizedDescription: message))
276
+ }
277
+ case "InvalidCouponCode":
278
+ if #available(iOS 15.0, *) {
279
+ couponCodeErrors.append(PKPaymentRequest.paymentCouponCodeInvalidError(localizedDescription: message))
280
+ }
281
+ default:
282
+ throw ApplePayUtilsError.invalidErrorType(String(describing: type))
283
+ }
284
+ }
285
+ return (shippingAddressErrors, couponCodeErrors)
286
+ }
287
+
288
+ internal class func mapToArrayOfPaymentNetworks(arrayOfStrings: [String]) throws -> [PKPaymentNetwork] {
289
+ let validNetworks: [PKPaymentNetwork?] = try arrayOfStrings.map { networkString in
290
+ return PKPaymentNetwork.init(rawValue: networkString)
291
+ }
292
+ return validNetworks.compactMap { $0 }
293
+ }
294
+
114
295
  public class func buildPaymentSheetApplePayConfig(
115
296
  merchantIdentifier: String?,
116
297
  merchantCountryCode: String?,
@@ -137,6 +318,8 @@ enum ApplePayUtilsError : Error, Equatable {
137
318
  case invalidCartSummaryItemType(String)
138
319
  case missingParameter(String, String)
139
320
  case invalidTimeInterval(String)
321
+ case invalidPaymentNetwork(String)
322
+ case invalidErrorType(String)
140
323
  case missingMerchantId
141
324
  case missingCountryCode
142
325
  }
@@ -150,6 +333,10 @@ extension ApplePayUtilsError: LocalizedError {
150
333
  return "Failed to create Apple Pay summary item with label: \(label). The \(parameter) item parameter is required, but none was provided."
151
334
  case .invalidTimeInterval(let providedInterval):
152
335
  return "Failed to create Apple Pay summary item. \(providedInterval) is not a valid timeInterval, must be one of: minute, hour, day, month, or year."
336
+ case .invalidPaymentNetwork(let network):
337
+ return "Failed to create Apple Pay summary item. \(network) is not a valid/supported payment network."
338
+ case .invalidErrorType(let type):
339
+ return "Error type: '\(type)' is not supported."
153
340
  case .missingMerchantId:
154
341
  return "`merchantIdentifier` is required, but none was found. Ensure you are passing this to initStripe your StripeProvider."
155
342
  case .missingCountryCode:
@@ -0,0 +1,279 @@
1
+ //
2
+ // ApplePayViewController.swift
3
+ // stripe-react-native
4
+ //
5
+ // Created by Charles Cruzan on 9/15/22.
6
+ //
7
+
8
+ import Foundation
9
+ import Stripe
10
+
11
+ extension StripeSdk : PKPaymentAuthorizationViewControllerDelegate, STPApplePayContextDelegate {
12
+ func paymentAuthorizationViewController(
13
+ _ controller: PKPaymentAuthorizationViewController,
14
+ didAuthorizePayment payment: PKPayment,
15
+ handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
16
+ ) {
17
+ applePaymentMethodFlowCanBeCanceled = false
18
+ STPAPIClient.shared.createPaymentMethod(with: payment) { paymentMethod, error in
19
+ if let error = error {
20
+ self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Failed, error))
21
+ } else {
22
+ STPAPIClient.shared.createToken(with: payment) { token, error in
23
+ if let error = error {
24
+ self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Failed, error))
25
+ } else {
26
+ var promiseResult = ["paymentMethod": Mappers.mapFromPaymentMethod(paymentMethod?.splitApplePayAddressByNewline()) ?? [:]]
27
+ if let token = token {
28
+ promiseResult["token"] = Mappers.mapFromToken(token: token.splitApplePayAddressByNewline())
29
+ }
30
+ self.createPlatformPayPaymentMethodResolver?(promiseResult)
31
+ }
32
+ }
33
+ }
34
+ completion(PKPaymentAuthorizationResult.init(status: .success, errors: nil))
35
+ }
36
+ }
37
+
38
+ func paymentAuthorizationViewControllerDidFinish(
39
+ _ controller: PKPaymentAuthorizationViewController
40
+ ) {
41
+ if (applePaymentMethodFlowCanBeCanceled) {
42
+ self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
43
+ applePaymentMethodFlowCanBeCanceled = false
44
+ }
45
+ _ = maybeDismissApplePay()
46
+ }
47
+
48
+ func maybeDismissApplePay() -> Bool {
49
+ if let applePaymentAuthorizationController = applePaymentAuthorizationController {
50
+ DispatchQueue.main.async {
51
+ applePaymentAuthorizationController.dismiss(animated: true)
52
+ }
53
+ return true
54
+ }
55
+ return false
56
+ }
57
+
58
+ @available(iOS 15.0, *)
59
+ func paymentAuthorizationViewController(
60
+ _ controller: PKPaymentAuthorizationViewController,
61
+ didChangeCouponCode couponCode: String,
62
+ handler completion: @escaping (PKPaymentRequestCouponCodeUpdate) -> Void
63
+ ) {
64
+ if let callback = self.couponCodeEnteredJSCallback {
65
+ self.couponCodeUpdateCompletion = completion
66
+ callback(["couponCode": couponCode])
67
+ } else {
68
+ completion(
69
+ PKPaymentRequestCouponCodeUpdate.init(
70
+ errors: self.applePayCouponCodeErrors,
71
+ paymentSummaryItems: self.applePaySummaryItems,
72
+ shippingMethods: self.applePayShippingMethods
73
+ )
74
+ )
75
+ }
76
+ }
77
+
78
+ func paymentAuthorizationViewController(
79
+ _ controller: PKPaymentAuthorizationViewController,
80
+ didSelect shippingMethod: PKShippingMethod,
81
+ handler completion: @escaping (PKPaymentRequestShippingMethodUpdate) -> Void
82
+ ) {
83
+ if let callback = self.shippingMethodUpdateJSCallback {
84
+ self.shippingMethodUpdateCompletion = completion
85
+ callback(["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
86
+ } else {
87
+ completion(
88
+ PKPaymentRequestShippingMethodUpdate.init(paymentSummaryItems: applePaySummaryItems)
89
+ )
90
+ }
91
+ }
92
+
93
+ func paymentAuthorizationViewController(
94
+ _ controller: PKPaymentAuthorizationViewController,
95
+ didSelectShippingContact contact: PKContact,
96
+ handler completion: @escaping (PKPaymentRequestShippingContactUpdate) -> Void
97
+ ) {
98
+ if let callback = self.shippingContactUpdateJSCallback {
99
+ self.shippingContactUpdateCompletion = completion
100
+ callback(["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
101
+ } else {
102
+ completion(
103
+ PKPaymentRequestShippingContactUpdate.init(
104
+ errors: applePayShippingAddressErrors,
105
+ paymentSummaryItems: applePaySummaryItems,
106
+ shippingMethods: applePayShippingMethods
107
+ )
108
+ )
109
+ }
110
+ }
111
+
112
+ func applePayContext(
113
+ _ context: STPApplePayContext,
114
+ didSelect shippingMethod: PKShippingMethod,
115
+ handler: @escaping (PKPaymentRequestShippingMethodUpdate) -> Void
116
+ ) {
117
+ if let callback = self.shippingMethodUpdateJSCallback {
118
+ self.shippingMethodUpdateCompletion = handler
119
+ callback(["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
120
+ if (self.hasLegacyApplePayListeners) {
121
+ // Legacy, remove when useApplePay hook is removed
122
+ sendEvent(withName: "onDidSetShippingMethod", body: ["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
123
+ }
124
+ } else {
125
+ handler(
126
+ PKPaymentRequestShippingMethodUpdate.init(paymentSummaryItems: applePaySummaryItems)
127
+ )
128
+ }
129
+ }
130
+
131
+ func applePayContext(
132
+ _ context: STPApplePayContext,
133
+ didSelectShippingContact contact: PKContact,
134
+ handler: @escaping (PKPaymentRequestShippingContactUpdate) -> Void
135
+ ) {
136
+ if let callback = self.shippingContactUpdateJSCallback {
137
+ self.shippingContactUpdateCompletion = handler
138
+ callback(["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
139
+ if (self.hasLegacyApplePayListeners) {
140
+ // Legacy, remove when useApplePay hook is removed
141
+ sendEvent(withName: "onDidSetShippingContact", body: ["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
142
+ }
143
+ } else {
144
+ handler(
145
+ PKPaymentRequestShippingContactUpdate.init(
146
+ errors: applePayShippingAddressErrors,
147
+ paymentSummaryItems: applePaySummaryItems,
148
+ shippingMethods: applePayShippingMethods
149
+ )
150
+ )
151
+ }
152
+ }
153
+
154
+ func applePayContext(
155
+ _ context: STPApplePayContext,
156
+ didCreatePaymentMethod paymentMethod: STPPaymentMethod,
157
+ paymentInformation: PKPayment,
158
+ completion: @escaping STPIntentClientSecretCompletionBlock
159
+ ) {
160
+ if let clientSecret = self.confirmApplePayPaymentClientSecret {
161
+ completion(clientSecret, nil)
162
+ } else {
163
+ self.applePayCompletionCallback = completion
164
+ let method = Mappers.mapFromPaymentMethod(paymentMethod.splitApplePayAddressByNewline())
165
+ self.deprecatedApplePayRequestResolver?(Mappers.createResult("paymentMethod", method))
166
+ self.deprecatedApplePayRequestRejecter = nil
167
+ }
168
+ }
169
+
170
+ func applePayContext(
171
+ _ context: STPApplePayContext,
172
+ didCompleteWith status: STPPaymentStatus,
173
+ error: Error?
174
+ ) {
175
+ switch status {
176
+ case .success:
177
+ if let resolve = self.confirmApplePayResolver {
178
+ if let clientSecret = self.confirmApplePayPaymentClientSecret {
179
+ STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in
180
+ guard error == nil else {
181
+ if let lastPaymentError = paymentIntent?.lastPaymentError {
182
+ resolve(Errors.createError(ErrorType.Unknown, lastPaymentError))
183
+ } else {
184
+ resolve(Errors.createError(ErrorType.Unknown, error as NSError?))
185
+ }
186
+ return
187
+ }
188
+
189
+ if let paymentIntent = paymentIntent {
190
+ resolve(Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)))
191
+ } else {
192
+ resolve(Mappers.createResult("paymentIntent", nil))
193
+ }
194
+ }
195
+ } else if let clientSecret = self.confirmApplePaySetupClientSecret {
196
+ STPAPIClient.shared.retrieveSetupIntent(withClientSecret: clientSecret) { (setupIntent, error) in
197
+ guard error == nil else {
198
+ if let lastSetupError = setupIntent?.lastSetupError {
199
+ resolve(Errors.createError(ErrorType.Unknown, lastSetupError))
200
+ } else {
201
+ resolve(Errors.createError(ErrorType.Unknown, error?.localizedDescription))
202
+ }
203
+ return
204
+ }
205
+
206
+ if let setupIntent = setupIntent {
207
+ resolve(Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent: setupIntent)))
208
+ } else {
209
+ resolve(Mappers.createResult("setupIntent", nil))
210
+ }
211
+ }
212
+ }
213
+
214
+ } else {
215
+ deprecatedConfirmApplePayPaymentResolver?([])
216
+ }
217
+ break
218
+ case .error:
219
+ if let resolve = self.confirmApplePayResolver {
220
+ resolve(Errors.createError(ErrorType.Failed, error as NSError?))
221
+ } else {
222
+ let message = "Payment not completed"
223
+ deprecatedApplePayCompletionRejecter?(ErrorType.Failed, message, nil)
224
+ deprecatedApplePayRequestRejecter?(ErrorType.Failed, message, nil)
225
+ }
226
+ break
227
+ case .userCancellation:
228
+ let message = "The payment has been canceled"
229
+ if let resolve = self.confirmApplePayResolver {
230
+ resolve(Errors.createError(ErrorType.Canceled, message))
231
+ } else {
232
+ deprecatedApplePayCompletionRejecter?(ErrorType.Canceled, message, nil)
233
+ deprecatedApplePayRequestRejecter?(ErrorType.Canceled, message, nil)
234
+ }
235
+ break
236
+ @unknown default:
237
+ if let resolve = self.confirmApplePayResolver {
238
+ resolve(Errors.createError(ErrorType.Unknown, error as NSError?))
239
+ } else {
240
+ let message = "Payment not completed"
241
+ deprecatedApplePayCompletionRejecter?(ErrorType.Unknown, message, nil)
242
+ deprecatedApplePayRequestRejecter?(ErrorType.Unknown, message, nil)
243
+ }
244
+ break
245
+ }
246
+ confirmApplePayResolver = nil
247
+ confirmApplePayPaymentClientSecret = nil
248
+ confirmApplePaySetupClientSecret = nil
249
+ deprecatedApplePayCompletionRejecter = nil
250
+ deprecatedApplePayRequestRejecter = nil
251
+ }
252
+
253
+ }
254
+
255
+ extension STPPaymentMethod {
256
+ func splitApplePayAddressByNewline() -> STPPaymentMethod {
257
+ let address = self.billingDetails?.address?.line1?.split(whereSeparator: \.isNewline)
258
+ if (address?.indices.contains(0) == true) {
259
+ self.billingDetails?.address?.line1 = String(address?[0] ?? "")
260
+ }
261
+ if (address?.indices.contains(1) == true) {
262
+ self.billingDetails?.address?.line2 = String(address?[1] ?? "")
263
+ }
264
+ return self
265
+ }
266
+ }
267
+
268
+ extension STPToken {
269
+ func splitApplePayAddressByNewline() -> STPToken {
270
+ let address = self.card?.address?.line1?.split(whereSeparator: \.isNewline)
271
+ if (address?.indices.contains(0) == true) {
272
+ self.card?.address?.line1 = String(address?[0] ?? "")
273
+ }
274
+ if (address?.indices.contains(1) == true) {
275
+ self.card?.address?.line2 = String(address?[1] ?? "")
276
+ }
277
+ return self
278
+ }
279
+ }
@@ -0,0 +1,61 @@
1
+ //
2
+ // PKPaymentPassFinder.swift
3
+ // stripe-react-native
4
+ //
5
+ // Created by Charles Cruzan on 10/6/22.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ internal class PaymentPassFinder: NSObject {
11
+ enum PassLocation: String {
12
+ case CURRENT_DEVICE
13
+ case PAIRED_DEVICE
14
+ }
15
+
16
+ class func findPassWithLast4(last4: String, hasPairedAppleWatch: Bool, completion: @escaping ((Bool, [PassLocation]) -> Void)) {
17
+ let existingPassOnDevice: PKPass? = {
18
+ if #available(iOS 13.4, *) {
19
+ return PKPassLibrary().passes(of: PKPassType.secureElement)
20
+ .first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .deactivated && !$0.isRemotePass })
21
+ } else {
22
+ return PKPassLibrary().passes(of: PKPassType.payment)
23
+ .first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .deactivated && !$0.isRemotePass })
24
+ }
25
+ }()
26
+
27
+ var passLocations: [PassLocation] = []
28
+ if (existingPassOnDevice != nil) {
29
+ passLocations.append(.CURRENT_DEVICE)
30
+ }
31
+
32
+ // We're done here if the user does not have a paired Apple Watch
33
+ if (!hasPairedAppleWatch) {
34
+ completion(
35
+ passLocations.count < 1,
36
+ passLocations
37
+ )
38
+ return
39
+ }
40
+
41
+ let existingPassOnPairedDevices: PKPass? = {
42
+ if #available(iOS 13.4, *) {
43
+ return PKPassLibrary().remoteSecureElementPasses
44
+ .first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .deactivated })
45
+ } else {
46
+ return PKPassLibrary().remotePaymentPasses()
47
+ .first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .deactivated })
48
+ }
49
+ }()
50
+
51
+
52
+ if (existingPassOnPairedDevices != nil) {
53
+ passLocations.append(.PAIRED_DEVICE)
54
+ }
55
+
56
+ completion(
57
+ passLocations.count < 2,
58
+ passLocations
59
+ )
60
+ }
61
+ }
@@ -19,20 +19,10 @@ class AddToWalletButtonView: UIView {
19
19
  @objc var ephemeralKey: NSDictionary?
20
20
  @objc var onCompleteAction: RCTDirectEventBlock?
21
21
 
22
- override init(frame: CGRect) {
23
- super.init(frame: frame)
24
- }
25
-
26
22
  required init?(coder: NSCoder) {
27
23
  fatalError("init(coder:) has not been implemented")
28
24
  }
29
25
 
30
- override func layoutSubviews() {
31
- if let addToWalletButton = self.addToWalletButton {
32
- addToWalletButton.frame = self.bounds
33
- }
34
- }
35
-
36
26
  override func didSetProps(_ changedProps: [String]!) {
37
27
  if let addToWalletButton = addToWalletButton {
38
28
  addToWalletButton.removeFromSuperview()
@@ -96,6 +86,16 @@ class AddToWalletButtonView: UIView {
96
86
  let vc = findViewControllerPresenter(from: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController())
97
87
  vc.present(controller!, animated: true, completion: nil)
98
88
  }
89
+
90
+ override init(frame: CGRect) {
91
+ super.init(frame: frame)
92
+ }
93
+
94
+ override func layoutSubviews() {
95
+ if let addToWalletButton = self.addToWalletButton {
96
+ addToWalletButton.frame = self.bounds
97
+ }
98
+ }
99
99
  }
100
100
 
101
101
 
@@ -12,25 +12,33 @@ internal class PushProvisioningUtils {
12
12
  class func canAddCardToWallet(
13
13
  last4: String,
14
14
  primaryAccountIdentifier: String,
15
- testEnv: Bool
16
- ) -> (canAddCard: Bool, status: AddCardToWalletStatus?) {
15
+ testEnv: Bool,
16
+ hasPairedAppleWatch: Bool,
17
+ completion: @escaping (_ canAddCard: Bool, _ status: AddCardToWalletStatus?) -> Void
18
+ ) {
17
19
  if (!PKAddPassesViewController.canAddPasses()) {
18
- return (false, AddCardToWalletStatus.UNSUPPORTED_DEVICE)
20
+ completion(false, AddCardToWalletStatus.UNSUPPORTED_DEVICE)
19
21
  }
20
22
 
21
- var status : AddCardToWalletStatus? = nil
22
- var canAddCard = PushProvisioningUtils.canAddPaymentPass(
23
+ let canAddCard = canAddPaymentPass(
23
24
  primaryAccountIdentifier: primaryAccountIdentifier,
24
25
  isTestMode: testEnv)
25
26
 
26
27
  if (!canAddCard) {
27
- status = AddCardToWalletStatus.MISSING_CONFIGURATION
28
- } else if (PushProvisioningUtils.passExistsWith(last4: last4)) {
29
- canAddCard = false
30
- status = AddCardToWalletStatus.CARD_ALREADY_EXISTS
28
+ completion(canAddCard, AddCardToWalletStatus.MISSING_CONFIGURATION)
29
+ } else {
30
+ PaymentPassFinder.findPassWithLast4(last4: last4, hasPairedAppleWatch: hasPairedAppleWatch) { canAddCardToADevice, passLocations in
31
+ var status: AddCardToWalletStatus? = nil
32
+ if (!canAddCardToADevice) {
33
+ status = AddCardToWalletStatus.CARD_ALREADY_EXISTS
34
+ } else if (passLocations.contains(.PAIRED_DEVICE)) {
35
+ status = AddCardToWalletStatus.CARD_EXISTS_ON_PAIRED_DEVICE
36
+ } else if (passLocations.contains(.CURRENT_DEVICE)) {
37
+ status = AddCardToWalletStatus.CARD_EXISTS_ON_CURRENT_DEVICE
38
+ }
39
+ completion(canAddCardToADevice, status)
40
+ }
31
41
  }
32
-
33
- return (canAddCard, status)
34
42
  }
35
43
 
36
44
  class func canAddPaymentPass(primaryAccountIdentifier: String, isTestMode: Bool) -> Bool {
@@ -45,20 +53,35 @@ internal class PushProvisioningUtils {
45
53
  }
46
54
  }
47
55
 
48
- class func passExistsWith(last4: String) -> Bool {
49
- let existingPass: PKPass? = {
56
+ class func getPassLocation(last4: String) -> PaymentPassFinder.PassLocation? {
57
+ let existingPassOnDevice: PKPass? = {
50
58
  if #available(iOS 13.4, *) {
51
- return PKPassLibrary().passes(of: PKPassType.secureElement).first(where: {$0.secureElementPass?.primaryAccountNumberSuffix == last4})
59
+ return PKPassLibrary().passes(of: PKPassType.secureElement)
60
+ .first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .suspended && !$0.isRemotePass })
52
61
  } else {
53
- return PKPassLibrary().passes(of: PKPassType.payment).first(where: {$0.paymentPass?.primaryAccountNumberSuffix == last4})
62
+ return PKPassLibrary().passes(of: PKPassType.payment)
63
+ .first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .suspended && !$0.isRemotePass })
54
64
  }
55
65
  }()
56
- return existingPass != nil
66
+
67
+ let existingPassOnPairedDevices: PKPass? = {
68
+ if #available(iOS 13.4, *) {
69
+ return PKPassLibrary().remoteSecureElementPasses
70
+ .first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .suspended })
71
+ } else {
72
+ return PKPassLibrary().remotePaymentPasses()
73
+ .first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .suspended })
74
+ }
75
+ }()
76
+
77
+ return existingPassOnDevice != nil ? PaymentPassFinder.PassLocation.CURRENT_DEVICE : (existingPassOnPairedDevices != nil ? PaymentPassFinder.PassLocation.PAIRED_DEVICE : nil)
57
78
  }
58
79
 
59
80
  enum AddCardToWalletStatus: String {
60
81
  case UNSUPPORTED_DEVICE
61
82
  case MISSING_CONFIGURATION
62
83
  case CARD_ALREADY_EXISTS
84
+ case CARD_EXISTS_ON_CURRENT_DEVICE
85
+ case CARD_EXISTS_ON_PAIRED_DEVICE
63
86
  }
64
87
  }