@stripe/stripe-react-native 0.57.0 → 0.57.1

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 (294) hide show
  1. package/android/build.gradle +76 -118
  2. package/android/gradle.properties +1 -1
  3. package/android/settings.gradle +2 -0
  4. package/android/spotless.gradle +1 -1
  5. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +20 -17
  6. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +13 -11
  7. package/android/src/main/java/com/reactnativestripesdk/CardFormView.kt +17 -21
  8. package/android/src/main/java/com/reactnativestripesdk/CollectBankAccountLauncherManager.kt +2 -0
  9. package/android/src/main/java/com/reactnativestripesdk/CustomPaymentMethodActivity.kt +2 -0
  10. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +4 -11
  11. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +46 -119
  12. package/android/src/main/java/com/reactnativestripesdk/EventEmitterCompat.kt +0 -8
  13. package/android/src/main/java/com/reactnativestripesdk/FakeOnrampSdkModule.kt +154 -0
  14. package/android/src/main/java/com/reactnativestripesdk/FinancialConnectionsSheetManager.kt +13 -15
  15. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +1 -1
  16. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +1 -1
  17. package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +7 -5
  18. package/android/src/main/java/com/reactnativestripesdk/NavigationBarManager.kt +31 -0
  19. package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +120 -0
  20. package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +228 -0
  21. package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherManager.kt +1 -0
  22. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +3 -0
  23. package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +4 -6
  24. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +73 -30
  25. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +19 -245
  26. package/android/src/main/java/com/reactnativestripesdk/StripeAbstractComposeView.kt +53 -17
  27. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +52 -14
  28. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +21 -2
  29. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +4 -4
  30. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetViewManager.kt +2 -2
  31. package/android/src/main/java/com/reactnativestripesdk/customersheet/CustomerSheetManager.kt +15 -35
  32. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -1
  33. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +5 -10
  34. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +90 -77
  35. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +6 -4
  36. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +13 -3
  37. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +41 -0
  38. package/android/src/main/java/com/reactnativestripesdk/utils/KeepJsAwakeTask.kt +1 -1
  39. package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +92 -44
  40. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +118 -0
  41. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +4 -0
  42. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +922 -0
  43. package/android/src/test/java/com/facebook/testutils/shadows/ShadowArguments.kt +29 -0
  44. package/android/src/test/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManagerTest.kt +163 -0
  45. package/android/src/test/java/com/reactnativestripesdk/PaymentElementConfigTest.kt +976 -0
  46. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetAppearanceTest.kt +801 -0
  47. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetManagerTest.kt +523 -0
  48. package/android/src/test/java/com/reactnativestripesdk/addresssheet/AddressSheetViewTest.kt +551 -0
  49. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +567 -0
  50. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +456 -0
  51. package/android/src/test/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxyTest.kt +43 -0
  52. package/android/src/test/resources/robolectric.properties +2 -0
  53. package/ios/AddressSheet/AddressSheetUtils.swift +3 -3
  54. package/ios/AddressSheet/AddressSheetView.swift +25 -25
  55. package/ios/AddressSheet/AddressSheetViewManager.swift +2 -2
  56. package/ios/ApplePayButtonManager.swift +1 -1
  57. package/ios/ApplePayButtonView.swift +9 -10
  58. package/ios/ApplePayUtils.swift +51 -51
  59. package/ios/ApplePayViewController.swift +25 -29
  60. package/ios/AuBECSDebitFormManager.swift +1 -1
  61. package/ios/AuBECSDebitFormView.swift +13 -15
  62. package/ios/CardFieldManager.swift +4 -4
  63. package/ios/CardFieldView.swift +9 -9
  64. package/ios/CardFormManager.swift +3 -3
  65. package/ios/CardFormView.swift +28 -28
  66. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingView.swift +97 -0
  67. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +133 -0
  68. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.m +16 -0
  69. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.swift +17 -0
  70. package/ios/CustomerSheet/CustomerSheetUtils.swift +15 -16
  71. package/ios/CustomerSheet/ReactNativeCustomerAdapter.swift +19 -19
  72. package/ios/EmbeddedPaymentElementView.swift +2 -2
  73. package/ios/Errors.swift +22 -23
  74. package/ios/FinancialConnections.swift +37 -37
  75. package/ios/Mappers.swift +210 -71
  76. package/ios/NavigationBarManager.m +13 -0
  77. package/ios/NavigationBarManager.swift +17 -0
  78. package/ios/NavigationBarView.swift +65 -0
  79. package/ios/NewArch/NavigationBarComponentView.h +10 -0
  80. package/ios/NewArch/NavigationBarComponentView.mm +86 -0
  81. package/ios/OldArch/StripeSdkEventEmitterCompat.h +1 -0
  82. package/ios/OldArch/StripeSdkEventEmitterCompat.m +7 -1
  83. package/ios/PaymentMethodFactory.swift +24 -24
  84. package/ios/PaymentOptionDisplayData+ReactNative.swift +4 -4
  85. package/ios/PaymentPassFinder.swift +9 -10
  86. package/ios/PaymentSheetAppearance.swift +137 -138
  87. package/ios/PushProvisioning/AddToWalletButtonManager.swift +2 -2
  88. package/ios/PushProvisioning/AddToWalletButtonView.swift +15 -17
  89. package/ios/PushProvisioning/PushProvisioningUtils.swift +11 -11
  90. package/ios/StripeContainerManager.swift +1 -1
  91. package/ios/StripeContainerView.swift +3 -3
  92. package/ios/StripeOnrampSdk.h +17 -0
  93. package/ios/StripeOnrampSdk.mm +158 -0
  94. package/ios/StripeSdk.mm +8 -0
  95. package/ios/StripeSdkEmitter.swift +4 -0
  96. package/ios/StripeSdkImpl+CustomerSheet.swift +30 -25
  97. package/ios/StripeSdkImpl+Embedded.swift +11 -9
  98. package/ios/StripeSdkImpl+PaymentSheet.swift +36 -34
  99. package/ios/StripeSdkImpl.swift +913 -185
  100. package/ios/UIColorExtension.swift +72 -0
  101. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  102. package/lib/commonjs/components/AddressSheet.js +1 -1
  103. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  104. package/lib/commonjs/components/CardField.js +1 -1
  105. package/lib/commonjs/components/CardField.js.map +1 -1
  106. package/lib/commonjs/components/CardForm.js +1 -1
  107. package/lib/commonjs/components/CardForm.js.map +1 -1
  108. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  109. package/lib/commonjs/components/StripeContainer.js +1 -1
  110. package/lib/commonjs/components/StripeProvider.js +1 -1
  111. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  112. package/lib/commonjs/connect/Components.js +2 -0
  113. package/lib/commonjs/connect/Components.js.map +1 -0
  114. package/lib/commonjs/connect/ConnectComponentsProvider.js +2 -0
  115. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -0
  116. package/lib/commonjs/connect/EmbeddedComponent.js +19 -0
  117. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -0
  118. package/lib/commonjs/connect/ModalCloseButton.js +2 -0
  119. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -0
  120. package/lib/commonjs/connect/NavigationBar.js +2 -0
  121. package/lib/commonjs/connect/NavigationBar.js.map +1 -0
  122. package/lib/commonjs/connect/connectTypes.js +2 -0
  123. package/lib/commonjs/connect/connectTypes.js.map +1 -0
  124. package/lib/commonjs/events.js +1 -1
  125. package/lib/commonjs/events.js.map +1 -1
  126. package/lib/commonjs/helpers.js +1 -1
  127. package/lib/commonjs/helpers.js.map +1 -1
  128. package/lib/commonjs/hooks/useOnramp.js +2 -0
  129. package/lib/commonjs/hooks/useOnramp.js.map +1 -0
  130. package/lib/commonjs/index.js +1 -1
  131. package/lib/commonjs/index.js.map +1 -1
  132. package/lib/commonjs/plugin/withStripe.js +1 -1
  133. package/lib/commonjs/plugin/withStripe.js.map +1 -1
  134. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  135. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  136. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  137. package/lib/commonjs/specs/NativeAddressSheet.js.map +1 -1
  138. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  139. package/lib/commonjs/specs/NativeApplePayButton.js.map +1 -1
  140. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  141. package/lib/commonjs/specs/NativeAuBECSDebitForm.js.map +1 -1
  142. package/lib/commonjs/specs/NativeCardField.js +1 -1
  143. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  144. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  145. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  146. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +2 -0
  147. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  148. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  149. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  150. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  151. package/lib/commonjs/specs/NativeGooglePayButton.js.map +1 -1
  152. package/lib/commonjs/specs/NativeNavigationBar.js +2 -0
  153. package/lib/commonjs/specs/NativeNavigationBar.js.map +1 -0
  154. package/lib/commonjs/specs/NativeOnrampSdkModule.js +2 -0
  155. package/lib/commonjs/specs/NativeOnrampSdkModule.js.map +1 -0
  156. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  157. package/lib/commonjs/specs/NativeStripeContainer.js.map +1 -1
  158. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  159. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  160. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  161. package/lib/commonjs/types/Errors.js +1 -1
  162. package/lib/commonjs/types/Errors.js.map +1 -1
  163. package/lib/commonjs/types/Onramp.js +2 -0
  164. package/lib/commonjs/types/Onramp.js.map +1 -0
  165. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  166. package/lib/commonjs/types/index.js +1 -1
  167. package/lib/commonjs/types/index.js.map +1 -1
  168. package/lib/module/components/AddToWalletButton.js +1 -1
  169. package/lib/module/components/AddressSheet.js +1 -1
  170. package/lib/module/components/AuBECSDebitForm.js +1 -1
  171. package/lib/module/components/CardField.js +1 -1
  172. package/lib/module/components/CardField.js.map +1 -1
  173. package/lib/module/components/CardForm.js +1 -1
  174. package/lib/module/components/CardForm.js.map +1 -1
  175. package/lib/module/components/PlatformPayButton.js +1 -1
  176. package/lib/module/components/StripeContainer.js +1 -1
  177. package/lib/module/components/StripeProvider.js +1 -1
  178. package/lib/module/components/StripeProvider.js.map +1 -1
  179. package/lib/module/connect/Components.js +2 -0
  180. package/lib/module/connect/Components.js.map +1 -0
  181. package/lib/module/connect/ConnectComponentsProvider.js +2 -0
  182. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -0
  183. package/lib/module/connect/EmbeddedComponent.js +19 -0
  184. package/lib/module/connect/EmbeddedComponent.js.map +1 -0
  185. package/lib/module/connect/ModalCloseButton.js +2 -0
  186. package/lib/module/connect/ModalCloseButton.js.map +1 -0
  187. package/lib/module/connect/NavigationBar.js +2 -0
  188. package/lib/module/connect/NavigationBar.js.map +1 -0
  189. package/lib/module/connect/connectTypes.js +2 -0
  190. package/lib/module/connect/connectTypes.js.map +1 -0
  191. package/lib/module/events.js +1 -1
  192. package/lib/module/events.js.map +1 -1
  193. package/lib/module/helpers.js +1 -1
  194. package/lib/module/helpers.js.map +1 -1
  195. package/lib/module/hooks/useOnramp.js +2 -0
  196. package/lib/module/hooks/useOnramp.js.map +1 -0
  197. package/lib/module/index.js +1 -1
  198. package/lib/module/index.js.map +1 -1
  199. package/lib/module/plugin/withStripe.js +1 -1
  200. package/lib/module/plugin/withStripe.js.map +1 -1
  201. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  202. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  203. package/lib/module/specs/NativeAddressSheet.js +1 -1
  204. package/lib/module/specs/NativeAddressSheet.js.map +1 -1
  205. package/lib/module/specs/NativeApplePayButton.js +1 -1
  206. package/lib/module/specs/NativeApplePayButton.js.map +1 -1
  207. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  208. package/lib/module/specs/NativeAuBECSDebitForm.js.map +1 -1
  209. package/lib/module/specs/NativeCardField.js +1 -1
  210. package/lib/module/specs/NativeCardField.js.map +1 -1
  211. package/lib/module/specs/NativeCardForm.js +1 -1
  212. package/lib/module/specs/NativeCardForm.js.map +1 -1
  213. package/lib/module/specs/NativeConnectAccountOnboardingView.js +2 -0
  214. package/lib/module/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  215. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  216. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  217. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  218. package/lib/module/specs/NativeGooglePayButton.js.map +1 -1
  219. package/lib/module/specs/NativeNavigationBar.js +2 -0
  220. package/lib/module/specs/NativeNavigationBar.js.map +1 -0
  221. package/lib/module/specs/NativeOnrampSdkModule.js +2 -0
  222. package/lib/module/specs/NativeOnrampSdkModule.js.map +1 -0
  223. package/lib/module/specs/NativeStripeContainer.js +1 -1
  224. package/lib/module/specs/NativeStripeContainer.js.map +1 -1
  225. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  226. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  227. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  228. package/lib/module/types/Errors.js +1 -1
  229. package/lib/module/types/Errors.js.map +1 -1
  230. package/lib/module/types/Onramp.js +2 -0
  231. package/lib/module/types/Onramp.js.map +1 -0
  232. package/lib/module/types/PaymentSheet.js.map +1 -1
  233. package/lib/module/types/index.js +1 -1
  234. package/lib/module/types/index.js.map +1 -1
  235. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  236. package/lib/typescript/src/connect/Components.d.ts +23 -0
  237. package/lib/typescript/src/connect/Components.d.ts.map +1 -0
  238. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts +22 -0
  239. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts.map +1 -0
  240. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +18 -0
  241. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -0
  242. package/lib/typescript/src/connect/ModalCloseButton.d.ts +7 -0
  243. package/lib/typescript/src/connect/ModalCloseButton.d.ts.map +1 -0
  244. package/lib/typescript/src/connect/NavigationBar.d.ts +8 -0
  245. package/lib/typescript/src/connect/NavigationBar.d.ts.map +1 -0
  246. package/lib/typescript/src/connect/connectTypes.d.ts +464 -0
  247. package/lib/typescript/src/connect/connectTypes.d.ts.map +1 -0
  248. package/lib/typescript/src/events.d.ts +3 -0
  249. package/lib/typescript/src/events.d.ts.map +1 -1
  250. package/lib/typescript/src/functions.d.ts.map +1 -1
  251. package/lib/typescript/src/helpers.d.ts.map +1 -1
  252. package/lib/typescript/src/hooks/useOnramp.d.ts +158 -0
  253. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -0
  254. package/lib/typescript/src/index.d.ts +4 -0
  255. package/lib/typescript/src/index.d.ts.map +1 -1
  256. package/lib/typescript/src/plugin/withStripe.d.ts +15 -0
  257. package/lib/typescript/src/plugin/withStripe.d.ts.map +1 -1
  258. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts +14 -0
  259. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts.map +1 -0
  260. package/lib/typescript/src/specs/NativeNavigationBar.d.ts +11 -0
  261. package/lib/typescript/src/specs/NativeNavigationBar.d.ts.map +1 -0
  262. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +28 -0
  263. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -0
  264. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +3 -0
  265. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  266. package/lib/typescript/src/types/Errors.d.ts +5 -0
  267. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  268. package/lib/typescript/src/types/Onramp.d.ts +275 -0
  269. package/lib/typescript/src/types/Onramp.d.ts.map +1 -0
  270. package/lib/typescript/src/types/PaymentSheet.d.ts +7 -0
  271. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  272. package/lib/typescript/src/types/index.d.ts +7 -1
  273. package/lib/typescript/src/types/index.d.ts.map +1 -1
  274. package/package.json +24 -12
  275. package/src/components/StripeProvider.tsx +5 -0
  276. package/src/connect/Components.tsx +279 -0
  277. package/src/connect/ConnectComponentsProvider.tsx +93 -0
  278. package/src/connect/EmbeddedComponent.tsx +407 -0
  279. package/src/connect/ModalCloseButton.tsx +44 -0
  280. package/src/connect/NavigationBar.tsx +29 -0
  281. package/src/connect/connectTypes.ts +626 -0
  282. package/src/events.ts +22 -0
  283. package/src/hooks/useOnramp.tsx +334 -0
  284. package/src/index.tsx +13 -0
  285. package/src/plugin/withStripe.ts +104 -7
  286. package/src/specs/NativeConnectAccountOnboardingView.ts +19 -0
  287. package/src/specs/NativeNavigationBar.ts +16 -0
  288. package/src/specs/NativeOnrampSdkModule.ts +47 -0
  289. package/src/specs/NativeStripeSdkModule.ts +5 -0
  290. package/src/types/Errors.ts +6 -0
  291. package/src/types/Onramp.ts +317 -0
  292. package/src/types/PaymentSheet.ts +7 -0
  293. package/src/types/index.ts +8 -0
  294. package/stripe-react-native.podspec +20 -7
