@stripe/stripe-react-native 0.57.0 → 0.57.2

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 (324) hide show
  1. package/README.md +0 -8
  2. package/android/.idea/AndroidProjectSystem.xml +6 -0
  3. package/android/.idea/caches/deviceStreaming.xml +1029 -0
  4. package/android/.idea/compiler.xml +6 -0
  5. package/android/.idea/gradle.xml +19 -0
  6. package/android/.idea/migrations.xml +10 -0
  7. package/android/.idea/misc.xml +10 -0
  8. package/android/.idea/runConfigurations.xml +17 -0
  9. package/android/.idea/vcs.xml +6 -0
  10. package/android/build.gradle +76 -118
  11. package/android/gradle.properties +1 -1
  12. package/android/local.properties +8 -0
  13. package/android/settings.gradle +2 -0
  14. package/android/spotless.gradle +1 -1
  15. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +20 -17
  16. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +13 -11
  17. package/android/src/main/java/com/reactnativestripesdk/CardFormView.kt +17 -21
  18. package/android/src/main/java/com/reactnativestripesdk/CollectBankAccountLauncherManager.kt +2 -0
  19. package/android/src/main/java/com/reactnativestripesdk/CustomPaymentMethodActivity.kt +2 -0
  20. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +53 -11
  21. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +105 -117
  22. package/android/src/main/java/com/reactnativestripesdk/EventEmitterCompat.kt +4 -8
  23. package/android/src/main/java/com/reactnativestripesdk/FakeOnrampSdkModule.kt +154 -0
  24. package/android/src/main/java/com/reactnativestripesdk/FinancialConnectionsSheetManager.kt +13 -15
  25. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +1 -1
  26. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +1 -1
  27. package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +7 -5
  28. package/android/src/main/java/com/reactnativestripesdk/NavigationBarManager.kt +31 -0
  29. package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +120 -0
  30. package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +228 -0
  31. package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherManager.kt +1 -0
  32. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +3 -0
  33. package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +4 -6
  34. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +73 -30
  35. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +19 -245
  36. package/android/src/main/java/com/reactnativestripesdk/StripeAbstractComposeView.kt +53 -17
  37. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +52 -14
  38. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +21 -2
  39. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +4 -4
  40. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetViewManager.kt +2 -2
  41. package/android/src/main/java/com/reactnativestripesdk/customersheet/CustomerSheetManager.kt +15 -35
  42. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -1
  43. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +5 -10
  44. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +90 -77
  45. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +6 -4
  46. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +13 -3
  47. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +41 -0
  48. package/android/src/main/java/com/reactnativestripesdk/utils/KeepJsAwakeTask.kt +1 -1
  49. package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +92 -44
  50. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +3 -0
  51. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +2 -0
  52. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +118 -0
  53. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +4 -0
  54. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +922 -0
  55. package/android/src/test/java/com/facebook/testutils/shadows/ShadowArguments.kt +29 -0
  56. package/android/src/test/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManagerTest.kt +163 -0
  57. package/android/src/test/java/com/reactnativestripesdk/PaymentElementConfigTest.kt +976 -0
  58. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetAppearanceTest.kt +801 -0
  59. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetManagerTest.kt +523 -0
  60. package/android/src/test/java/com/reactnativestripesdk/addresssheet/AddressSheetViewTest.kt +551 -0
  61. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +567 -0
  62. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +456 -0
  63. package/android/src/test/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxyTest.kt +43 -0
  64. package/android/src/test/resources/robolectric.properties +2 -0
  65. package/ios/AddressSheet/AddressSheetUtils.swift +3 -3
  66. package/ios/AddressSheet/AddressSheetView.swift +25 -25
  67. package/ios/AddressSheet/AddressSheetViewManager.swift +2 -2
  68. package/ios/ApplePayButtonManager.swift +1 -1
  69. package/ios/ApplePayButtonView.swift +9 -10
  70. package/ios/ApplePayUtils.swift +51 -51
  71. package/ios/ApplePayViewController.swift +25 -29
  72. package/ios/AuBECSDebitFormManager.swift +1 -1
  73. package/ios/AuBECSDebitFormView.swift +13 -15
  74. package/ios/CardFieldManager.swift +4 -4
  75. package/ios/CardFieldView.swift +9 -9
  76. package/ios/CardFormManager.swift +3 -3
  77. package/ios/CardFormView.swift +28 -28
  78. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingView.swift +97 -0
  79. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +133 -0
  80. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.m +16 -0
  81. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.swift +17 -0
  82. package/ios/CustomerSheet/CustomerSheetUtils.swift +15 -16
  83. package/ios/CustomerSheet/ReactNativeCustomerAdapter.swift +19 -19
  84. package/ios/EmbeddedPaymentElementView.swift +2 -2
  85. package/ios/Errors.swift +22 -23
  86. package/ios/FinancialConnections.swift +37 -37
  87. package/ios/Mappers.swift +210 -71
  88. package/ios/NavigationBarManager.m +13 -0
  89. package/ios/NavigationBarManager.swift +17 -0
  90. package/ios/NavigationBarView.swift +65 -0
  91. package/ios/NewArch/NavigationBarComponentView.h +10 -0
  92. package/ios/NewArch/NavigationBarComponentView.mm +86 -0
  93. package/ios/OldArch/StripeSdkEventEmitterCompat.h +1 -0
  94. package/ios/OldArch/StripeSdkEventEmitterCompat.m +7 -1
  95. package/ios/PaymentMethodFactory.swift +24 -24
  96. package/ios/PaymentOptionDisplayData+ReactNative.swift +4 -4
  97. package/ios/PaymentPassFinder.swift +9 -10
  98. package/ios/PaymentSheetAppearance.swift +137 -138
  99. package/ios/PushProvisioning/AddToWalletButtonManager.swift +2 -2
  100. package/ios/PushProvisioning/AddToWalletButtonView.swift +15 -17
  101. package/ios/PushProvisioning/PushProvisioningUtils.swift +11 -11
  102. package/ios/StripeContainerManager.swift +1 -1
  103. package/ios/StripeContainerView.swift +3 -3
  104. package/ios/StripeOnrampSdk.h +17 -0
  105. package/ios/StripeOnrampSdk.mm +158 -0
  106. package/ios/StripeSdk.mm +8 -0
  107. package/ios/StripeSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  108. package/ios/StripeSdk.xcodeproj/project.xcworkspace/xcuserdata/tianzhao.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  109. package/ios/StripeSdk.xcodeproj/xcuserdata/tianzhao.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  110. package/ios/StripeSdkEmitter.swift +4 -0
  111. package/ios/StripeSdkImpl+CustomerSheet.swift +30 -25
  112. package/ios/StripeSdkImpl+Embedded.swift +11 -9
  113. package/ios/StripeSdkImpl+PaymentSheet.swift +36 -34
  114. package/ios/StripeSdkImpl.swift +913 -185
  115. package/ios/UIColorExtension.swift +72 -0
  116. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  117. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  118. package/lib/commonjs/components/AddressSheet.js +1 -1
  119. package/lib/commonjs/components/AddressSheet.js.map +1 -1
  120. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  121. package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
  122. package/lib/commonjs/components/CardField.js +1 -1
  123. package/lib/commonjs/components/CardField.js.map +1 -1
  124. package/lib/commonjs/components/CardForm.js +1 -1
  125. package/lib/commonjs/components/CardForm.js.map +1 -1
  126. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  127. package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
  128. package/lib/commonjs/components/StripeContainer.js +1 -1
  129. package/lib/commonjs/components/StripeContainer.js.map +1 -1
  130. package/lib/commonjs/components/StripeProvider.js +1 -1
  131. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  132. package/lib/commonjs/connect/Components.js +2 -0
  133. package/lib/commonjs/connect/Components.js.map +1 -0
  134. package/lib/commonjs/connect/ConnectComponentsProvider.js +2 -0
  135. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -0
  136. package/lib/commonjs/connect/EmbeddedComponent.js +19 -0
  137. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -0
  138. package/lib/commonjs/connect/ModalCloseButton.js +2 -0
  139. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -0
  140. package/lib/commonjs/connect/NavigationBar.js +2 -0
  141. package/lib/commonjs/connect/NavigationBar.js.map +1 -0
  142. package/lib/commonjs/connect/connectTypes.js +2 -0
  143. package/lib/commonjs/connect/connectTypes.js.map +1 -0
  144. package/lib/commonjs/events.js +1 -1
  145. package/lib/commonjs/events.js.map +1 -1
  146. package/lib/commonjs/helpers.js +1 -1
  147. package/lib/commonjs/helpers.js.map +1 -1
  148. package/lib/commonjs/hooks/useOnramp.js +2 -0
  149. package/lib/commonjs/hooks/useOnramp.js.map +1 -0
  150. package/lib/commonjs/index.js +1 -1
  151. package/lib/commonjs/index.js.map +1 -1
  152. package/lib/commonjs/plugin/withStripe.js +1 -1
  153. package/lib/commonjs/plugin/withStripe.js.map +1 -1
  154. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  155. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  156. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  157. package/lib/commonjs/specs/NativeAddressSheet.js.map +1 -1
  158. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  159. package/lib/commonjs/specs/NativeApplePayButton.js.map +1 -1
  160. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  161. package/lib/commonjs/specs/NativeAuBECSDebitForm.js.map +1 -1
  162. package/lib/commonjs/specs/NativeCardField.js +1 -1
  163. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  164. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  165. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  166. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +2 -0
  167. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  168. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  169. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  170. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  171. package/lib/commonjs/specs/NativeGooglePayButton.js.map +1 -1
  172. package/lib/commonjs/specs/NativeNavigationBar.js +2 -0
  173. package/lib/commonjs/specs/NativeNavigationBar.js.map +1 -0
  174. package/lib/commonjs/specs/NativeOnrampSdkModule.js +2 -0
  175. package/lib/commonjs/specs/NativeOnrampSdkModule.js.map +1 -0
  176. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  177. package/lib/commonjs/specs/NativeStripeContainer.js.map +1 -1
  178. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  179. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  180. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  181. package/lib/commonjs/types/Errors.js +1 -1
  182. package/lib/commonjs/types/Errors.js.map +1 -1
  183. package/lib/commonjs/types/Onramp.js +2 -0
  184. package/lib/commonjs/types/Onramp.js.map +1 -0
  185. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  186. package/lib/commonjs/types/index.js +1 -1
  187. package/lib/commonjs/types/index.js.map +1 -1
  188. package/lib/module/components/AddToWalletButton.js +1 -1
  189. package/lib/module/components/AddToWalletButton.js.map +1 -1
  190. package/lib/module/components/AddressSheet.js +1 -1
  191. package/lib/module/components/AddressSheet.js.map +1 -1
  192. package/lib/module/components/AuBECSDebitForm.js +1 -1
  193. package/lib/module/components/AuBECSDebitForm.js.map +1 -1
  194. package/lib/module/components/CardField.js +1 -1
  195. package/lib/module/components/CardField.js.map +1 -1
  196. package/lib/module/components/CardForm.js +1 -1
  197. package/lib/module/components/CardForm.js.map +1 -1
  198. package/lib/module/components/PlatformPayButton.js +1 -1
  199. package/lib/module/components/PlatformPayButton.js.map +1 -1
  200. package/lib/module/components/StripeContainer.js +1 -1
  201. package/lib/module/components/StripeContainer.js.map +1 -1
  202. package/lib/module/components/StripeProvider.js +1 -1
  203. package/lib/module/components/StripeProvider.js.map +1 -1
  204. package/lib/module/connect/Components.js +2 -0
  205. package/lib/module/connect/Components.js.map +1 -0
  206. package/lib/module/connect/ConnectComponentsProvider.js +2 -0
  207. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -0
  208. package/lib/module/connect/EmbeddedComponent.js +19 -0
  209. package/lib/module/connect/EmbeddedComponent.js.map +1 -0
  210. package/lib/module/connect/ModalCloseButton.js +2 -0
  211. package/lib/module/connect/ModalCloseButton.js.map +1 -0
  212. package/lib/module/connect/NavigationBar.js +2 -0
  213. package/lib/module/connect/NavigationBar.js.map +1 -0
  214. package/lib/module/connect/connectTypes.js +2 -0
  215. package/lib/module/connect/connectTypes.js.map +1 -0
  216. package/lib/module/events.js +1 -1
  217. package/lib/module/events.js.map +1 -1
  218. package/lib/module/helpers.js +1 -1
  219. package/lib/module/helpers.js.map +1 -1
  220. package/lib/module/hooks/useOnramp.js +2 -0
  221. package/lib/module/hooks/useOnramp.js.map +1 -0
  222. package/lib/module/index.js +1 -1
  223. package/lib/module/index.js.map +1 -1
  224. package/lib/module/plugin/withStripe.js +1 -1
  225. package/lib/module/plugin/withStripe.js.map +1 -1
  226. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  227. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  228. package/lib/module/specs/NativeAddressSheet.js +1 -1
  229. package/lib/module/specs/NativeAddressSheet.js.map +1 -1
  230. package/lib/module/specs/NativeApplePayButton.js +1 -1
  231. package/lib/module/specs/NativeApplePayButton.js.map +1 -1
  232. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  233. package/lib/module/specs/NativeAuBECSDebitForm.js.map +1 -1
  234. package/lib/module/specs/NativeCardField.js +1 -1
  235. package/lib/module/specs/NativeCardField.js.map +1 -1
  236. package/lib/module/specs/NativeCardForm.js +1 -1
  237. package/lib/module/specs/NativeCardForm.js.map +1 -1
  238. package/lib/module/specs/NativeConnectAccountOnboardingView.js +2 -0
  239. package/lib/module/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  240. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  241. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  242. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  243. package/lib/module/specs/NativeGooglePayButton.js.map +1 -1
  244. package/lib/module/specs/NativeNavigationBar.js +2 -0
  245. package/lib/module/specs/NativeNavigationBar.js.map +1 -0
  246. package/lib/module/specs/NativeOnrampSdkModule.js +2 -0
  247. package/lib/module/specs/NativeOnrampSdkModule.js.map +1 -0
  248. package/lib/module/specs/NativeStripeContainer.js +1 -1
  249. package/lib/module/specs/NativeStripeContainer.js.map +1 -1
  250. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  251. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  252. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  253. package/lib/module/types/Errors.js +1 -1
  254. package/lib/module/types/Errors.js.map +1 -1
  255. package/lib/module/types/Onramp.js +2 -0
  256. package/lib/module/types/Onramp.js.map +1 -0
  257. package/lib/module/types/PaymentSheet.js.map +1 -1
  258. package/lib/module/types/index.js +1 -1
  259. package/lib/module/types/index.js.map +1 -1
  260. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  261. package/lib/typescript/src/connect/Components.d.ts +23 -0
  262. package/lib/typescript/src/connect/Components.d.ts.map +1 -0
  263. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts +22 -0
  264. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts.map +1 -0
  265. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +18 -0
  266. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -0
  267. package/lib/typescript/src/connect/ModalCloseButton.d.ts +7 -0
  268. package/lib/typescript/src/connect/ModalCloseButton.d.ts.map +1 -0
  269. package/lib/typescript/src/connect/NavigationBar.d.ts +8 -0
  270. package/lib/typescript/src/connect/NavigationBar.d.ts.map +1 -0
  271. package/lib/typescript/src/connect/connectTypes.d.ts +464 -0
  272. package/lib/typescript/src/connect/connectTypes.d.ts.map +1 -0
  273. package/lib/typescript/src/events.d.ts +4 -0
  274. package/lib/typescript/src/events.d.ts.map +1 -1
  275. package/lib/typescript/src/functions.d.ts.map +1 -1
  276. package/lib/typescript/src/helpers.d.ts.map +1 -1
  277. package/lib/typescript/src/hooks/useOnramp.d.ts +158 -0
  278. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -0
  279. package/lib/typescript/src/index.d.ts +4 -0
  280. package/lib/typescript/src/index.d.ts.map +1 -1
  281. package/lib/typescript/src/plugin/withStripe.d.ts +15 -0
  282. package/lib/typescript/src/plugin/withStripe.d.ts.map +1 -1
  283. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts +14 -0
  284. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts.map +1 -0
  285. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +1 -0
  286. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  287. package/lib/typescript/src/specs/NativeNavigationBar.d.ts +11 -0
  288. package/lib/typescript/src/specs/NativeNavigationBar.d.ts.map +1 -0
  289. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +28 -0
  290. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -0
  291. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +3 -0
  292. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  293. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  294. package/lib/typescript/src/types/Errors.d.ts +5 -0
  295. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  296. package/lib/typescript/src/types/Onramp.d.ts +275 -0
  297. package/lib/typescript/src/types/Onramp.d.ts.map +1 -0
  298. package/lib/typescript/src/types/PaymentSheet.d.ts +7 -0
  299. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  300. package/lib/typescript/src/types/index.d.ts +7 -1
  301. package/lib/typescript/src/types/index.d.ts.map +1 -1
  302. package/package.json +25 -14
  303. package/src/components/StripeProvider.tsx +5 -0
  304. package/src/connect/Components.tsx +279 -0
  305. package/src/connect/ConnectComponentsProvider.tsx +93 -0
  306. package/src/connect/EmbeddedComponent.tsx +407 -0
  307. package/src/connect/ModalCloseButton.tsx +44 -0
  308. package/src/connect/NavigationBar.tsx +29 -0
  309. package/src/connect/connectTypes.ts +626 -0
  310. package/src/events.ts +23 -0
  311. package/src/hooks/useOnramp.tsx +334 -0
  312. package/src/index.tsx +13 -0
  313. package/src/plugin/withStripe.ts +104 -7
  314. package/src/specs/NativeConnectAccountOnboardingView.ts +19 -0
  315. package/src/specs/NativeEmbeddedPaymentElement.ts +5 -1
  316. package/src/specs/NativeNavigationBar.ts +16 -0
  317. package/src/specs/NativeOnrampSdkModule.ts +47 -0
  318. package/src/specs/NativeStripeSdkModule.ts +5 -0
  319. package/src/types/EmbeddedPaymentElement.tsx +24 -3
  320. package/src/types/Errors.ts +6 -0
  321. package/src/types/Onramp.ts +317 -0
  322. package/src/types/PaymentSheet.ts +7 -0
  323. package/src/types/index.ts +8 -0
  324. package/stripe-react-native.podspec +20 -7
