@primer-io/react-native 2.28.0-beta.1 → 2.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +4 -4
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +1 -1
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +5 -5
  6. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +8 -2
  7. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/cardRedirect/PrimerRNCardRedirectData.kt +1 -1
  8. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/phoneNumber/PrimerRNPhoneNumberData.kt +1 -1
  9. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/retailOutlets/PrimerRNRetailOutletData.kt +1 -1
  10. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/retailOutlets/RNRetailOutletsList.kt +1 -1
  11. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/{asset/PrimerRNAsset.kt → resource/Resources.kt} +41 -9
  12. package/android/src/main/java/com/primerioreactnative/components/manager/NativeViewContainer.kt +35 -0
  13. package/android/src/main/java/com/primerioreactnative/components/manager/ach/PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent.kt +4 -4
  14. package/android/src/main/java/com/primerioreactnative/components/manager/asset/PrimerRNHeadlessUniversalCheckoutAssetManager.kt +84 -2
  15. package/android/src/main/java/com/primerioreactnative/components/manager/banks/PrimerRNHeadlessUniversalCheckoutBanksComponent.kt +1 -1
  16. package/android/src/main/java/com/primerioreactnative/components/manager/googlePay/PrimerGooglePayButtonConstantsModule.kt +39 -0
  17. package/android/src/main/java/com/primerioreactnative/components/manager/googlePay/PrimerGooglePayButtonManager.kt +38 -0
  18. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerKlarnaPaymentViewManager.kt +15 -78
  19. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.kt +4 -4
  20. package/android/src/main/java/com/primerioreactnative/components/manager/nativeUi/PrimerRNHeadlessUniversalCheckoutNativeUiManager.kt +1 -1
  21. package/android/src/main/java/com/primerioreactnative/components/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +2 -2
  22. package/android/src/main/java/com/primerioreactnative/components/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +1 -1
  23. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +1 -1
  24. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +1 -1
  25. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +5 -10
  26. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +49 -37
  27. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsCollectableData.kt +1 -1
  28. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsStep.kt +1 -1
  29. package/android/src/main/java/com/primerioreactnative/extensions/PaymentInstrumentData.kt +29 -16
  30. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutAdditionalInfo.kt +7 -7
  31. package/android/src/main/java/com/primerioreactnative/extensions/PrimerIssuingBank.kt +1 -1
  32. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +4 -2
  33. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodOptionsRN.kt +48 -35
  34. package/android/src/main/java/com/primerioreactnative/extensions/PrimerUIOptionsRN.kt +11 -0
  35. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategory.kt +1 -1
  36. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategoryRN.kt +1 -1
  37. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCollectableData.kt +2 -2
  38. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentStep.kt +4 -4
  39. package/ios/Sources/DataModels/PrimerSettings+Extensions.swift +50 -7
  40. package/ios/Sources/Headless Universal Checkout/Managers/Assets Manager/RNTAssetsManager.m +7 -0
  41. package/ios/Sources/Headless Universal Checkout/Managers/Assets Manager/RNTAssetsManager.swift +162 -88
  42. package/ios/Sources/version.swift +1 -1
  43. package/lib/commonjs/HeadlessUniversalCheckout/Components/NativeResourceView.js +30 -0
  44. package/lib/commonjs/HeadlessUniversalCheckout/Components/NativeResourceView.js.map +1 -0
  45. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js +9 -0
  46. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js.map +1 -0
  47. package/lib/commonjs/HeadlessUniversalCheckout/Managers/AssetsManager.js +32 -0
  48. package/lib/commonjs/HeadlessUniversalCheckout/Managers/AssetsManager.js.map +1 -1
  49. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +6 -0
  50. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -1
  51. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +6 -0
  52. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -1
  53. package/lib/commonjs/HeadlessUniversalCheckout/Managers/VaultManager.js +24 -1
  54. package/lib/commonjs/HeadlessUniversalCheckout/Managers/VaultManager.js.map +1 -1
  55. package/lib/commonjs/index.js +20 -0
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/models/PrimerPaymentMethodResource.js +2 -0
  58. package/lib/{module/models/PrimerAsset.js.map → commonjs/models/PrimerPaymentMethodResource.js.map} +1 -1
  59. package/lib/module/HeadlessUniversalCheckout/Components/NativeResourceView.js +22 -0
  60. package/lib/module/HeadlessUniversalCheckout/Components/NativeResourceView.js.map +1 -0
  61. package/lib/module/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js +3 -0
  62. package/lib/module/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js.map +1 -0
  63. package/lib/module/HeadlessUniversalCheckout/Managers/AssetsManager.js +32 -0
  64. package/lib/module/HeadlessUniversalCheckout/Managers/AssetsManager.js.map +1 -1
  65. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +6 -0
  66. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -1
  67. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +6 -0
  68. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -1
  69. package/lib/module/HeadlessUniversalCheckout/Managers/VaultManager.js +24 -1
  70. package/lib/module/HeadlessUniversalCheckout/Managers/VaultManager.js.map +1 -1
  71. package/lib/module/index.js +6 -0
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/models/PrimerPaymentMethodResource.js +2 -0
  74. package/lib/{commonjs/models/PrimerAsset.js.map → module/models/PrimerPaymentMethodResource.js.map} +1 -1
  75. package/lib/typescript/HeadlessUniversalCheckout/Components/NativeResourceView.d.ts +11 -0
  76. package/lib/typescript/HeadlessUniversalCheckout/Components/NativeResourceView.d.ts.map +1 -0
  77. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.d.ts +6 -0
  78. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.d.ts.map +1 -0
  79. package/lib/typescript/HeadlessUniversalCheckout/Managers/AssetsManager.d.ts +10 -1
  80. package/lib/typescript/HeadlessUniversalCheckout/Managers/AssetsManager.d.ts.map +1 -1
  81. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts +16 -1
  82. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts.map +1 -1
  83. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts +14 -1
  84. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts.map +1 -1
  85. package/lib/typescript/HeadlessUniversalCheckout/Managers/VaultManager.d.ts.map +1 -1
  86. package/lib/typescript/index.d.ts +8 -1
  87. package/lib/typescript/index.d.ts.map +1 -1
  88. package/lib/typescript/models/PrimerPaymentMethodResource.d.ts +19 -0
  89. package/lib/typescript/models/PrimerPaymentMethodResource.d.ts.map +1 -0
  90. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts +10 -49
  91. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts.map +1 -1
  92. package/lib/typescript/models/PrimerSettings.d.ts +17 -4
  93. package/lib/typescript/models/PrimerSettings.d.ts.map +1 -1
  94. package/package.json +1 -1
  95. package/primer-io-react-native.podspec +1 -1
  96. package/src/HeadlessUniversalCheckout/Components/NativeResourceView.tsx +31 -0
  97. package/src/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.tsx +8 -0
  98. package/src/HeadlessUniversalCheckout/Managers/AssetsManager.ts +34 -1
  99. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.ts +24 -1
  100. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.ts +22 -1
  101. package/src/HeadlessUniversalCheckout/Managers/VaultManager.ts +22 -1
  102. package/src/index.tsx +9 -3
  103. package/src/models/PrimerPaymentMethodResource.ts +21 -0
  104. package/src/models/PrimerPaymentMethodTokenData.ts +10 -53
  105. package/src/models/PrimerSettings.ts +20 -5
  106. package/lib/commonjs/models/PrimerAsset.js +0 -2
  107. package/lib/module/models/PrimerAsset.js +0 -2
  108. package/lib/typescript/models/PrimerAsset.d.ts +0 -15
  109. package/lib/typescript/models/PrimerAsset.d.ts.map +0 -1
  110. package/src/models/PrimerAsset.ts +0 -14