@@ -0,0 +1,922 @@
1
+ package com.reactnativestripesdk
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.app.Application
5
+ import androidx.activity.ComponentActivity
6
+ import androidx.compose.ui.graphics.Color
7
+ import androidx.core.content.ContextCompat
8
+ import androidx.fragment.app.FragmentActivity
9
+ import androidx.lifecycle.SavedStateHandle
10
+ import com.facebook.react.bridge.Arguments
11
+ import com.facebook.react.bridge.Promise
12
+ import com.facebook.react.bridge.ReactApplicationContext
13
+ import com.facebook.react.bridge.ReactMethod
14
+ import com.facebook.react.bridge.ReadableMap
15
+ import com.facebook.react.bridge.WritableNativeMap
16
+ import com.facebook.react.module.annotations.ReactModule
17
+ import com.reactnativestripesdk.utils.ErrorType
18
+ import com.reactnativestripesdk.utils.createCanceledError
19
+ import com.reactnativestripesdk.utils.createEmptyResult
20
+ import com.reactnativestripesdk.utils.createError
21
+ import com.reactnativestripesdk.utils.createFailedError
22
+ import com.reactnativestripesdk.utils.createMissingActivityError
23
+ import com.reactnativestripesdk.utils.createMissingInitError
24
+ import com.reactnativestripesdk.utils.createOnrampNotConfiguredError
25
+ import com.reactnativestripesdk.utils.createResult
26
+ import com.reactnativestripesdk.utils.getValOr
27
+ import com.reactnativestripesdk.utils.mapToPaymentSheetAddress
28
+ import com.stripe.android.crypto.onramp.OnrampCoordinator
29
+ import com.stripe.android.crypto.onramp.model.CryptoNetwork
30
+ import com.stripe.android.crypto.onramp.model.KycInfo
31
+ import com.stripe.android.crypto.onramp.model.LinkUserInfo
32
+ import com.stripe.android.crypto.onramp.model.OnrampAttachKycInfoResult
33
+ import com.stripe.android.crypto.onramp.model.OnrampAuthenticateResult
34
+ import com.stripe.android.crypto.onramp.model.OnrampAuthorizeResult
35
+ import com.stripe.android.crypto.onramp.model.OnrampCallbacks
36
+ import com.stripe.android.crypto.onramp.model.OnrampCheckoutResult
37
+ import com.stripe.android.crypto.onramp.model.OnrampCollectPaymentMethodResult
38
+ import com.stripe.android.crypto.onramp.model.OnrampConfiguration
39
+ import com.stripe.android.crypto.onramp.model.OnrampConfigurationResult
40
+ import com.stripe.android.crypto.onramp.model.OnrampCreateCryptoPaymentTokenResult
41
+ import com.stripe.android.crypto.onramp.model.OnrampHasLinkAccountResult
42
+ import com.stripe.android.crypto.onramp.model.OnrampLogOutResult
43
+ import com.stripe.android.crypto.onramp.model.OnrampRegisterLinkUserResult
44
+ import com.stripe.android.crypto.onramp.model.OnrampRegisterWalletAddressResult
45
+ import com.stripe.android.crypto.onramp.model.OnrampTokenAuthenticationResult
46
+ import com.stripe.android.crypto.onramp.model.OnrampUpdatePhoneNumberResult
47
+ import com.stripe.android.crypto.onramp.model.OnrampVerifyIdentityResult
48
+ import com.stripe.android.crypto.onramp.model.OnrampVerifyKycInfoResult
49
+ import com.stripe.android.crypto.onramp.model.PaymentMethodType
50
+ import com.stripe.android.link.LinkAppearance
51
+ import com.stripe.android.link.LinkAppearance.Colors
52
+ import com.stripe.android.link.LinkAppearance.PrimaryButton
53
+ import com.stripe.android.link.LinkAppearance.Style
54
+ import com.stripe.android.link.LinkController.PaymentMethodPreview
55
+ import com.stripe.android.link.PaymentMethodPreviewDetails
56
+ import com.stripe.android.model.CardBrand
57
+ import com.stripe.android.model.DateOfBirth
58
+ import com.stripe.android.paymentsheet.PaymentSheet
59
+ import kotlinx.coroutines.CompletableDeferred
60
+ import kotlinx.coroutines.CoroutineScope
61
+ import kotlinx.coroutines.Dispatchers
62
+ import kotlinx.coroutines.launch
63
+ import kotlinx.coroutines.withContext
64
+
65
+ @SuppressLint("RestrictedApi")
66
+ @ReactModule(name = NativeOnrampSdkModuleSpec.NAME)
67
+ class OnrampSdkModule(
68
+ reactContext: ReactApplicationContext,
69
+ ) : NativeOnrampSdkModuleSpec(reactContext) {
70
+ private lateinit var publishableKey: String
71
+ private var stripeAccountId: String? = null
72
+
73
+ private var onrampCoordinator: OnrampCoordinator? = null
74
+ private var onrampPresenter: OnrampCoordinator.Presenter? = null
75
+
76
+ private var authenticateUserPromise: Promise? = null
77
+ private var identityVerificationPromise: Promise? = null
78
+ private var collectPaymentPromise: Promise? = null
79
+ private var authorizePromise: Promise? = null
80
+ private var checkoutPromise: Promise? = null
81
+ private var verifyKycPromise: Promise? = null
82
+
83
+ private var checkoutClientSecretDeferred: CompletableDeferred<String>? = null
84
+
85
+ @ReactMethod
86
+ override fun initialise(
87
+ params: ReadableMap,
88
+ promise: Promise,
89
+ ) {
90
+ // Note: This method depends on `StripeSdkModule#initialise()` being called as well.
91
+ val publishableKey = getValOr(params, "publishableKey", null) as String
92
+ this.stripeAccountId = getValOr(params, "stripeAccountId", null)
93
+ this.publishableKey = publishableKey
94
+
95
+ promise.resolve(null)
96
+ }
97
+
98
+ /**
99
+ * Safely get and cast the current activity as an AppCompatActivity. If that fails, the promise
100
+ * provided will be resolved with an error message instructing the user to retry the method.
101
+ */
102
+ private fun getCurrentActivityOrResolveWithError(promise: Promise?): FragmentActivity? {
103
+ (reactApplicationContext.currentActivity as? FragmentActivity)?.let {
104
+ return it
105
+ }
106
+ promise?.resolve(createMissingActivityError())
107
+ return null
108
+ }
109
+
110
+ @ReactMethod
111
+ override fun configureOnramp(
112
+ config: ReadableMap,
113
+ promise: Promise,
114
+ ) {
115
+ if (!::publishableKey.isInitialized) {
116
+ promise.resolve(createMissingInitError())
117
+ return
118
+ }
119
+
120
+ val application =
121
+ reactApplicationContext.currentActivity?.application ?: (reactApplicationContext.applicationContext as? Application)
122
+ if (application == null) {
123
+ promise.resolve(createMissingActivityError())
124
+ return
125
+ }
126
+
127
+ val coordinator =
128
+ onrampCoordinator ?: OnrampCoordinator
129
+ .Builder()
130
+ .build(application, SavedStateHandle())
131
+ .also { this.onrampCoordinator = it }
132
+
133
+ CoroutineScope(Dispatchers.IO).launch {
134
+ val appearanceMap = config.getMap("appearance")
135
+ val appearance =
136
+ if (appearanceMap != null) {
137
+ mapAppearance(appearanceMap)
138
+ } else {
139
+ LinkAppearance(style = Style.AUTOMATIC)
140
+ }
141
+
142
+ val displayName = config.getString("merchantDisplayName") ?: ""
143
+
144
+ val cryptoCustomerId = config.getString("cryptoCustomerId")
145
+
146
+ val configuration =
147
+ OnrampConfiguration(
148
+ merchantDisplayName = displayName,
149
+ publishableKey = publishableKey,
150
+ appearance = appearance,
151
+ cryptoCustomerId = cryptoCustomerId,
152
+ )
153
+
154
+ val configureResult = coordinator.configure(configuration)
155
+
156
+ CoroutineScope(Dispatchers.Main).launch {
157
+ when (configureResult) {
158
+ is OnrampConfigurationResult.Completed -> {
159
+ createOnrampPresenter(promise)
160
+ }
161
+ is OnrampConfigurationResult.Failed -> {
162
+ promise.resolve(createError(ErrorType.Failed.toString(), configureResult.error))
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ @ReactMethod
170
+ private fun createOnrampPresenter(promise: Promise) {
171
+ val activity = getCurrentActivityOrResolveWithError(promise) as? ComponentActivity
172
+ if (activity == null) {
173
+ promise.resolve(createMissingActivityError())
174
+ return
175
+ }
176
+ if (onrampCoordinator == null) {
177
+ promise.resolve(createMissingInitError())
178
+ return
179
+ }
180
+ if (onrampPresenter != null) {
181
+ promise.resolveVoid()
182
+ return
183
+ }
184
+
185
+ val onrampCallbacks =
186
+ OnrampCallbacks(
187
+ authenticateUserCallback = { result ->
188
+ handleOnrampAuthenticationResult(result, authenticateUserPromise!!)
189
+ },
190
+ verifyIdentityCallback = { result ->
191
+ handleOnrampIdentityVerificationResult(result, identityVerificationPromise!!)
192
+ },
193
+ collectPaymentCallback = { result ->
194
+ handleOnrampCollectPaymentResult(result, collectPaymentPromise!!)
195
+ },
196
+ authorizeCallback = { result ->
197
+ handleOnrampAuthorizationResult(result, authorizePromise!!)
198
+ },
199
+ checkoutCallback = { result ->
200
+ handleOnrampCheckoutResult(result, checkoutPromise!!)
201
+ },
202
+ verifyKycCallback = { result ->
203
+ handleOnrampKycVerificationResult(result, verifyKycPromise!!)
204
+ },
205
+ )
206
+
207
+ try {
208
+ onrampPresenter = onrampCoordinator!!.createPresenter(activity, onrampCallbacks)
209
+ promise.resolveVoid()
210
+ } catch (e: Exception) {
211
+ promise.resolve(createFailedError(e))
212
+ }
213
+ }
214
+
215
+ @ReactMethod
216
+ override fun hasLinkAccount(
217
+ email: String,
218
+ promise: Promise,
219
+ ) {
220
+ val coordinator =
221
+ onrampCoordinator ?: run {
222
+ promise.resolve(createOnrampNotConfiguredError())
223
+ return
224
+ }
225
+ CoroutineScope(Dispatchers.IO).launch {
226
+ when (val result = coordinator.hasLinkAccount(email)) {
227
+ is OnrampHasLinkAccountResult.Completed -> {
228
+ promise.resolveBoolean("hasLinkAccount", result.hasLinkAccount)
229
+ }
230
+ is OnrampHasLinkAccountResult.Failed -> {
231
+ promise.resolve(createFailedError(result.error))
232
+ }
233
+ }
234
+ }
235
+ }
236
+
237
+ @ReactMethod
238
+ override fun registerLinkUser(
239
+ info: ReadableMap,
240
+ promise: Promise,
241
+ ) {
242
+ val coordinator =
243
+ onrampCoordinator ?: run {
244
+ promise.resolve(createOnrampNotConfiguredError())
245
+ return
246
+ }
247
+ CoroutineScope(Dispatchers.IO).launch {
248
+ val linkUserInfo =
249
+ LinkUserInfo(
250
+ email = info.getString("email") ?: "",
251
+ phone = info.getString("phone") ?: "",
252
+ country = info.getString("country") ?: "",
253
+ fullName = info.getString("fullName"),
254
+ )
255
+
256
+ val result = coordinator.registerLinkUser(linkUserInfo)
257
+ when (result) {
258
+ is OnrampRegisterLinkUserResult.Completed -> {
259
+ promise.resolveString("customerId", result.customerId)
260
+ }
261
+ is OnrampRegisterLinkUserResult.Failed -> {
262
+ promise.resolve(createFailedError(result.error))
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ @ReactMethod
269
+ override fun registerWalletAddress(
270
+ walletAddress: String,
271
+ network: String,
272
+ promise: Promise,
273
+ ) {
274
+ val coordinator =
275
+ onrampCoordinator ?: run {
276
+ promise.resolve(createOnrampNotConfiguredError())
277
+ return
278
+ }
279
+ CoroutineScope(Dispatchers.IO).launch {
280
+ val cryptoNetwork = enumValues<CryptoNetwork>().firstOrNull { it.value == network }
281
+ if (cryptoNetwork == null) {
282
+ promise.resolve(createError(ErrorType.Unknown.toString(), "Invalid network: $network"))
283
+ return@launch
284
+ }
285
+
286
+ when (val result = coordinator.registerWalletAddress(walletAddress, cryptoNetwork)) {
287
+ is OnrampRegisterWalletAddressResult.Completed -> {
288
+ promise.resolveVoid()
289
+ }
290
+ is OnrampRegisterWalletAddressResult.Failed -> {
291
+ promise.resolve(createFailedError(result.error))
292
+ }
293
+ }
294
+ }
295
+ }
296
+
297
+ @ReactMethod
298
+ override fun attachKycInfo(
299
+ kycInfo: ReadableMap,
300
+ promise: Promise,
301
+ ) {
302
+ val coordinator =
303
+ onrampCoordinator ?: run {
304
+ promise.resolve(createOnrampNotConfiguredError())
305
+ return
306
+ }
307
+ CoroutineScope(Dispatchers.IO).launch {
308
+ val firstName = kycInfo.getString("firstName")
309
+ if (firstName.isNullOrEmpty()) {
310
+ promise.resolve(
311
+ createError(
312
+ ErrorType.Unknown.toString(),
313
+ "Missing required field: firstName",
314
+ ),
315
+ )
316
+ return@launch
317
+ }
318
+ val lastName = kycInfo.getString("lastName")
319
+ if (lastName.isNullOrEmpty()) {
320
+ promise.resolve(
321
+ createError(
322
+ ErrorType.Unknown.toString(),
323
+ "Missing required field: lastName",
324
+ ),
325
+ )
326
+ return@launch
327
+ }
328
+ val idNumber = kycInfo.getString("idNumber")
329
+ if (idNumber.isNullOrEmpty()) {
330
+ promise.resolve(
331
+ createError(
332
+ ErrorType.Unknown.toString(),
333
+ "Missing required field: idNumber",
334
+ ),
335
+ )
336
+ return@launch
337
+ }
338
+
339
+ val dateOfBirthMap = kycInfo.getMap("dateOfBirth")
340
+ val dob =
341
+ if (
342
+ dateOfBirthMap != null &&
343
+ dateOfBirthMap.hasKey("day") &&
344
+ dateOfBirthMap.hasKey("month") &&
345
+ dateOfBirthMap.hasKey("year")
346
+ ) {
347
+ DateOfBirth(
348
+ day = dateOfBirthMap.getInt("day"),
349
+ month = dateOfBirthMap.getInt("month"),
350
+ year = dateOfBirthMap.getInt("year"),
351
+ )
352
+ } else {
353
+ promise.resolve(
354
+ createError(
355
+ ErrorType.Unknown.toString(),
356
+ "Missing required field: dateOfBirth",
357
+ ),
358
+ )
359
+ return@launch
360
+ }
361
+
362
+ val addressMap = kycInfo.getMap("address")
363
+ val addressObj = mapToPaymentSheetAddress(addressMap) ?: PaymentSheet.Address()
364
+
365
+ val kycInfoObj =
366
+ KycInfo(
367
+ firstName = firstName,
368
+ lastName = lastName,
369
+ idNumber = idNumber,
370
+ dateOfBirth = dob,
371
+ address = addressObj,
372
+ )
373
+
374
+ when (val result = coordinator.attachKycInfo(kycInfoObj)) {
375
+ is OnrampAttachKycInfoResult.Completed -> {
376
+ promise.resolveVoid()
377
+ }
378
+ is OnrampAttachKycInfoResult.Failed -> {
379
+ promise.resolve(createFailedError(result.error))
380
+ }
381
+ }
382
+ }
383
+ }
384
+
385
+ @ReactMethod
386
+ override fun updatePhoneNumber(
387
+ phone: String,
388
+ promise: Promise,
389
+ ) {
390
+ val coordinator =
391
+ onrampCoordinator ?: run {
392
+ promise.resolve(createOnrampNotConfiguredError())
393
+ return
394
+ }
395
+ CoroutineScope(Dispatchers.IO).launch {
396
+ when (val result = coordinator.updatePhoneNumber(phone)) {
397
+ OnrampUpdatePhoneNumberResult.Completed -> {
398
+ promise.resolveVoid()
399
+ }
400
+ is OnrampUpdatePhoneNumberResult.Failed -> {
401
+ promise.resolve(createFailedError(result.error))
402
+ }
403
+ }
404
+ }
405
+ }
406
+
407
+ @ReactMethod
408
+ override fun authenticateUser(promise: Promise) {
409
+ val presenter =
410
+ onrampPresenter ?: run {
411
+ promise.resolve(createOnrampNotConfiguredError())
412
+ return
413
+ }
414
+
415
+ authenticateUserPromise = promise
416
+
417
+ presenter.authenticateUser()
418
+ }
419
+
420
+ @ReactMethod
421
+ override fun verifyIdentity(promise: Promise) {
422
+ val presenter =
423
+ onrampPresenter ?: run {
424
+ promise.resolve(createOnrampNotConfiguredError())
425
+ return
426
+ }
427
+
428
+ identityVerificationPromise = promise
429
+
430
+ presenter.verifyIdentity()
431
+ }
432
+
433
+ @ReactMethod
434
+ override fun presentKycInfoVerification(
435
+ updatedAddress: ReadableMap?,
436
+ promise: Promise,
437
+ ) {
438
+ val presenter =
439
+ onrampPresenter ?: run {
440
+ promise.resolve(createOnrampNotConfiguredError())
441
+ return
442
+ }
443
+
444
+ val address = mapToPaymentSheetAddress(updatedAddress)
445
+
446
+ verifyKycPromise = promise
447
+ presenter.verifyKycInfo(address)
448
+ }
449
+
450
+ @ReactMethod
451
+ override fun collectPaymentMethod(
452
+ paymentMethod: String,
453
+ platformPayParams: ReadableMap,
454
+ promise: Promise,
455
+ ) {
456
+ val presenter =
457
+ onrampPresenter ?: run {
458
+ promise.resolve(createOnrampNotConfiguredError())
459
+ return
460
+ }
461
+
462
+ val method =
463
+ when (paymentMethod) {
464
+ "Card" -> PaymentMethodType.Card
465
+ "BankAccount" -> PaymentMethodType.BankAccount
466
+ else -> {
467
+ promise.resolve(
468
+ createFailedError(
469
+ IllegalArgumentException("Unsupported payment method: $paymentMethod"),
470
+ ),
471
+ )
472
+ return
473
+ }
474
+ }
475
+
476
+ collectPaymentPromise = promise
477
+
478
+ presenter.collectPaymentMethod(method)
479
+ }
480
+
481
+ @ReactMethod
482
+ override fun createCryptoPaymentToken(promise: Promise) {
483
+ val coordinator =
484
+ onrampCoordinator ?: run {
485
+ promise.resolve(createOnrampNotConfiguredError())
486
+ return
487
+ }
488
+
489
+ CoroutineScope(Dispatchers.IO).launch {
490
+ val result = coordinator.createCryptoPaymentToken()
491
+ CoroutineScope(Dispatchers.Main).launch {
492
+ handleOnrampCreateCryptoPaymentTokenResult(result, promise)
493
+ }
494
+ }
495
+ }
496
+
497
+ @ReactMethod
498
+ override fun performCheckout(
499
+ onrampSessionId: String,
500
+ promise: Promise,
501
+ ) {
502
+ val presenter =
503
+ onrampPresenter ?: run {
504
+ promise.resolve(createOnrampNotConfiguredError())
505
+ return
506
+ }
507
+
508
+ val checkoutHandler: suspend () -> String = {
509
+ checkoutClientSecretDeferred = CompletableDeferred()
510
+
511
+ val params = Arguments.createMap()
512
+ params.putString("onrampSessionId", onrampSessionId)
513
+
514
+ emitOnCheckoutClientSecretRequested(params)
515
+
516
+ checkoutClientSecretDeferred!!.await()
517
+ }
518
+
519
+ checkoutPromise = promise
520
+
521
+ presenter.performCheckout(onrampSessionId, checkoutHandler)
522
+ }
523
+
524
+ @ReactMethod
525
+ override fun provideCheckoutClientSecret(clientSecret: String?) {
526
+ if (clientSecret != null) {
527
+ checkoutClientSecretDeferred?.complete(clientSecret)
528
+ } else {
529
+ checkoutClientSecretDeferred?.completeExceptionally(
530
+ RuntimeException("Failed to provide checkout client secret"),
531
+ )
532
+ }
533
+ checkoutClientSecretDeferred = null
534
+ }
535
+
536
+ @ReactMethod
537
+ override fun onrampAuthorize(
538
+ linkAuthIntentId: String,
539
+ promise: Promise,
540
+ ) {
541
+ val presenter =
542
+ onrampPresenter ?: run {
543
+ promise.resolve(createOnrampNotConfiguredError())
544
+ return
545
+ }
546
+
547
+ authorizePromise = promise
548
+
549
+ presenter.authorize(linkAuthIntentId)
550
+ }
551
+
552
+ @ReactMethod
553
+ override fun getCryptoTokenDisplayData(
554
+ token: ReadableMap,
555
+ promise: Promise,
556
+ ) {
557
+ val context = reactApplicationContext
558
+
559
+ val paymentDetails: PaymentMethodPreview? =
560
+ when {
561
+ token.hasKey("card") -> {
562
+ val cardMap = token.getMap("card")
563
+ if (cardMap != null) {
564
+ val brand = cardMap.getString("brand") ?: ""
565
+ val funding = cardMap.getString("funding") ?: ""
566
+ val last4 = cardMap.getString("last4") ?: ""
567
+ val cardBrand = CardBrand.fromCode(brand)
568
+
569
+ PaymentMethodPreview.create(
570
+ context = context,
571
+ details =
572
+ PaymentMethodPreviewDetails.Card(
573
+ brand = cardBrand,
574
+ funding = funding,
575
+ last4 = last4,
576
+ ),
577
+ )
578
+ } else {
579
+ null
580
+ }
581
+ }
582
+ token.hasKey("us_bank_account") -> {
583
+ val bankMap = token.getMap("us_bank_account")
584
+ if (bankMap != null) {
585
+ val bankName = bankMap.getString("bank_name")
586
+ val last4 = bankMap.getString("last4") ?: ""
587
+ PaymentMethodPreview.create(
588
+ context = context,
589
+ details =
590
+ PaymentMethodPreviewDetails.BankAccount(
591
+ bankIconCode = null,
592
+ bankName = bankName,
593
+ last4 = last4,
594
+ ),
595
+ )
596
+ } else {
597
+ null
598
+ }
599
+ }
600
+ else -> null
601
+ }
602
+
603
+ if (paymentDetails == null) {
604
+ promise.resolve(
605
+ createFailedError(
606
+ IllegalArgumentException("Unsupported payment method"),
607
+ ),
608
+ )
609
+ return
610
+ }
611
+
612
+ val icon =
613
+ reactApplicationContext.currentActivity
614
+ ?.let { ContextCompat.getDrawable(it, paymentDetails.iconRes) }
615
+ ?.let { "data:image/png;base64," + getBase64FromBitmap(getBitmapFromDrawable(it)) }
616
+
617
+ val displayData = Arguments.createMap()
618
+
619
+ displayData.putString("icon", icon)
620
+ displayData.putString("label", paymentDetails.label)
621
+ displayData.putString("sublabel", paymentDetails.sublabel)
622
+
623
+ promise.resolve(createResult("displayData", displayData))
624
+ }
625
+
626
+ @ReactMethod
627
+ override fun logout(promise: Promise) {
628
+ val coordinator =
629
+ onrampCoordinator ?: run {
630
+ promise.resolve(createOnrampNotConfiguredError())
631
+ return
632
+ }
633
+
634
+ CoroutineScope(Dispatchers.IO).launch {
635
+ val result = coordinator.logOut()
636
+ CoroutineScope(Dispatchers.Main).launch {
637
+ handleLogOutResult(result, promise)
638
+ }
639
+ }
640
+ }
641
+
642
+ @ReactMethod
643
+ override fun authenticateUserWithToken(
644
+ token: String,
645
+ promise: Promise,
646
+ ) {
647
+ val coordinator =
648
+ onrampCoordinator ?: run {
649
+ promise.resolve(createOnrampNotConfiguredError())
650
+ return
651
+ }
652
+
653
+ CoroutineScope(Dispatchers.IO).launch {
654
+ val result = coordinator.authenticateUserWithToken(token)
655
+
656
+ withContext(Dispatchers.Main) {
657
+ handleAuthenticateUserWithTokenResult(result, promise)
658
+ }
659
+ }
660
+ }
661
+
662
+ private fun mapAppearance(appearanceMap: ReadableMap): LinkAppearance {
663
+ val lightColorsMap = appearanceMap.getMap("lightColors")
664
+ val darkColorsMap = appearanceMap.getMap("darkColors")
665
+ val styleStr = appearanceMap.getString("style")
666
+ val primaryButtonMap = appearanceMap.getMap("primaryButton")
667
+
668
+ val lightColors =
669
+ if (lightColorsMap != null) {
670
+ val primaryColorStr = lightColorsMap.getString("primary")
671
+ val contentColorStr = lightColorsMap.getString("contentOnPrimary")
672
+ val borderSelectedColorStr = lightColorsMap.getString("borderSelected")
673
+
674
+ Colors(
675
+ primary = Color(android.graphics.Color.parseColor(primaryColorStr)),
676
+ contentOnPrimary = Color(android.graphics.Color.parseColor(contentColorStr)),
677
+ borderSelected = Color(android.graphics.Color.parseColor(borderSelectedColorStr)),
678
+ )
679
+ } else {
680
+ null
681
+ }
682
+
683
+ val darkColors =
684
+ if (darkColorsMap != null) {
685
+ val primaryColorStr = darkColorsMap.getString("primary")
686
+ val contentColorStr = darkColorsMap.getString("contentOnPrimary")
687
+ val borderSelectedColorStr = darkColorsMap.getString("borderSelected")
688
+
689
+ Colors(
690
+ primary = Color(android.graphics.Color.parseColor(primaryColorStr)),
691
+ contentOnPrimary = Color(android.graphics.Color.parseColor(contentColorStr)),
692
+ borderSelected = Color(android.graphics.Color.parseColor(borderSelectedColorStr)),
693
+ )
694
+ } else {
695
+ null
696
+ }
697
+
698
+ val style =
699
+ when (styleStr) {
700
+ "ALWAYS_LIGHT" -> Style.ALWAYS_LIGHT
701
+ "ALWAYS_DARK" -> Style.ALWAYS_DARK
702
+ else -> Style.AUTOMATIC
703
+ }
704
+
705
+ val primaryButton =
706
+ if (primaryButtonMap != null) {
707
+ PrimaryButton(
708
+ cornerRadiusDp =
709
+ if (primaryButtonMap.hasKey("cornerRadius")) {
710
+ primaryButtonMap.getDouble("cornerRadius").toFloat()
711
+ } else {
712
+ null
713
+ },
714
+ heightDp =
715
+ if (primaryButtonMap.hasKey("height")) {
716
+ primaryButtonMap.getDouble("height").toFloat()
717
+ } else {
718
+ null
719
+ },
720
+ )
721
+ } else {
722
+ null
723
+ }
724
+
725
+ val default = LinkAppearance(style = Style.AUTOMATIC)
726
+ return LinkAppearance(
727
+ lightColors = lightColors ?: default.lightColors,
728
+ darkColors = darkColors ?: default.darkColors,
729
+ style = style,
730
+ primaryButton = primaryButton ?: default.primaryButton,
731
+ )
732
+ }
733
+
734
+ private fun handleOnrampAuthenticationResult(
735
+ result: OnrampAuthenticateResult,
736
+ promise: Promise,
737
+ ) {
738
+ when (result) {
739
+ is OnrampAuthenticateResult.Completed -> {
740
+ promise.resolveString("customerId", result.customerId)
741
+ }
742
+ is OnrampAuthenticateResult.Cancelled -> {
743
+ promise.resolve(createCanceledError("Authentication was cancelled"))
744
+ }
745
+ is OnrampAuthenticateResult.Failed -> {
746
+ promise.resolve(createFailedError(result.error))
747
+ }
748
+ }
749
+ }
750
+
751
+ private fun handleOnrampIdentityVerificationResult(
752
+ result: OnrampVerifyIdentityResult,
753
+ promise: Promise,
754
+ ) {
755
+ when (result) {
756
+ is OnrampVerifyIdentityResult.Completed -> {
757
+ promise.resolveVoid()
758
+ }
759
+ is OnrampVerifyIdentityResult.Cancelled -> {
760
+ promise.resolve(createCanceledError("Identity verification was cancelled"))
761
+ }
762
+ is OnrampVerifyIdentityResult.Failed -> {
763
+ promise.resolve(createFailedError(result.error))
764
+ }
765
+ }
766
+ }
767
+
768
+ private fun handleOnrampKycVerificationResult(
769
+ result: OnrampVerifyKycInfoResult,
770
+ promise: Promise,
771
+ ) {
772
+ when (result) {
773
+ is OnrampVerifyKycInfoResult.Confirmed -> {
774
+ promise.resolve(
775
+ WritableNativeMap().apply { putString("status", "Confirmed") },
776
+ )
777
+ }
778
+ is OnrampVerifyKycInfoResult.UpdateAddress -> {
779
+ promise.resolve(
780
+ WritableNativeMap().apply { putString("status", "UpdateAddress") },
781
+ )
782
+ }
783
+ is OnrampVerifyKycInfoResult.Cancelled -> {
784
+ promise.resolve(createCanceledError("KYC verification was cancelled"))
785
+ }
786
+ is OnrampVerifyKycInfoResult.Failed -> {
787
+ promise.resolve(createFailedError(result.error))
788
+ }
789
+ }
790
+ }
791
+
792
+ private fun handleOnrampCollectPaymentResult(
793
+ result: OnrampCollectPaymentMethodResult,
794
+ promise: Promise,
795
+ ) {
796
+ when (result) {
797
+ is OnrampCollectPaymentMethodResult.Completed -> {
798
+ val displayData = Arguments.createMap()
799
+ val icon =
800
+ reactApplicationContext.currentActivity
801
+ ?.let { ContextCompat.getDrawable(it, result.displayData.iconRes) }
802
+ ?.let { "data:image/png;base64," + getBase64FromBitmap(getBitmapFromDrawable(it)) }
803
+ displayData.putString("icon", icon)
804
+ displayData.putString("label", result.displayData.label)
805
+ result.displayData.sublabel?.let { displayData.putString("sublabel", it) }
806
+ promise.resolve(createResult("displayData", displayData))
807
+ }
808
+ is OnrampCollectPaymentMethodResult.Cancelled -> {
809
+ promise.resolve(createCanceledError("Payment collection was cancelled"))
810
+ }
811
+ is OnrampCollectPaymentMethodResult.Failed -> {
812
+ promise.resolve(createFailedError(result.error))
813
+ }
814
+ }
815
+ }
816
+
817
+ private fun handleOnrampAuthorizationResult(
818
+ result: OnrampAuthorizeResult,
819
+ promise: Promise,
820
+ ) {
821
+ when (result) {
822
+ is OnrampAuthorizeResult.Consented -> {
823
+ promise.resolve(
824
+ WritableNativeMap().apply {
825
+ putString("status", "Consented")
826
+ putString("customerId", result.customerId)
827
+ },
828
+ )
829
+ }
830
+ is OnrampAuthorizeResult.Denied -> {
831
+ promise.resolve(
832
+ WritableNativeMap().apply {
833
+ putString("status", "Denied")
834
+ },
835
+ )
836
+ }
837
+ is OnrampAuthorizeResult.Canceled -> {
838
+ promise.resolve(createCanceledError("Authorization was cancelled"))
839
+ }
840
+ is OnrampAuthorizeResult.Failed -> {
841
+ promise.resolve(createFailedError(result.error))
842
+ }
843
+ }
844
+ }
845
+
846
+ private fun handleOnrampCheckoutResult(
847
+ result: OnrampCheckoutResult,
848
+ promise: Promise,
849
+ ) {
850
+ when (result) {
851
+ is OnrampCheckoutResult.Completed -> {
852
+ promise.resolveVoid()
853
+ }
854
+ is OnrampCheckoutResult.Canceled -> {
855
+ promise.resolve(createCanceledError("Checkout was cancelled"))
856
+ }
857
+ is OnrampCheckoutResult.Failed -> {
858
+ promise.resolve(createFailedError(result.error))
859
+ }
860
+ }
861
+ }
862
+
863
+ private fun handleOnrampCreateCryptoPaymentTokenResult(
864
+ result: OnrampCreateCryptoPaymentTokenResult,
865
+ promise: Promise,
866
+ ) {
867
+ when (result) {
868
+ is OnrampCreateCryptoPaymentTokenResult.Completed -> {
869
+ promise.resolveString("cryptoPaymentToken", result.cryptoPaymentToken)
870
+ }
871
+ is OnrampCreateCryptoPaymentTokenResult.Failed -> {
872
+ promise.resolve(createFailedError(result.error))
873
+ }
874
+ }
875
+ }
876
+
877
+ private fun handleLogOutResult(
878
+ result: OnrampLogOutResult,
879
+ promise: Promise,
880
+ ) {
881
+ when (result) {
882
+ is OnrampLogOutResult.Completed -> {
883
+ promise.resolveVoid()
884
+ }
885
+ is OnrampLogOutResult.Failed -> {
886
+ promise.resolve(createFailedError(result.error))
887
+ }
888
+ }
889
+ }
890
+
891
+ private fun handleAuthenticateUserWithTokenResult(
892
+ result: OnrampTokenAuthenticationResult,
893
+ promise: Promise,
894
+ ) {
895
+ when (result) {
896
+ is OnrampTokenAuthenticationResult.Completed -> {
897
+ promise.resolveVoid()
898
+ }
899
+ is OnrampTokenAuthenticationResult.Failed -> {
900
+ promise.resolve(createFailedError(result.error))
901
+ }
902
+ }
903
+ }
904
+
905
+ private fun Promise.resolveVoid() {
906
+ resolve(createEmptyResult())
907
+ }
908
+
909
+ private fun Promise.resolveString(
910
+ key: String,
911
+ value: String,
912
+ ) {
913
+ resolve(WritableNativeMap().apply { putString(key, value) })
914
+ }
915
+
916
+ private fun Promise.resolveBoolean(
917
+ key: String,
918
+ value: Boolean,
919
+ ) {
920
+ resolve(WritableNativeMap().apply { putBoolean(key, value) })
921
+ }
922
+ }