@@ -0,0 +1,801 @@
1
+ package com.reactnativestripesdk
2
+
3
+ import android.content.Context
4
+ import android.graphics.Color
5
+ import androidx.test.core.app.ApplicationProvider
6
+ import com.facebook.react.bridge.Arguments
7
+ import com.facebook.react.bridge.ReadableMap
8
+ import com.stripe.android.paymentsheet.PaymentSheet
9
+ import org.json.JSONObject
10
+ import org.junit.Assert.assertEquals
11
+ import org.junit.Test
12
+ import org.junit.runner.RunWith
13
+ import org.robolectric.RobolectricTestRunner
14
+
15
+ @RunWith(RobolectricTestRunner::class)
16
+ class PaymentSheetAppearanceTest {
17
+ private val context = ApplicationProvider.getApplicationContext<Context>()
18
+
19
+ @Test
20
+ fun testFullAppearanceConfiguration() {
21
+ val json =
22
+ """
23
+ {
24
+ "colors": {
25
+ "primary": "#123456",
26
+ "background": "#123456",
27
+ "componentBackground": "#123456",
28
+ "componentBorder": "#123456",
29
+ "componentDivider": "#123456",
30
+ "componentText": "#123456",
31
+ "primaryText": "#123456",
32
+ "secondaryText": "#123456",
33
+ "placeholderText": "#123456",
34
+ "icon": "#123456",
35
+ "error": "#123456"
36
+ },
37
+ "shapes": {
38
+ "borderRadius": 42.0,
39
+ "borderWidth": 42.0
40
+ },
41
+ "font": {
42
+ "scale": 42.0
43
+ },
44
+ "primaryButton": {
45
+ "colors": {
46
+ "background": "#123456",
47
+ "text": "#123456",
48
+ "border": "#123456",
49
+ "successBackgroundColor": "#123456",
50
+ "successTextColor": "#123456"
51
+ },
52
+ "shapes": {
53
+ "borderRadius": 42.0,
54
+ "borderWidth": 42.0,
55
+ "height": 42.0
56
+ }
57
+ },
58
+ "formInsetValues": {
59
+ "left": 42.0,
60
+ "top": 42.0,
61
+ "right": 42.0,
62
+ "bottom": 42.0
63
+ }
64
+ }
65
+ """.trimIndent()
66
+
67
+ val map = jsonToMap(json)
68
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
69
+
70
+ // Build expected appearance manually
71
+ val testColor = Color.parseColor("#123456")
72
+
73
+ val colorsBuilder = PaymentSheet.Colors.Builder.light()
74
+ colorsBuilder.primary(testColor)
75
+ colorsBuilder.surface(testColor)
76
+ colorsBuilder.component(testColor)
77
+ colorsBuilder.componentBorder(testColor)
78
+ colorsBuilder.componentDivider(testColor)
79
+ colorsBuilder.onComponent(testColor)
80
+ colorsBuilder.onSurface(testColor)
81
+ colorsBuilder.subtitle(testColor)
82
+ colorsBuilder.placeholderText(testColor)
83
+ colorsBuilder.appBarIcon(testColor)
84
+ colorsBuilder.error(testColor)
85
+
86
+ val shapesBuilder = PaymentSheet.Shapes.Builder()
87
+ shapesBuilder.cornerRadiusDp(42.0f)
88
+ shapesBuilder.borderStrokeWidthDp(42.0f)
89
+
90
+ val typographyBuilder = PaymentSheet.Typography.Builder()
91
+ typographyBuilder.sizeScaleFactor(42.0f)
92
+
93
+ val primaryButtonColorsBuilder = PaymentSheet.PrimaryButtonColors.Builder.light()
94
+
95
+ primaryButtonColorsBuilder.background(testColor)
96
+ primaryButtonColorsBuilder.onBackground(testColor)
97
+ primaryButtonColorsBuilder.border(testColor)
98
+ primaryButtonColorsBuilder.successBackgroundColor(testColor)
99
+ primaryButtonColorsBuilder.onSuccessBackgroundColor(testColor)
100
+
101
+ val primaryButton =
102
+ PaymentSheet.PrimaryButton(
103
+ colorsLight = primaryButtonColorsBuilder.build(),
104
+ colorsDark = primaryButtonColorsBuilder.build(),
105
+ shape =
106
+ PaymentSheet.PrimaryButtonShape(
107
+ cornerRadiusDp = 42.0f,
108
+ borderStrokeWidthDp = 42.0f,
109
+ heightDp = 42.0f,
110
+ ),
111
+ typography = PaymentSheet.PrimaryButtonTypography(),
112
+ )
113
+
114
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
115
+ appearanceBuilder.typography(typographyBuilder.build())
116
+ appearanceBuilder.colorsLight(colorsBuilder.build())
117
+ appearanceBuilder.colorsDark(colorsBuilder.build())
118
+ appearanceBuilder.shapes(shapesBuilder.build())
119
+ appearanceBuilder.primaryButton(primaryButton)
120
+ appearanceBuilder.formInsetValues(
121
+ PaymentSheet.Insets(
122
+ startDp = 42.0f,
123
+ topDp = 42.0f,
124
+ endDp = 42.0f,
125
+ bottomDp = 42.0f,
126
+ ),
127
+ )
128
+
129
+ val expectedAppearance = appearanceBuilder.build()
130
+
131
+ assertEquals(expectedAppearance, appearanceFromJson)
132
+ }
133
+
134
+ @Test
135
+ fun testPartialAppearanceConfiguration() {
136
+ val json =
137
+ """
138
+ {
139
+ "colors": {
140
+ "primary": "#123456",
141
+ "componentBackground": "#123456",
142
+ "componentDivider": "#123456",
143
+ "primaryText": "#123456",
144
+ "placeholderText": "#123456",
145
+ "error": "#123456"
146
+ },
147
+ "shapes": {
148
+ "borderRadius": 42.0
149
+ },
150
+ "primaryButton": {
151
+ "colors": {
152
+ "background": "#123456",
153
+ "border": "#123456"
154
+ },
155
+ "shapes": {
156
+ "borderRadius": 42.0,
157
+ "height": 42.0
158
+ }
159
+ }
160
+ }
161
+ """.trimIndent()
162
+
163
+ val map = jsonToMap(json)
164
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
165
+
166
+ // Build expected appearance manually (only setting the properties that are in JSON)
167
+ val testColor = Color.parseColor("#123456")
168
+
169
+ val lightColorsBuilder = PaymentSheet.Colors.Builder.light()
170
+ val darkColorsBuilder = PaymentSheet.Colors.Builder.dark()
171
+
172
+ lightColorsBuilder.primary(testColor)
173
+ lightColorsBuilder.component(testColor)
174
+ lightColorsBuilder.componentDivider(testColor)
175
+ lightColorsBuilder.onSurface(testColor)
176
+ lightColorsBuilder.placeholderText(testColor)
177
+ lightColorsBuilder.error(testColor)
178
+
179
+ darkColorsBuilder.primary(testColor)
180
+ darkColorsBuilder.component(testColor)
181
+ darkColorsBuilder.componentDivider(testColor)
182
+ darkColorsBuilder.onSurface(testColor)
183
+ darkColorsBuilder.placeholderText(testColor)
184
+ darkColorsBuilder.error(testColor)
185
+
186
+ val shapesBuilder = PaymentSheet.Shapes.Builder()
187
+ shapesBuilder.cornerRadiusDp(42.0f)
188
+
189
+ val primaryButtonLightColorsBuilder = PaymentSheet.PrimaryButtonColors.Builder.light()
190
+ val primaryButtonDarkColorsBuilder = PaymentSheet.PrimaryButtonColors.Builder.dark()
191
+
192
+ primaryButtonLightColorsBuilder.background(testColor)
193
+ primaryButtonLightColorsBuilder.border(testColor)
194
+ primaryButtonDarkColorsBuilder.background(testColor)
195
+ primaryButtonDarkColorsBuilder.border(testColor)
196
+
197
+ val primaryButton =
198
+ PaymentSheet.PrimaryButton(
199
+ colorsLight = primaryButtonLightColorsBuilder.build(),
200
+ colorsDark = primaryButtonDarkColorsBuilder.build(),
201
+ shape =
202
+ PaymentSheet.PrimaryButtonShape(
203
+ cornerRadiusDp = 42.0f,
204
+ borderStrokeWidthDp = null,
205
+ heightDp = 42.0f,
206
+ ),
207
+ typography = PaymentSheet.PrimaryButtonTypography(),
208
+ )
209
+
210
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
211
+ appearanceBuilder.typography(PaymentSheet.Typography.Builder().build())
212
+ appearanceBuilder.colorsLight(lightColorsBuilder.build())
213
+ appearanceBuilder.colorsDark(darkColorsBuilder.build())
214
+ appearanceBuilder.shapes(shapesBuilder.build())
215
+ appearanceBuilder.primaryButton(primaryButton)
216
+
217
+ val expectedAppearance = appearanceBuilder.build()
218
+
219
+ assertEquals(expectedAppearance, appearanceFromJson)
220
+ }
221
+
222
+ @Test
223
+ fun testFullEmbeddedAppearance_FlatWithRadio() {
224
+ val json =
225
+ """
226
+ {
227
+ "embeddedPaymentElement": {
228
+ "row": {
229
+ "style": "flatWithRadio",
230
+ "additionalInsets": 42.0,
231
+ "flat": {
232
+ "separatorThickness": 42.0,
233
+ "topSeparatorEnabled": true,
234
+ "bottomSeparatorEnabled": true,
235
+ "separatorColor": "#123456",
236
+ "separatorInsets": {
237
+ "left": 42.0,
238
+ "right": 42.0
239
+ },
240
+ "radio": {
241
+ "selectedColor": "#123456",
242
+ "unselectedColor": "#123456"
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ """.trimIndent()
249
+
250
+ val map = jsonToMap(json)
251
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
252
+
253
+ val testColor = Color.parseColor("#123456")
254
+
255
+ val flatRadioLightColorsBuilder =
256
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors
257
+ .Builder
258
+ .light()
259
+ flatRadioLightColorsBuilder.separatorColor(testColor)
260
+ flatRadioLightColorsBuilder.selectedColor(testColor)
261
+ flatRadioLightColorsBuilder.unselectedColor(testColor)
262
+
263
+ val flatRadioDarkColorsBuilder =
264
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors
265
+ .Builder
266
+ .dark()
267
+ flatRadioDarkColorsBuilder.separatorColor(testColor)
268
+ flatRadioDarkColorsBuilder.selectedColor(testColor)
269
+ flatRadioDarkColorsBuilder.unselectedColor(testColor)
270
+
271
+ val flatRadioBuilder =
272
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio
273
+ .Builder()
274
+ flatRadioBuilder.separatorThicknessDp(42.0f)
275
+ flatRadioBuilder.startSeparatorInsetDp(42.0f)
276
+ flatRadioBuilder.endSeparatorInsetDp(42.0f)
277
+ flatRadioBuilder.topSeparatorEnabled(true)
278
+ flatRadioBuilder.bottomSeparatorEnabled(true)
279
+ flatRadioBuilder.additionalVerticalInsetsDp(42.0f)
280
+ flatRadioBuilder.colorsLight(flatRadioLightColorsBuilder.build())
281
+ flatRadioBuilder.colorsDark(flatRadioDarkColorsBuilder.build())
282
+
283
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
284
+ embeddedBuilder.rowStyle(flatRadioBuilder.build())
285
+
286
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
287
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
288
+
289
+ val expectedAppearance = appearanceBuilder.build()
290
+
291
+ assertEquals(expectedAppearance, appearanceFromJson)
292
+ }
293
+
294
+ @Test
295
+ fun testPartialEmbeddedAppearance_FlatWithRadio() {
296
+ val json =
297
+ """
298
+ {
299
+ "embeddedPaymentElement": {
300
+ "row": {
301
+ "style": "flatWithRadio",
302
+ "flat": {
303
+ "separatorThickness": 42.0,
304
+ "topSeparatorEnabled": false,
305
+ "separatorColor": "#123456",
306
+ "radio": {
307
+ "selectedColor": "#123456"
308
+ }
309
+ }
310
+ }
311
+ }
312
+ }
313
+ """.trimIndent()
314
+
315
+ val map = jsonToMap(json)
316
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
317
+
318
+ val testColor = Color.parseColor("#123456")
319
+
320
+ val flatRadioLightColorsBuilder =
321
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors
322
+ .Builder
323
+ .light()
324
+ flatRadioLightColorsBuilder.separatorColor(testColor)
325
+ flatRadioLightColorsBuilder.selectedColor(testColor)
326
+
327
+ val flatRadioDarkColorsBuilder =
328
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors
329
+ .Builder
330
+ .dark()
331
+ flatRadioDarkColorsBuilder.separatorColor(testColor)
332
+ flatRadioDarkColorsBuilder.selectedColor(testColor)
333
+
334
+ val flatRadioBuilder =
335
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio
336
+ .Builder()
337
+ flatRadioBuilder.separatorThicknessDp(42.0f)
338
+ flatRadioBuilder.topSeparatorEnabled(false)
339
+ flatRadioBuilder.colorsLight(flatRadioLightColorsBuilder.build())
340
+ flatRadioBuilder.colorsDark(flatRadioDarkColorsBuilder.build())
341
+
342
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
343
+ embeddedBuilder.rowStyle(flatRadioBuilder.build())
344
+
345
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
346
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
347
+
348
+ val expectedAppearance = appearanceBuilder.build()
349
+
350
+ assertEquals(expectedAppearance, appearanceFromJson)
351
+ }
352
+
353
+ @Test
354
+ fun testFullEmbeddedAppearance_FlatWithCheckmark() {
355
+ val json =
356
+ """
357
+ {
358
+ "embeddedPaymentElement": {
359
+ "row": {
360
+ "style": "flatWithCheckmark",
361
+ "additionalInsets": 42.0,
362
+ "flat": {
363
+ "separatorThickness": 42.0,
364
+ "topSeparatorEnabled": true,
365
+ "bottomSeparatorEnabled": true,
366
+ "separatorColor": "#123456",
367
+ "separatorInsets": {
368
+ "left": 42.0,
369
+ "right": 42.0
370
+ },
371
+ "checkmark": {
372
+ "color": "#123456",
373
+ "inset": 42.0
374
+ }
375
+ }
376
+ }
377
+ }
378
+ }
379
+ """.trimIndent()
380
+
381
+ val map = jsonToMap(json)
382
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
383
+
384
+ val testColor = Color.parseColor("#123456")
385
+
386
+ val flatCheckmarkLightColorsBuilder =
387
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors
388
+ .Builder
389
+ .light()
390
+ flatCheckmarkLightColorsBuilder.separatorColor(testColor)
391
+ flatCheckmarkLightColorsBuilder.checkmarkColor(testColor)
392
+
393
+ val flatCheckmarkDarkColorsBuilder =
394
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors
395
+ .Builder
396
+ .dark()
397
+ flatCheckmarkDarkColorsBuilder.separatorColor(testColor)
398
+ flatCheckmarkDarkColorsBuilder.checkmarkColor(testColor)
399
+
400
+ val flatCheckmarkBuilder =
401
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark
402
+ .Builder()
403
+ flatCheckmarkBuilder.separatorThicknessDp(42.0f)
404
+ flatCheckmarkBuilder.startSeparatorInsetDp(42.0f)
405
+ flatCheckmarkBuilder.endSeparatorInsetDp(42.0f)
406
+ flatCheckmarkBuilder.topSeparatorEnabled(true)
407
+ flatCheckmarkBuilder.bottomSeparatorEnabled(true)
408
+ flatCheckmarkBuilder.checkmarkInsetDp(42.0f)
409
+ flatCheckmarkBuilder.additionalVerticalInsetsDp(42.0f)
410
+ flatCheckmarkBuilder.colorsLight(flatCheckmarkLightColorsBuilder.build())
411
+ flatCheckmarkBuilder.colorsDark(flatCheckmarkDarkColorsBuilder.build())
412
+
413
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
414
+ embeddedBuilder.rowStyle(flatCheckmarkBuilder.build())
415
+
416
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
417
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
418
+
419
+ val expectedAppearance = appearanceBuilder.build()
420
+
421
+ assertEquals(expectedAppearance, appearanceFromJson)
422
+ }
423
+
424
+ @Test
425
+ fun testPartialEmbeddedAppearance_FlatWithCheckmark() {
426
+ val json =
427
+ """
428
+ {
429
+ "embeddedPaymentElement": {
430
+ "row": {
431
+ "style": "flatWithCheckmark",
432
+ "flat": {
433
+ "separatorThickness": 42.0,
434
+ "bottomSeparatorEnabled": false,
435
+ "separatorColor": "#123456",
436
+ "checkmark": {
437
+ "color": "#123456"
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ """.trimIndent()
444
+
445
+ val map = jsonToMap(json)
446
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
447
+
448
+ val testColor = Color.parseColor("#123456")
449
+
450
+ val flatCheckmarkLightColorsBuilder =
451
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors
452
+ .Builder
453
+ .light()
454
+ flatCheckmarkLightColorsBuilder.separatorColor(testColor)
455
+ flatCheckmarkLightColorsBuilder.checkmarkColor(testColor)
456
+
457
+ val flatCheckmarkDarkColorsBuilder =
458
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors
459
+ .Builder
460
+ .dark()
461
+ flatCheckmarkDarkColorsBuilder.separatorColor(testColor)
462
+ flatCheckmarkDarkColorsBuilder.checkmarkColor(testColor)
463
+
464
+ val flatCheckmarkBuilder =
465
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark
466
+ .Builder()
467
+ flatCheckmarkBuilder.separatorThicknessDp(42.0f)
468
+ flatCheckmarkBuilder.bottomSeparatorEnabled(false)
469
+ flatCheckmarkBuilder.colorsLight(flatCheckmarkLightColorsBuilder.build())
470
+ flatCheckmarkBuilder.colorsDark(flatCheckmarkDarkColorsBuilder.build())
471
+
472
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
473
+ embeddedBuilder.rowStyle(flatCheckmarkBuilder.build())
474
+
475
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
476
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
477
+
478
+ val expectedAppearance = appearanceBuilder.build()
479
+
480
+ assertEquals(expectedAppearance, appearanceFromJson)
481
+ }
482
+
483
+ @Test
484
+ fun testFullEmbeddedAppearance_FlatWithDisclosure() {
485
+ val json =
486
+ """
487
+ {
488
+ "embeddedPaymentElement": {
489
+ "row": {
490
+ "style": "flatWithDisclosure",
491
+ "additionalInsets": 42.0,
492
+ "flat": {
493
+ "separatorThickness": 42.0,
494
+ "topSeparatorEnabled": true,
495
+ "bottomSeparatorEnabled": true,
496
+ "separatorColor": "#123456",
497
+ "separatorInsets": {
498
+ "left": 42.0,
499
+ "right": 42.0
500
+ },
501
+ "disclosure": {
502
+ "color": "#123456"
503
+ }
504
+ }
505
+ }
506
+ }
507
+ }
508
+ """.trimIndent()
509
+
510
+ val map = jsonToMap(json)
511
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
512
+
513
+ val testColor = Color.parseColor("#123456")
514
+
515
+ val flatDisclosureLightColorsBuilder =
516
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors
517
+ .Builder
518
+ .light()
519
+ flatDisclosureLightColorsBuilder.separatorColor(testColor)
520
+ flatDisclosureLightColorsBuilder.disclosureColor(testColor)
521
+
522
+ val flatDisclosureDarkColorsBuilder =
523
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors
524
+ .Builder
525
+ .dark()
526
+ flatDisclosureDarkColorsBuilder.separatorColor(testColor)
527
+ flatDisclosureDarkColorsBuilder.disclosureColor(testColor)
528
+
529
+ val flatDisclosureBuilder =
530
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure
531
+ .Builder()
532
+ flatDisclosureBuilder.separatorThicknessDp(42.0f)
533
+ flatDisclosureBuilder.startSeparatorInsetDp(42.0f)
534
+ flatDisclosureBuilder.endSeparatorInsetDp(42.0f)
535
+ flatDisclosureBuilder.topSeparatorEnabled(true)
536
+ flatDisclosureBuilder.bottomSeparatorEnabled(true)
537
+ flatDisclosureBuilder.additionalVerticalInsetsDp(42.0f)
538
+ flatDisclosureBuilder.colorsLight(flatDisclosureLightColorsBuilder.build())
539
+ flatDisclosureBuilder.colorsDark(flatDisclosureDarkColorsBuilder.build())
540
+
541
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
542
+ embeddedBuilder.rowStyle(flatDisclosureBuilder.build())
543
+
544
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
545
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
546
+
547
+ val expectedAppearance = appearanceBuilder.build()
548
+
549
+ assertEquals(expectedAppearance, appearanceFromJson)
550
+ }
551
+
552
+ @Test
553
+ fun testPartialEmbeddedAppearance_FlatWithDisclosure() {
554
+ val json =
555
+ """
556
+ {
557
+ "embeddedPaymentElement": {
558
+ "row": {
559
+ "style": "flatWithDisclosure",
560
+ "flat": {
561
+ "separatorThickness": 42.0,
562
+ "separatorColor": "#123456",
563
+ "disclosure": {
564
+ "color": "#123456"
565
+ }
566
+ }
567
+ }
568
+ }
569
+ }
570
+ """.trimIndent()
571
+
572
+ val map = jsonToMap(json)
573
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
574
+
575
+ val testColor = Color.parseColor("#123456")
576
+
577
+ val flatDisclosureLightColorsBuilder =
578
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors
579
+ .Builder
580
+ .light()
581
+ flatDisclosureLightColorsBuilder.separatorColor(testColor)
582
+ flatDisclosureLightColorsBuilder.disclosureColor(testColor)
583
+
584
+ val flatDisclosureDarkColorsBuilder =
585
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors
586
+ .Builder
587
+ .dark()
588
+ flatDisclosureDarkColorsBuilder.separatorColor(testColor)
589
+ flatDisclosureDarkColorsBuilder.disclosureColor(testColor)
590
+
591
+ val flatDisclosureBuilder =
592
+ PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure
593
+ .Builder()
594
+ flatDisclosureBuilder.separatorThicknessDp(42.0f)
595
+ flatDisclosureBuilder.colorsLight(flatDisclosureLightColorsBuilder.build())
596
+ flatDisclosureBuilder.colorsDark(flatDisclosureDarkColorsBuilder.build())
597
+
598
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
599
+ embeddedBuilder.rowStyle(flatDisclosureBuilder.build())
600
+
601
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
602
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
603
+
604
+ val expectedAppearance = appearanceBuilder.build()
605
+
606
+ assertEquals(expectedAppearance, appearanceFromJson)
607
+ }
608
+
609
+ @Test
610
+ fun testFullEmbeddedAppearance_FloatingButton() {
611
+ val json =
612
+ """
613
+ {
614
+ "embeddedPaymentElement": {
615
+ "row": {
616
+ "style": "floatingButton",
617
+ "additionalInsets": 42.0,
618
+ "floating": {
619
+ "spacing": 42.0
620
+ }
621
+ }
622
+ }
623
+ }
624
+ """.trimIndent()
625
+
626
+ val map = jsonToMap(json)
627
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
628
+
629
+ val floatingButtonBuilder =
630
+ PaymentSheet.Appearance.Embedded.RowStyle.FloatingButton
631
+ .Builder()
632
+ floatingButtonBuilder.additionalInsetsDp(42.0f)
633
+ floatingButtonBuilder.spacingDp(42.0f)
634
+
635
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
636
+ embeddedBuilder.rowStyle(floatingButtonBuilder.build())
637
+
638
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
639
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
640
+
641
+ val expectedAppearance = appearanceBuilder.build()
642
+
643
+ assertEquals(expectedAppearance, appearanceFromJson)
644
+ }
645
+
646
+ @Test
647
+ fun testPartialEmbeddedAppearance_FloatingButton() {
648
+ val json =
649
+ """
650
+ {
651
+ "embeddedPaymentElement": {
652
+ "row": {
653
+ "style": "floatingButton",
654
+ "floating": {
655
+ "spacing": 42.0
656
+ }
657
+ }
658
+ }
659
+ }
660
+ """.trimIndent()
661
+
662
+ val map = jsonToMap(json)
663
+ val appearanceFromJson = buildPaymentSheetAppearance(map, context)
664
+
665
+ val floatingButtonBuilder =
666
+ PaymentSheet.Appearance.Embedded.RowStyle.FloatingButton
667
+ .Builder()
668
+ floatingButtonBuilder.spacingDp(42.0f)
669
+
670
+ val embeddedBuilder = PaymentSheet.Appearance.Embedded.Builder()
671
+ embeddedBuilder.rowStyle(floatingButtonBuilder.build())
672
+
673
+ val appearanceBuilder = PaymentSheet.Appearance.Builder()
674
+ appearanceBuilder.embeddedAppearance(embeddedBuilder.build())
675
+
676
+ val expectedAppearance = appearanceBuilder.build()
677
+
678
+ assertEquals(expectedAppearance, appearanceFromJson)
679
+ }
680
+
681
+ private fun jsonToMap(json: String): ReadableMap {
682
+ val jsonObject = JSONObject(json)
683
+ return jsonObjectToMap(jsonObject)
684
+ }
685
+
686
+ private fun jsonObjectToMap(jsonObject: JSONObject): ReadableMap {
687
+ val map = Arguments.createMap()
688
+ val keys = jsonObject.keys()
689
+ while (keys.hasNext()) {
690
+ val key = keys.next()
691
+ val value = jsonObject.get(key)
692
+ when (value) {
693
+ is JSONObject -> map.putMap(key, jsonObjectToMap(value))
694
+ is String -> map.putString(key, value)
695
+ is Int -> map.putInt(key, value)
696
+ is Double -> map.putDouble(key, value)
697
+ is Boolean -> map.putBoolean(key, value)
698
+ is Long -> map.putDouble(key, value.toDouble())
699
+ JSONObject.NULL -> {} // skip null values
700
+ }
701
+ }
702
+ return map
703
+ }
704
+
705
+ private fun paymentSheetColorsBuilderFull(
706
+ builder: PaymentSheet.Colors.Builder,
707
+ testColor: Int,
708
+ ): PaymentSheet.Colors.Builder {
709
+ builder.primary(testColor)
710
+ builder.surface(testColor)
711
+ builder.component(testColor)
712
+ builder.componentBorder(testColor)
713
+ builder.componentDivider(testColor)
714
+ builder.onComponent(testColor)
715
+ builder.onSurface(testColor)
716
+ builder.subtitle(testColor)
717
+ builder.placeholderText(testColor)
718
+ builder.appBarIcon(testColor)
719
+ builder.error(testColor)
720
+
721
+ return builder
722
+ }
723
+
724
+ private fun paymentSheetColorsBuilderPartial(
725
+ builder: PaymentSheet.Colors.Builder,
726
+ testColor: Int,
727
+ ): PaymentSheet.Colors.Builder {
728
+ builder.primary(testColor)
729
+ builder.component(testColor)
730
+ builder.componentDivider(testColor)
731
+ builder.onSurface(testColor)
732
+ builder.placeholderText(testColor)
733
+ builder.error(testColor)
734
+
735
+ return builder
736
+ }
737
+
738
+ private fun paymentSheetPrimaryButtonColorsBuilderFull(
739
+ builder: PaymentSheet.PrimaryButtonColors.Builder,
740
+ testColor: Int,
741
+ ): PaymentSheet.PrimaryButtonColors.Builder {
742
+ builder.background(testColor)
743
+ builder.onBackground(testColor)
744
+ builder.border(testColor)
745
+ builder.successBackgroundColor(testColor)
746
+ builder.onSuccessBackgroundColor(testColor)
747
+
748
+ return builder
749
+ }
750
+
751
+ private fun paymentSheetPrimaryButtonColorsBuilderPartial(
752
+ builder: PaymentSheet.PrimaryButtonColors.Builder,
753
+ testColor: Int,
754
+ ): PaymentSheet.PrimaryButtonColors.Builder {
755
+ builder.background(testColor)
756
+ builder.border(testColor)
757
+
758
+ return builder
759
+ }
760
+
761
+ private fun paymentSheetFlatRadioColorsBuilderFull(
762
+ builder: PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors.Builder,
763
+ testColor: Int,
764
+ ): PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors.Builder {
765
+ builder.separatorColor(testColor)
766
+ builder.selectedColor(testColor)
767
+ builder.unselectedColor(testColor)
768
+
769
+ return builder
770
+ }
771
+
772
+ private fun paymentSheetFlatRadioColorsBuilderPartial(
773
+ builder: PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors.Builder,
774
+ testColor: Int,
775
+ ): PaymentSheet.Appearance.Embedded.RowStyle.FlatWithRadio.Colors.Builder {
776
+ builder.separatorColor(testColor)
777
+ builder.selectedColor(testColor)
778
+
779
+ return builder
780
+ }
781
+
782
+ private fun paymentSheetFlatCheckmarkColorsBuilder(
783
+ builder: PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors.Builder,
784
+ testColor: Int,
785
+ ): PaymentSheet.Appearance.Embedded.RowStyle.FlatWithCheckmark.Colors.Builder {
786
+ builder.separatorColor(testColor)
787
+ builder.checkmarkColor(testColor)
788
+
789
+ return builder
790
+ }
791
+
792
+ private fun paymentSheetFlatDisclosureColorsBuilder(
793
+ builder: PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors.Builder,
794
+ testColor: Int,
795
+ ): PaymentSheet.Appearance.Embedded.RowStyle.FlatWithDisclosure.Colors.Builder {
796
+ builder.separatorColor(testColor)
797
+ builder.disclosureColor(testColor)
798
+
799
+ return builder
800
+ }
801
+ }