@@ -1,8 +1,8 @@
1
- arguments=--init-script /var/folders/wt/mqwpc4jx2kjgqf88mzm5qvx40000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/wt/mqwpc4jx2kjgqf88mzm5qvx40000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
1
+ arguments=--init-script /var/folders/wt/mqwpc4jx2kjgqf88mzm5qvx40000gn/T/db3b08fc4a9ef609cb16b96b200fa13e563f396e9bb1ed0905fdab7bc3bc513b.gradle --init-script /var/folders/wt/mqwpc4jx2kjgqf88mzm5qvx40000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
2
2
  auto.sync=true
3
3
  build.scans.enabled=false
4
4
  connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
5
- connection.project.dir=../../example/android
5
+ connection.project.dir=
6
6
  eclipse.preferences.version=1
7
7
  gradle.user.home=
8
8
  java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home
@@ -154,7 +154,7 @@ dependencies {
154
154
  api 'com.facebook.react:react-native:+'
155
155
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
156
156
  implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
157
- implementation 'io.primer:android:2.32.0-express-checkout.1'
157
+ implementation 'io.primer:android:2.35.0'
158
158
  testImplementation 'io.mockk:mockk:1.13.11'
159
159
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
160
160
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
@@ -15,9 +15,9 @@ import io.primer.android.completion.PrimerResumeDecisionHandler
15
15
  import io.primer.android.domain.PrimerCheckoutData
16
16
  import io.primer.android.domain.action.models.PrimerClientSession
17
17
  import io.primer.android.domain.error.models.PrimerError
18
- import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
19
- import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
20
- import io.primer.android.domain.payments.additionalInfo.PromptPayCheckoutAdditionalInfo
18
+ import io.primer.android.vouchers.multibanco.MultibancoCheckoutAdditionalInfo
19
+ import io.primer.android.payments.core.additionalInfo.PrimerCheckoutAdditionalInfo
20
+ import io.primer.android.qrcode.QrCodeCheckoutAdditionalInfo
21
21
  import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
22
22
  import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
23
23
  import kotlinx.serialization.encodeToString
@@ -173,7 +173,7 @@ class PrimerRNEventListener : PrimerCheckoutListener {
173
173
 
174
174
  override fun onAdditionalInfoReceived(additionalInfo: PrimerCheckoutAdditionalInfo) {
175
175
  if (implementedRNCallbacks?.isOnCheckoutAdditionalInfoImplemented == true) {
176
- if (additionalInfo is PromptPayCheckoutAdditionalInfo) {
176
+ if (additionalInfo is QrCodeCheckoutAdditionalInfo) {
177
177
  sendEvent?.invoke(
178
178
  PrimerEvents.ON_CHECKOUT_RECEIVED_ADDITIONAL_INFO.eventName,
179
179
  JSONObject(Json.encodeToString(additionalInfo.toCheckoutAdditionalInfoRN())).apply {
@@ -8,7 +8,7 @@ import com.primerioreactnative.components.events.PrimerHeadlessUniversalCheckout
8
8
  import com.primerioreactnative.utils.PrimerHeadlessUniversalCheckoutImplementedRNCallbacks
9
9
  import com.primerioreactnative.utils.errorTo
10
10
  import com.primerioreactnative.utils.toWritableMap
11
- import io.primer.android.ExperimentalPrimerApi
11
+ import io.primer.android.core.ExperimentalPrimerApi
12
12
  import io.primer.android.components.PrimerHeadlessUniversalCheckout
13
13
  import kotlinx.serialization.decodeFromString
14
14
  import kotlinx.serialization.encodeToString
@@ -24,10 +24,10 @@ import io.primer.android.components.domain.core.models.PrimerHeadlessUniversalCh
24
24
  import io.primer.android.domain.PrimerCheckoutData
25
25
  import io.primer.android.domain.action.models.PrimerClientSession
26
26
  import io.primer.android.domain.error.models.PrimerError
27
- import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
28
- import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
29
- import io.primer.android.domain.payments.additionalInfo.PromptPayCheckoutAdditionalInfo
30
- import io.primer.android.domain.payments.additionalInfo.AchAdditionalInfo
27
+ import io.primer.android.vouchers.multibanco.MultibancoCheckoutAdditionalInfo
28
+ import io.primer.android.payments.core.additionalInfo.PrimerCheckoutAdditionalInfo
29
+ import io.primer.android.qrcode.QrCodeCheckoutAdditionalInfo
30
+ import io.primer.android.stripe.ach.api.additionalInfo.AchAdditionalInfo
31
31
  import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
32
32
  import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
33
33
  import io.primer.android.Primer
@@ -250,7 +250,7 @@ class PrimerRNHeadlessUniversalCheckoutListener(
250
250
  override fun onCheckoutAdditionalInfoReceived(additionalInfo: PrimerCheckoutAdditionalInfo) {
251
251
  if (implementedRNCallbacks?.isOnCheckoutAdditionalInfoImplemented == true) {
252
252
  when (additionalInfo) {
253
- is PromptPayCheckoutAdditionalInfo -> {
253
+ is QrCodeCheckoutAdditionalInfo -> {
254
254
  sendEvent?.invoke(
255
255
  PrimerHeadlessUniversalCheckoutEvent.ON_CHECKOUT_ADDITIONAL_INFO.eventName,
256
256
  JSONObject(json.encodeToString(additionalInfo.toCheckoutAdditionalInfoRN())).apply {
@@ -11,8 +11,10 @@ import com.primerioreactnative.components.manager.vault.PrimerRNHeadlessUniversa
11
11
  import com.primerioreactnative.components.manager.redirect.PrimerRNHeadlessUniversalCheckoutBanksComponent
12
12
  import com.primerioreactnative.components.manager.klarna.PrimerRNHeadlessUniversalCheckoutKlarnaComponent
13
13
  import com.primerioreactnative.components.manager.klarna.PrimerKlarnaPaymentViewManager
14
+ import com.primerioreactnative.components.manager.googlePay.PrimerGooglePayButtonManager
14
15
  import com.primerioreactnative.components.manager.ach.PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent
15
16
  import com.primerioreactnative.components.manager.ach.PrimerRNAchMandateManager
17
+ import com.primerioreactnative.components.manager.googlePay.PrimerGooglePayButtonConstantsModule
16
18
  import kotlinx.serialization.json.Json
17
19
 
18
20
  class ReactNativePackage : ReactPackage {
@@ -31,14 +33,18 @@ class ReactNativePackage : ReactPackage {
31
33
  PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent(reactContext),
32
34
  PrimerRNAchMandateManager(reactContext),
33
35
  //region Component with redirect components
34
- PrimerRNHeadlessUniversalCheckoutBanksComponent(reactContext)
36
+ PrimerRNHeadlessUniversalCheckoutBanksComponent(reactContext),
35
37
  //endregion
38
+ // region Google Pay Helpers
39
+ PrimerGooglePayButtonConstantsModule(reactContext),
40
+ // endregion
36
41
  )
37
42
  }
38
43
 
39
44
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
40
45
  return mutableListOf(
41
- PrimerKlarnaPaymentViewManager(reactContext)
46
+ PrimerKlarnaPaymentViewManager(),
47
+ PrimerGooglePayButtonManager()
42
48
  )
43
49
  }
44
50
  }
@@ -1,6 +1,6 @@
1
1
  package com.primerioreactnative.components.datamodels.manager.raw.cardRedirect
2
2
 
3
- import io.primer.android.components.domain.core.models.bancontact.PrimerBancontactCardData
3
+ import io.primer.android.bancontact.PrimerBancontactCardData
4
4
  import kotlinx.serialization.Serializable
5
5
 
6
6
  @Serializable
@@ -1,6 +1,6 @@
1
1
  package com.primerioreactnative.components.datamodels.manager.raw.phoneNumber
2
2
 
3
- import io.primer.android.components.domain.core.models.phoneNumber.PrimerPhoneNumberData
3
+ import io.primer.android.phoneNumber.PrimerPhoneNumberData
4
4
  import kotlinx.serialization.Serializable
5
5
 
6
6
  @Serializable
@@ -1,6 +1,6 @@
1
1
  package com.primerioreactnative.components.datamodels.manager.raw.retailOutlets
2
2
 
3
- import io.primer.android.components.domain.core.models.retailOutlet.PrimerRetailerData
3
+ import io.primer.android.PrimerRetailerData
4
4
  import kotlinx.serialization.Serializable
5
5
 
6
6
  @Serializable
@@ -1,6 +1,6 @@
1
1
  package com.primerioreactnative.components.datamodels.manager.raw.retailOutlets
2
2
 
3
- import io.primer.android.data.payments.configure.retailOutlets.RetailOutletsList
3
+ import io.primer.android.RetailOutletsList
4
4
  import kotlinx.serialization.Serializable
5
5
 
6
6
  @Serializable
@@ -6,24 +6,48 @@ import com.primerioreactnative.components.assets.AssetsManager
6
6
  import com.primerioreactnative.components.assets.AssetsManager.drawableToBitmap
7
7
  import com.primerioreactnative.components.assets.PaymentMethodAssetFileProvider.getFileForPaymentMethodAsset
8
8
  import io.primer.android.components.ui.assets.PrimerPaymentMethodAsset
9
+ import io.primer.android.components.ui.assets.PrimerPaymentMethodNativeView
9
10
  import kotlinx.serialization.Serializable
10
11
 
12
+ @Serializable
13
+ sealed interface PrimerRNPaymentMethodResource {
14
+ val paymentMethodType: String
15
+ val paymentMethodName: String
16
+
17
+ @Serializable
18
+ data class PrimerRNPaymentMethodAsset(
19
+ override val paymentMethodType: String,
20
+ override val paymentMethodName: String,
21
+ val paymentMethodLogo: PrimerRNPaymentMethodLogo,
22
+ val paymentMethodBackgroundColor: PrimerRNPaymentMethodBackgroundColor
23
+ ) : PrimerRNPaymentMethodResource
24
+
25
+ @Serializable
26
+ data class PrimerRNPaymentMethodNativeView(
27
+ override val paymentMethodType: String,
28
+ override val paymentMethodName: String,
29
+ val nativeViewName: String
30
+ ) : PrimerRNPaymentMethodResource
31
+ }
32
+
11
33
  @Serializable
12
34
  data class PrimerRNPaymentMethodAssets(
13
- val paymentMethodAssets: List<PrimerRNPaymentMethodAsset>
35
+ val paymentMethodAssets: List<PrimerRNPaymentMethodResource.PrimerRNPaymentMethodAsset>
36
+ )
37
+
38
+ @Serializable
39
+ data class PrimerRNPaymentMethodResources(
40
+ val paymentMethodResources: List<PrimerRNPaymentMethodResource>
14
41
  )
15
42
 
16
43
  @Serializable
17
44
  data class PrimerRNPaymentMethodAssetWrapper(
18
- val paymentMethodAsset: PrimerRNPaymentMethodAsset
45
+ val paymentMethodAsset: PrimerRNPaymentMethodResource.PrimerRNPaymentMethodAsset
19
46
  )
20
47
 
21
48
  @Serializable
22
- data class PrimerRNPaymentMethodAsset(
23
- val paymentMethodType: String,
24
- val paymentMethodName: String,
25
- val paymentMethodLogo: PrimerRNPaymentMethodLogo,
26
- val paymentMethodBackgroundColor: PrimerRNPaymentMethodBackgroundColor
49
+ data class PrimerRNPaymentMethodResourceWrapper(
50
+ val paymentMethodResource: PrimerRNPaymentMethodResource
27
51
  )
28
52
 
29
53
  @Serializable
@@ -45,10 +69,10 @@ data class PrimerCardNetworkAsset(
45
69
  val cardNetworkImageURL: String
46
70
  )
47
71
 
48
- internal fun PrimerPaymentMethodAsset.toPrimerRNPaymentMethodAsset(
72
+ fun PrimerPaymentMethodAsset.toPrimerRNPaymentMethodAsset(
49
73
  reactContext: ReactApplicationContext,
50
74
  paymentMethodType: String,
51
- ) = PrimerRNPaymentMethodAsset(
75
+ ) = PrimerRNPaymentMethodResource.PrimerRNPaymentMethodAsset(
52
76
  paymentMethodType,
53
77
  paymentMethodName,
54
78
  PrimerRNPaymentMethodLogo(
@@ -90,6 +114,14 @@ internal fun PrimerPaymentMethodAsset.toPrimerRNPaymentMethodAsset(
90
114
  )
91
115
  )
92
116
 
117
+ fun PrimerPaymentMethodNativeView.toPrimerRNPaymentMethodNativeView(paymentMethodType: String) = PrimerRNPaymentMethodResource.PrimerRNPaymentMethodNativeView(
118
+ paymentMethodType = paymentMethodType,
119
+ paymentMethodName = paymentMethodName,
120
+ nativeViewName = when (paymentMethodType) {
121
+ "GOOGLE_PAY" -> "PrimerGooglePayButton"
122
+ else -> error("Native view for '$paymentMethodType'is not supported")
123
+ }
124
+ )
93
125
 
94
126
  private fun getFileUrl(
95
127
  reactContext: ReactApplicationContext,
@@ -0,0 +1,35 @@
1
+ package com.primerioreactnative.components.manager
2
+
3
+ import android.util.Log
4
+ import android.view.View
5
+ import android.widget.FrameLayout
6
+ import com.facebook.react.uimanager.ThemedReactContext
7
+
8
+ class NativeViewContainer(private val context: ThemedReactContext) : FrameLayout(context) {
9
+ fun addViewImpl(view: View) {
10
+ addView(view)
11
+ view.setOnClickListener {
12
+ (this.parent as? View)?.performClick()
13
+ ?: run {
14
+ Log.e(
15
+ "NativeViewContainer",
16
+ "Unable to find parent of NativeViewContainer."
17
+ )
18
+ }
19
+ }
20
+ viewTreeObserver.addOnGlobalLayoutListener { requestLayout() }
21
+ }
22
+
23
+ override fun requestLayout() {
24
+ super.requestLayout()
25
+ post(mLayoutRunnable)
26
+ }
27
+
28
+ private val mLayoutRunnable = Runnable {
29
+ measure(
30
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
31
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
32
+ )
33
+ layout(left, top, right, bottom)
34
+ }
35
+ }
@@ -24,11 +24,11 @@ import com.primerioreactnative.datamodels.extensions.ach.toUserDetailsRetrievedR
24
24
  import com.primerioreactnative.utils.convertJsonToArray
25
25
  import com.primerioreactnative.utils.convertJsonToMap
26
26
  import com.primerioreactnative.utils.errorTo
27
- import io.primer.android.components.manager.ach.PrimerHeadlessUniversalCheckoutAchManager
27
+ import io.primer.android.components.ach.PrimerHeadlessUniversalCheckoutAchManager
28
28
  import io.primer.android.components.manager.core.composable.PrimerValidationStatus
29
- import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.StripeAchUserDetailsComponent
30
- import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsCollectableData
31
- import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsStep
29
+ import io.primer.android.stripe.ach.api.component.StripeAchUserDetailsComponent
30
+ import io.primer.android.stripe.ach.api.composable.AchUserDetailsCollectableData
31
+ import io.primer.android.stripe.ach.api.composable.AchUserDetailsStep
32
32
  import io.primer.android.domain.error.models.PrimerError
33
33
  import com.primerioreactnative.utils.toWritableArray
34
34
  import com.primerioreactnative.utils.toWritableMap
@@ -5,23 +5,29 @@ import com.facebook.react.bridge.Promise
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.bridge.ReactContextBaseJavaModule
7
7
  import com.facebook.react.bridge.ReactMethod
8
+ import io.primer.android.components.ui.assets.PrimerPaymentMethodAsset
9
+ import io.primer.android.components.ui.assets.PrimerPaymentMethodNativeView
8
10
  import com.primerioreactnative.components.assets.AssetsManager
9
11
  import com.primerioreactnative.components.assets.AssetsManager.drawableToBitmap
10
12
  import com.primerioreactnative.components.assets.CardNetworkImageFileProvider.getFileForCardNetworkAsset
11
13
  import com.primerioreactnative.components.datamodels.manager.asset.PrimerCardNetworkAsset
12
14
  import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPaymentMethodAssetWrapper
15
+ import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPaymentMethodResourceWrapper
13
16
  import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPaymentMethodAssets
14
17
  import com.primerioreactnative.components.datamodels.manager.asset.toPrimerRNPaymentMethodAsset
18
+ import com.primerioreactnative.components.datamodels.manager.asset.toPrimerRNPaymentMethodNativeView
19
+ import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPaymentMethodResources
15
20
  import com.primerioreactnative.datamodels.ErrorTypeRN
16
21
  import com.primerioreactnative.utils.errorTo
17
22
  import com.primerioreactnative.utils.toWritableMap
18
- import io.primer.android.ExperimentalPrimerApi
23
+ import io.primer.android.core.ExperimentalPrimerApi
19
24
  import io.primer.android.components.SdkUninitializedException
20
25
  import io.primer.android.components.ui.assets.PrimerHeadlessUniversalCheckoutAssetsManager
21
- import io.primer.android.ui.CardNetwork
26
+ import io.primer.android.configuration.data.model.CardNetwork
22
27
  import kotlinx.serialization.encodeToString
23
28
  import kotlinx.serialization.json.Json
24
29
  import org.json.JSONObject
30
+ import com.primerioreactnative.components.manager.googlePay.PrimerGooglePayButtonManager
25
31
 
26
32
  @ExperimentalPrimerApi
27
33
  internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
@@ -123,4 +129,80 @@ internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
123
129
  promise.reject(ErrorTypeRN.UnitializedSdkSession.errorId, e.message, e)
124
130
  }
125
131
  }
132
+
133
+ @ReactMethod
134
+ fun getPaymentMethodResources(promise: Promise) {
135
+ try {
136
+ val paymentMethodResources =
137
+ PrimerHeadlessUniversalCheckoutAssetsManager.getPaymentMethodResources(reactContext)
138
+ if (paymentMethodResources.isEmpty()) {
139
+ val exception =
140
+ ErrorTypeRN.NativeBridgeFailed errorTo "Failed to find resources for this session"
141
+ promise.reject(exception.errorId, exception.description)
142
+ }
143
+ promise.resolve(
144
+ JSONObject(
145
+ Json.encodeToString(
146
+ PrimerRNPaymentMethodResources(paymentMethodResources.map {
147
+ when (it) {
148
+ is PrimerPaymentMethodAsset -> {
149
+ it.toPrimerRNPaymentMethodAsset(
150
+ reactContext = reactContext,
151
+ paymentMethodType = it.paymentMethodType
152
+ )
153
+ }
154
+ is PrimerPaymentMethodNativeView -> {
155
+ PrimerGooglePayButtonManager.updatePrimerGooglePayButtonCreator {
156
+ context -> it.createView(context)
157
+ }
158
+
159
+ it.toPrimerRNPaymentMethodNativeView(
160
+ paymentMethodType = it.paymentMethodType
161
+ )
162
+ }
163
+ }
164
+ }
165
+ )
166
+ )
167
+ ).toWritableMap()
168
+ )
169
+ } catch (e: SdkUninitializedException) {
170
+ promise.reject(ErrorTypeRN.UnitializedSdkSession.errorId, e.message, e)
171
+ }
172
+ }
173
+
174
+ @ReactMethod
175
+ fun getPaymentMethodResource(paymentMethodTypeStr: String, promise: Promise) {
176
+ try {
177
+ val paymentMethodResource =
178
+ PrimerHeadlessUniversalCheckoutAssetsManager.getPaymentMethodResource(reactContext, paymentMethodTypeStr)
179
+ promise.resolve(
180
+ JSONObject(
181
+ Json.encodeToString(
182
+ PrimerRNPaymentMethodResourceWrapper(
183
+ when (paymentMethodResource) {
184
+ is PrimerPaymentMethodAsset -> {
185
+ paymentMethodResource.toPrimerRNPaymentMethodAsset(
186
+ reactContext = reactContext,
187
+ paymentMethodType = paymentMethodResource.paymentMethodType
188
+ )
189
+ }
190
+ is PrimerPaymentMethodNativeView -> {
191
+ PrimerGooglePayButtonManager.updatePrimerGooglePayButtonCreator {
192
+ context -> paymentMethodResource.createView(context)
193
+ }
194
+
195
+ paymentMethodResource.toPrimerRNPaymentMethodNativeView(
196
+ paymentMethodType = paymentMethodResource.paymentMethodType
197
+ )
198
+ }
199
+ }
200
+ )
201
+ )
202
+ ).toWritableMap()
203
+ )
204
+ } catch (e: SdkUninitializedException) {
205
+ promise.reject(ErrorTypeRN.UnitializedSdkSession.errorId, e.message, e)
206
+ }
207
+ }
126
208
  }
@@ -26,7 +26,7 @@ import com.primerioreactnative.utils.convertJsonToArray
26
26
  import com.primerioreactnative.utils.errorTo
27
27
  import io.primer.android.components.manager.banks.composable.BanksCollectableData
28
28
  import io.primer.android.components.manager.banks.composable.BanksStep
29
- import io.primer.android.components.manager.componentWithRedirect.PrimerHeadlessUniversalCheckoutComponentWithRedirectManager
29
+ import io.primer.android.components.componentWithRedirect.PrimerHeadlessUniversalCheckoutComponentWithRedirectManager
30
30
  import io.primer.android.components.manager.componentWithRedirect.component.BanksComponent
31
31
  import io.primer.android.components.manager.core.composable.PrimerValidationStatus
32
32
  import com.primerioreactnative.utils.toWritableArray
@@ -0,0 +1,39 @@
1
+ package com.primerioreactnative.components.manager.googlePay
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
5
+ import com.google.android.gms.wallet.button.ButtonConstants
6
+
7
+ internal object PrimerGooglePayButtonOptionsMapping {
8
+
9
+ fun getOptions(): Map<String, Map<String, Int>> {
10
+ val themes = hashMapOf<String, Int>()
11
+ themes["Dark"] = ButtonConstants.ButtonTheme.DARK
12
+ themes["Light"] = ButtonConstants.ButtonTheme.LIGHT
13
+
14
+ val types = hashMapOf<String, Int>()
15
+ types["Book"] = ButtonConstants.ButtonType.BOOK
16
+ types["Buy"] = ButtonConstants.ButtonType.BUY
17
+ types["Checkout"] = ButtonConstants.ButtonType.CHECKOUT
18
+ types["Donate"] = ButtonConstants.ButtonType.DONATE
19
+ types["Order"] = ButtonConstants.ButtonType.ORDER
20
+ types["Pay"] = ButtonConstants.ButtonType.PAY
21
+ types["Plain"] = ButtonConstants.ButtonType.PLAIN
22
+ types["Subscribe"] = ButtonConstants.ButtonType.SUBSCRIBE
23
+
24
+ return hashMapOf("Themes" to themes, "Types" to types)
25
+ }
26
+ }
27
+
28
+ class PrimerGooglePayButtonConstantsModule(reactContext: ReactApplicationContext) :
29
+ ReactContextBaseJavaModule(reactContext) {
30
+
31
+ override fun getConstants(): Map<String, Any> =
32
+ PrimerGooglePayButtonOptionsMapping.getOptions()
33
+
34
+ override fun getName() = NAME
35
+
36
+ companion object {
37
+ private const val NAME = "PrimerGooglePayButtonConstants"
38
+ }
39
+ }
@@ -0,0 +1,38 @@
1
+ package com.primerioreactnative.components.manager.googlePay
2
+
3
+ import android.content.Context
4
+ import android.view.View
5
+ import android.widget.TextView
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.primerioreactnative.components.manager.NativeViewContainer
9
+
10
+ class PrimerGooglePayButtonManager : SimpleViewManager<NativeViewContainer>() {
11
+ override fun getName() = REACT_CLASS
12
+
13
+ override fun createViewInstance(reactContext: ThemedReactContext): NativeViewContainer =
14
+ NativeViewContainer(reactContext)
15
+
16
+ override fun onAfterUpdateTransaction(view: NativeViewContainer) {
17
+ super.onAfterUpdateTransaction(view)
18
+ view.addViewImpl(
19
+ getPrimerGooglePayButtonOrNull(view.context)
20
+ ?: TextView(view.context).apply { text = "Error loading Google Pay button" }
21
+ )
22
+ }
23
+
24
+ private fun getPrimerGooglePayButtonOrNull(context: Context): View? {
25
+ return createPrimerGooglePayButton?.invoke(context) ?: return null
26
+ }
27
+
28
+ companion object {
29
+ var createPrimerGooglePayButton: ((context: Context) -> View)? = null
30
+ private set
31
+
32
+ fun updatePrimerGooglePayButtonCreator(creator: (context: Context) -> View) {
33
+ this.createPrimerGooglePayButton = creator
34
+ }
35
+
36
+ const val REACT_CLASS = "PrimerGooglePayButton"
37
+ }
38
+ }
@@ -1,97 +1,34 @@
1
1
  package com.primerioreactnative.components.manager.klarna
2
2
 
3
- import android.os.Handler
4
- import android.os.Looper
5
3
  import android.view.View
6
4
  import android.view.ViewGroup
7
- import android.widget.FrameLayout
8
5
  import android.widget.TextView
9
- import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.SimpleViewManager
10
7
  import com.facebook.react.uimanager.ThemedReactContext
11
- import com.facebook.react.uimanager.ViewGroupManager
12
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.PrimerKlarnaPaymentView
8
+ import com.primerioreactnative.components.manager.NativeViewContainer
9
+ import io.primer.android.klarna.api.ui.PrimerKlarnaPaymentView
13
10
  import java.lang.ref.WeakReference
14
- import java.util.Timer
15
- import java.util.TimerTask
16
11
 
17
- class PrimerKlarnaPaymentViewManager(private val reactContext: ReactApplicationContext) :
18
- ViewGroupManager<ViewGroup>() {
12
+ class PrimerKlarnaPaymentViewManager : SimpleViewManager<NativeViewContainer>() {
19
13
  override fun getName() = REACT_CLASS
20
14
 
21
- override fun createViewInstance(reactContext: ThemedReactContext) =
22
- FrameLayout(reactContext).apply {
23
- addView(
24
- getPrimerKlarnaPaymentViewOrNull(this)
25
- ?: PrimerKlarnaPaymentView(context).apply {
26
- addView(TextView(context).apply { text = "Error loading Klarna payment view" })
27
- }
28
- )
29
- alpha = 0f
30
- }
15
+ override fun createViewInstance(reactContext: ThemedReactContext): NativeViewContainer =
16
+ NativeViewContainer(reactContext)
31
17
 
32
- private fun getPrimerKlarnaPaymentViewOrNull(parent: ViewGroup): View? {
33
- val view = primerKlarnaPaymentView.get() ?: return null
34
- val handler = Handler(Looper.getMainLooper())
35
- val listener =
36
- object : View.OnLayoutChangeListener {
37
- private var timer: Timer? = null
38
-
39
- override fun onLayoutChange(
40
- v: View?,
41
- left: Int,
42
- top: Int,
43
- right: Int,
44
- bottom: Int,
45
- oldLeft: Int,
46
- oldTop: Int,
47
- oldRight: Int,
48
- oldBottom: Int
49
- ) {
50
- val listener = this
51
- timer?.cancel()
52
- timer =
53
- Timer().apply {
54
- schedule(
55
- object : TimerTask() {
56
- override fun run() {
57
- timer?.cancel()
58
- timer = null
59
- handler.post(
60
- Runnable {
61
- view.removeOnLayoutChangeListener(listener)
62
- // Re-layout parent once KlarnaPaymentView loads
63
- layout(view)
64
- parent.alpha = 1f
65
- }
66
- )
67
- }
68
- },
69
- 300L
70
- )
71
- }
72
- }
73
- }
74
- view.addOnLayoutChangeListener(listener)
75
-
76
- return view
18
+ override fun onAfterUpdateTransaction(view: NativeViewContainer) {
19
+ super.onAfterUpdateTransaction(view)
20
+ view.addViewImpl(
21
+ getPrimerKlarnaPaymentViewOrNull()
22
+ ?: TextView(view.context).apply { text = "Error loading Klarna payment view" }
23
+ )
77
24
  }
78
25
 
79
- private fun layout(view: View) {
80
- val oldX = view.getX().toInt()
81
- val oldY = view.getY().toInt()
82
- val parent = (view.parent as? View)
83
- val fallbackWidth = parent?.width ?: Int.MAX_VALUE
84
- val fallbackHeight = parent?.height ?: Int.MAX_VALUE
85
- view.measure(
86
- View.MeasureSpec.makeMeasureSpec(fallbackWidth, View.MeasureSpec.EXACTLY),
87
- View.MeasureSpec.makeMeasureSpec(fallbackHeight, View.MeasureSpec.EXACTLY)
88
- )
89
- view.layout(oldX, oldY, oldX + fallbackWidth, oldY + fallbackHeight)
26
+ private fun getPrimerKlarnaPaymentViewOrNull(): View? {
27
+ return primerKlarnaPaymentView.get() ?: return null
90
28
  }
91
29
 
92
30
  companion object {
93
- private var primerKlarnaPaymentView: WeakReference<PrimerKlarnaPaymentView?> =
94
- WeakReference(null)
31
+ private var primerKlarnaPaymentView: WeakReference<PrimerKlarnaPaymentView?> = WeakReference(null)
95
32
  private set
96
33
 
97
34
  fun updatePrimerKlarnaPaymentView(view: PrimerKlarnaPaymentView) {
@@ -29,10 +29,10 @@ import com.primerioreactnative.extensions.putErrors
29
29
  import com.primerioreactnative.extensions.putValidationErrors
30
30
  import io.primer.android.PrimerSessionIntent
31
31
  import io.primer.android.components.manager.core.composable.PrimerValidationStatus
32
- import io.primer.android.components.manager.klarna.PrimerHeadlessUniversalCheckoutKlarnaManager
33
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.composable.KlarnaComponent
34
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentCollectableData
35
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentStep
32
+ import io.primer.android.klarna.PrimerHeadlessUniversalCheckoutKlarnaManager
33
+ import io.primer.android.klarna.api.component.KlarnaComponent
34
+ import io.primer.android.klarna.api.composable.KlarnaPaymentCollectableData
35
+ import io.primer.android.klarna.api.composable.KlarnaPaymentStep
36
36
  import kotlinx.coroutines.CoroutineScope
37
37
  import kotlinx.coroutines.Dispatchers
38
38
  import kotlinx.coroutines.Job
@@ -7,7 +7,7 @@ import com.facebook.react.bridge.ReactMethod
7
7
  import com.primerioreactnative.datamodels.ErrorTypeRN
8
8
  import com.primerioreactnative.datamodels.PrimerErrorRN
9
9
  import com.primerioreactnative.utils.errorTo
10
- import io.primer.android.ExperimentalPrimerApi
10
+ import io.primer.android.core.ExperimentalPrimerApi
11
11
  import io.primer.android.PrimerSessionIntent
12
12
  import io.primer.android.components.SdkUninitializedException
13
13
  import io.primer.android.components.domain.exception.UnsupportedPaymentMethodManagerException
@@ -14,12 +14,12 @@ import com.primerioreactnative.datamodels.ErrorTypeRN
14
14
  import com.primerioreactnative.datamodels.PrimerErrorRN
15
15
  import com.primerioreactnative.utils.errorTo
16
16
  import com.primerioreactnative.utils.toWritableMap
17
- import io.primer.android.ExperimentalPrimerApi
17
+ import io.primer.android.core.ExperimentalPrimerApi
18
18
  import io.primer.android.components.SdkUninitializedException
19
19
  import io.primer.android.components.domain.exception.UnsupportedPaymentMethodManagerException
20
20
  import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManager
21
21
  import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManagerInterface
22
- import io.primer.android.data.payments.configure.retailOutlets.RetailOutletsList
22
+ import io.primer.android.RetailOutletsList
23
23
  import kotlinx.serialization.decodeFromString
24
24
  import kotlinx.serialization.encodeToString
25
25
  import kotlinx.serialization.json.Json