@primer-io/react-native 2.26.3 → 2.27.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 (76) hide show
  1. package/android/.project +6 -0
  2. package/android/.settings/org.eclipse.buildship.core.prefs +5 -5
  3. package/android/build.gradle +1 -3
  4. package/android/src/main/AndroidManifest.xml +1 -4
  5. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +3 -3
  6. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +4 -3
  7. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +2 -2
  8. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +46 -9
  9. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +4 -0
  10. package/android/src/main/java/com/primerioreactnative/components/manager/ach/AchMandateManager.kt +70 -0
  11. package/android/src/main/java/com/primerioreactnative/components/manager/ach/PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent.kt +283 -0
  12. package/android/src/main/java/com/primerioreactnative/components/manager/banks/PrimerRNHeadlessUniversalCheckoutBanksComponent.kt +7 -37
  13. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.kt +5 -31
  14. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutAdditionalInfoRN.kt +17 -4
  15. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +44 -37
  16. package/android/src/main/java/com/primerioreactnative/datamodels/ach/AchUserDetailsCollectableDataRN.kt +22 -0
  17. package/android/src/main/java/com/primerioreactnative/datamodels/ach/AchUserDetailsStepRN.kt +22 -0
  18. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsCollectableData.kt +11 -0
  19. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsStep.kt +14 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/JSONExtensions.kt +41 -0
  21. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutAdditionalInfo.kt +4 -0
  22. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodOptionsRN.kt +42 -15
  23. package/ios/Sources/DataModels/Ach Component/RNTAchUserDetailsCollectableData.swift +54 -0
  24. package/ios/Sources/DataModels/Ach Component/RNTAchUserDetailsStep.swift +40 -0
  25. package/ios/Sources/DataModels/PrimerCheckoutAdditionalInfoRN.swift +61 -0
  26. package/ios/Sources/DataModels/PrimerSettings+Extensions.swift +24 -1
  27. package/ios/Sources/Headless Universal Checkout/Managers/Ach/PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent.m +28 -0
  28. package/ios/Sources/Headless Universal Checkout/Managers/Ach/PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent.swift +233 -0
  29. package/ios/Sources/Headless Universal Checkout/Managers/Ach/RNTAchMandateManager.m +16 -0
  30. package/ios/Sources/Headless Universal Checkout/Managers/Ach/RNTAchMandateManager.swift +53 -0
  31. package/ios/Sources/Headless Universal Checkout/Managers/Klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.swift +2 -2
  32. package/ios/Sources/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +56 -7
  33. package/ios/Sources/version.swift +1 -1
  34. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.js +106 -0
  35. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.js.map +1 -0
  36. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.js +38 -0
  37. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.js.map +1 -0
  38. package/lib/commonjs/index.js +70 -0
  39. package/lib/commonjs/index.js.map +1 -1
  40. package/lib/commonjs/models/ach/AchCollectableData.js +6 -0
  41. package/lib/commonjs/models/ach/AchCollectableData.js.map +1 -0
  42. package/lib/commonjs/models/ach/AchSteps.js +6 -0
  43. package/lib/commonjs/models/ach/AchSteps.js.map +1 -0
  44. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.js +99 -0
  45. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.js.map +1 -0
  46. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.js +31 -0
  47. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.js.map +1 -0
  48. package/lib/module/index.js +8 -0
  49. package/lib/module/index.js.map +1 -1
  50. package/lib/module/models/ach/AchCollectableData.js +2 -0
  51. package/lib/module/models/ach/AchCollectableData.js.map +1 -0
  52. package/lib/module/models/ach/AchSteps.js +2 -0
  53. package/lib/module/models/ach/AchSteps.js.map +1 -0
  54. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.d.ts +53 -0
  55. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.d.ts.map +1 -0
  56. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.d.ts +12 -0
  57. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.d.ts.map +1 -0
  58. package/lib/typescript/index.d.ts +8 -0
  59. package/lib/typescript/index.d.ts.map +1 -1
  60. package/lib/typescript/models/PrimerCheckoutAdditionalInfo.d.ts +10 -0
  61. package/lib/typescript/models/PrimerCheckoutAdditionalInfo.d.ts.map +1 -1
  62. package/lib/typescript/models/PrimerSettings.d.ts +14 -0
  63. package/lib/typescript/models/PrimerSettings.d.ts.map +1 -1
  64. package/lib/typescript/models/ach/AchCollectableData.d.ts +25 -0
  65. package/lib/typescript/models/ach/AchCollectableData.d.ts.map +1 -0
  66. package/lib/typescript/models/ach/AchSteps.d.ts +28 -0
  67. package/lib/typescript/models/ach/AchSteps.d.ts.map +1 -0
  68. package/package.json +1 -1
  69. package/primer-io-react-native.podspec +1 -1
  70. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchManager.ts +158 -0
  71. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/AchMandateManager.ts +32 -0
  72. package/src/index.tsx +8 -0
  73. package/src/models/PrimerCheckoutAdditionalInfo.ts +19 -5
  74. package/src/models/PrimerSettings.ts +19 -0
  75. package/src/models/ach/AchCollectableData.ts +29 -0
  76. package/src/models/ach/AchSteps.ts +29 -0
@@ -20,7 +20,6 @@ import com.primerioreactnative.datamodels.extensions.banks.toFilterRN
20
20
  import com.primerioreactnative.datamodels.extensions.banks.toLoadingRN
21
21
  import com.primerioreactnative.datamodels.extensions.banks.toBanksRetrievedRN
22
22
  import com.primerioreactnative.datamodels.NamedComponentStep
23
- import com.primerioreactnative.extensions.toPrimerErrorRN
24
23
  import com.primerioreactnative.extensions.toPrimerIssuingBankRN
25
24
  import com.primerioreactnative.utils.convertJsonToMap
26
25
  import com.primerioreactnative.utils.convertJsonToArray
@@ -30,6 +29,10 @@ import io.primer.android.components.manager.banks.composable.BanksStep
30
29
  import io.primer.android.components.manager.componentWithRedirect.PrimerHeadlessUniversalCheckoutComponentWithRedirectManager
31
30
  import io.primer.android.components.manager.componentWithRedirect.component.BanksComponent
32
31
  import io.primer.android.components.manager.core.composable.PrimerValidationStatus
32
+ import com.primerioreactnative.utils.toWritableArray
33
+ import com.primerioreactnative.utils.toWritableMap
34
+ import com.primerioreactnative.extensions.putErrors
35
+ import com.primerioreactnative.extensions.putValidationErrors
33
36
  import kotlinx.coroutines.CoroutineScope
34
37
  import kotlinx.coroutines.Dispatchers
35
38
  import kotlinx.coroutines.Job
@@ -133,14 +136,7 @@ class PrimerRNHeadlessUniversalCheckoutBanksComponent(
133
136
  banksComponent?.componentError?.collectLatest { error ->
134
137
  sendEvent(
135
138
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_ERROR.eventName,
136
- JSONObject().apply {
137
- put(
138
- "errors",
139
- JSONArray().apply {
140
- put(JSONObject(json.encodeToString(error.toPrimerErrorRN())))
141
- }
142
- )
143
- }
139
+ JSONObject().apply { putErrors(error) }
144
140
  )
145
141
  }
146
142
  }
@@ -182,22 +178,7 @@ class PrimerRNHeadlessUniversalCheckoutBanksComponent(
182
178
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_IN_VALID.eventName,
183
179
  JSONObject().apply {
184
180
  putData(validationStatus.collectableData as BanksCollectableData)
185
- put(
186
- "errors",
187
- JSONArray(
188
- validationStatus.validationErrors.map {
189
- JSONObject(
190
- json.encodeToString(
191
- PrimerValidationErrorRN(
192
- it.errorId,
193
- it.description,
194
- it.diagnosticsId,
195
- )
196
- )
197
- )
198
- }
199
- )
200
- )
181
+ putValidationErrors(validationStatus.validationErrors)
201
182
  }
202
183
  )
203
184
  }
@@ -214,12 +195,7 @@ class PrimerRNHeadlessUniversalCheckoutBanksComponent(
214
195
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_VALIDATION_ERROR.eventName,
215
196
  JSONObject().apply {
216
197
  putData(validationStatus.collectableData as BanksCollectableData)
217
- put(
218
- "errors",
219
- JSONArray().apply {
220
- put(JSONObject(json.encodeToString(validationStatus.error.toPrimerErrorRN())))
221
- }
222
- )
198
+ putErrors(validationStatus.error)
223
199
  }
224
200
  )
225
201
  }
@@ -245,12 +221,6 @@ class PrimerRNHeadlessUniversalCheckoutBanksComponent(
245
221
 
246
222
  @ReactMethod fun removeListeners(count: Int?) = Unit
247
223
 
248
- private fun JSONObject?.toWritableMap(): WritableMap =
249
- this?.let { convertJsonToMap(this) } ?: Arguments.createMap()
250
-
251
- private fun JSONArray?.toWritableArray(): WritableArray =
252
- this?.let { convertJsonToArray(this) } ?: Arguments.createArray()
253
-
254
224
  private fun sendEvent(name: String, data: JSONObject?) {
255
225
  reactApplicationContext
256
226
  .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
@@ -22,10 +22,11 @@ import com.primerioreactnative.extensions.klarna.toPaymentSessionAuthorizedRN
22
22
  import com.primerioreactnative.extensions.klarna.toPaymentSessionCreatedRN
23
23
  import com.primerioreactnative.extensions.klarna.toPaymentSessionFinalizedRN
24
24
  import com.primerioreactnative.extensions.klarna.toPaymentViewLoadedRN
25
- import com.primerioreactnative.extensions.toPrimerErrorRN
26
25
  import com.primerioreactnative.utils.errorTo
27
26
  import com.primerioreactnative.utils.toWritableArray
28
27
  import com.primerioreactnative.utils.toWritableMap
28
+ import com.primerioreactnative.extensions.putErrors
29
+ import com.primerioreactnative.extensions.putValidationErrors
29
30
  import io.primer.android.PrimerSessionIntent
30
31
  import io.primer.android.components.manager.core.composable.PrimerValidationStatus
31
32
  import io.primer.android.components.manager.klarna.PrimerHeadlessUniversalCheckoutKlarnaManager
@@ -124,14 +125,7 @@ class PrimerRNHeadlessUniversalCheckoutKlarnaComponent(
124
125
  klarnaComponent?.componentError?.collectLatest { error ->
125
126
  sendEvent(
126
127
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_ERROR.eventName,
127
- JSONObject().apply {
128
- put(
129
- "errors",
130
- JSONArray().apply {
131
- put(JSONObject(json.encodeToString(error.toPrimerErrorRN())))
132
- }
133
- )
134
- }
128
+ JSONObject().apply { putErrors(error) }
135
129
  )
136
130
  }
137
131
  }
@@ -189,22 +183,7 @@ class PrimerRNHeadlessUniversalCheckoutKlarnaComponent(
189
183
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_IN_VALID.eventName,
190
184
  JSONObject().apply {
191
185
  putData(validationStatus.collectableData as KlarnaPaymentCollectableData)
192
- put(
193
- "errors",
194
- JSONArray(
195
- validationStatus.validationErrors.map {
196
- JSONObject(
197
- json.encodeToString(
198
- PrimerValidationErrorRN(
199
- it.errorId,
200
- it.description,
201
- it.diagnosticsId,
202
- )
203
- )
204
- )
205
- }
206
- )
207
- )
186
+ putValidationErrors(validationStatus.validationErrors)
208
187
  }
209
188
  )
210
189
  }
@@ -221,12 +200,7 @@ class PrimerRNHeadlessUniversalCheckoutKlarnaComponent(
221
200
  PrimerHeadlessUniversalCheckoutComponentEvent.ON_VALIDATION_ERROR.eventName,
222
201
  JSONObject().apply {
223
202
  putData(validationStatus.collectableData as KlarnaPaymentCollectableData)
224
- put(
225
- "errors",
226
- JSONArray().apply {
227
- put(JSONObject(json.encodeToString(validationStatus.error.toPrimerErrorRN())))
228
- }
229
- )
203
+ putErrors(validationStatus.error)
230
204
  }
231
205
  )
232
206
  }
@@ -3,14 +3,18 @@ package com.primerioreactnative.datamodels
3
3
  import kotlinx.serialization.Serializable
4
4
 
5
5
  @Serializable
6
- sealed class PrimerCheckoutAdditionalInfoRN
6
+ sealed class PrimerCheckoutAdditionalInfoRN {
7
+ abstract val additionalInfoName: String
8
+ }
7
9
 
8
10
  @Serializable
9
11
  data class MultibancoCheckoutAdditionalInfoRN(
10
12
  val expiresAt: String,
11
13
  val reference: String,
12
14
  val entity: String,
13
- ) : PrimerCheckoutAdditionalInfoRN()
15
+ ) : PrimerCheckoutAdditionalInfoRN() {
16
+ override val additionalInfoName: String = "MultibancoCheckoutAdditionalInfo"
17
+ }
14
18
 
15
19
  sealed class PrimerCheckoutQRCodeInfoRN : PrimerCheckoutAdditionalInfoRN()
16
20
 
@@ -19,7 +23,9 @@ data class PromptPayCheckoutAdditionalInfoRN(
19
23
  val expiresAt: String,
20
24
  val qrCodeUrl: String?,
21
25
  val qrCodeBase64: String?,
22
- ) : PrimerCheckoutQRCodeInfoRN()
26
+ ) : PrimerCheckoutQRCodeInfoRN() {
27
+ override val additionalInfoName: String = "PromptPayCheckoutAdditionalInfo"
28
+ }
23
29
 
24
30
  sealed class PrimerCheckoutVoucherInfoRN : PrimerCheckoutAdditionalInfoRN()
25
31
 
@@ -28,4 +34,11 @@ data class XenditCheckoutVoucherAdditionalInfoRN(
28
34
  val expiresAt: String,
29
35
  val couponCode: String,
30
36
  val retailerName: String?,
31
- ) : PrimerCheckoutVoucherInfoRN()
37
+ ) : PrimerCheckoutVoucherInfoRN() {
38
+ override val additionalInfoName: String = "XenditCheckoutVoucherAdditionalInfo"
39
+ }
40
+
41
+ @Serializable
42
+ class AchAdditionalInfoDisplayMandateRN : PrimerCheckoutAdditionalInfoRN() {
43
+ override val additionalInfoName: String = "DisplayStripeAchMandateAdditionalInfo"
44
+ }
@@ -1,5 +1,6 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
+ import android.content.Context
3
4
  import com.primerioreactnative.extensions.toLocale
4
5
  import com.primerioreactnative.extensions.toPrimerDebugOptions
5
6
  import com.primerioreactnative.extensions.toPrimerPaymentMethodOptions
@@ -7,6 +8,7 @@ import com.primerioreactnative.extensions.toPrimerUIOptions
7
8
  import io.primer.android.data.settings.GooglePayButtonStyle
8
9
  import io.primer.android.data.settings.PrimerPaymentHandling
9
10
  import io.primer.android.data.settings.PrimerSettings
11
+ import io.primer.android.data.settings.PrimerStripeOptions
10
12
  import io.primer.android.ui.settings.PrimerTheme
11
13
  import kotlinx.serialization.SerialName
12
14
  import kotlinx.serialization.Serializable
@@ -23,19 +25,20 @@ data class PrimerSettingsRN(
23
25
 
24
26
  @Serializable
25
27
  data class LocaleSettingsRN(
26
- val languageCode: String? = null,
27
- val localeCode: String? = null
28
+ val languageCode: String? = null,
29
+ val localeCode: String? = null
28
30
  )
29
31
 
30
32
  @Serializable
31
33
  data class PrimerPaymentMethodOptionsRN(
32
- @SerialName("android")
33
- val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
34
- var cardPaymentOptions: PrimerCardPaymentOptionsRN = PrimerCardPaymentOptionsRN(),
35
- var googlePayOptions: PrimerGooglePayOptionsRN = PrimerGooglePayOptionsRN(),
36
- var klarnaOptions: PrimerKlarnaOptionsRN = PrimerKlarnaOptionsRN(),
37
- var apayaOptions: PrimerApayaOptionsRN = PrimerApayaOptionsRN(),
38
- var threeDsOptions: PrimerThreeDsOptionsRN = PrimerThreeDsOptionsRN()
34
+ @SerialName("android")
35
+ val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
36
+ var cardPaymentOptions: PrimerCardPaymentOptionsRN = PrimerCardPaymentOptionsRN(),
37
+ var googlePayOptions: PrimerGooglePayOptionsRN = PrimerGooglePayOptionsRN(),
38
+ var klarnaOptions: PrimerKlarnaOptionsRN = PrimerKlarnaOptionsRN(),
39
+ var apayaOptions: PrimerApayaOptionsRN = PrimerApayaOptionsRN(),
40
+ var threeDsOptions: PrimerThreeDsOptionsRN = PrimerThreeDsOptionsRN(),
41
+ var stripeOptions: PrimerStripeOptionsRN = PrimerStripeOptionsRN(),
39
42
  )
40
43
 
41
44
  @Serializable
@@ -113,56 +116,60 @@ data class ColorRN(
113
116
  data class PrimerDebugOptionsRN(val is3DSSanityCheckEnabled: Boolean = true)
114
117
 
115
118
  @Serializable
116
- data class PrimerCardPaymentOptionsRN(
117
- var is3DSOnVaultingEnabled: Boolean = true
118
- )
119
+ data class PrimerCardPaymentOptionsRN(var is3DSOnVaultingEnabled: Boolean = true)
119
120
 
120
121
  @Serializable
121
122
  data class PrimerThreeDsOptionsRN(
122
- @SerialName("android")
123
- val threeDsOptionsAndroid: PrimerThreeDsAndroidOptionsRN? = null
123
+ @SerialName("android")
124
+ val threeDsOptionsAndroid: PrimerThreeDsAndroidOptionsRN? = null
124
125
  )
125
126
 
126
- @Serializable
127
- data class PrimerThreeDsAndroidOptionsRN(
128
- val threeDsAppRequestorUrl: String? = null
129
- )
127
+ @Serializable
128
+ data class PrimerThreeDsAndroidOptionsRN(val threeDsAppRequestorUrl: String? = null)
130
129
 
131
130
  @Serializable
132
131
  data class PrimerGooglePayOptionsRN(
133
- var merchantName: String? = null,
134
- var allowedCardNetworks: List<String> = listOf(
135
- "AMEX",
136
- "DISCOVER",
137
- "JCB",
138
- "MASTERCARD",
139
- "VISA"
140
- ),
141
- var buttonStyle: GooglePayButtonStyle = GooglePayButtonStyle.BLACK,
142
- @SerialName("isCaptureBillingAddressEnabled") var captureBillingAddress: Boolean = false,
143
- @SerialName("isExistingPaymentMethodRequired") var existingPaymentMethodRequired: Boolean = false
132
+ var merchantName: String? = null,
133
+ var allowedCardNetworks: List<String> =
134
+ listOf("AMEX", "DISCOVER", "JCB", "MASTERCARD", "VISA"),
135
+ var buttonStyle: GooglePayButtonStyle = GooglePayButtonStyle.BLACK,
136
+ @SerialName("isCaptureBillingAddressEnabled")
137
+ var captureBillingAddress: Boolean = false,
138
+ @SerialName("isExistingPaymentMethodRequired")
139
+ var existingPaymentMethodRequired: Boolean = false
144
140
  )
145
141
 
146
142
  @Serializable
147
143
  data class PrimerKlarnaOptionsRN(
148
- var recurringPaymentDescription: String? = null,
149
- @Deprecated("This property is deprecated and will be removed in future release.")
150
- var webViewTitle: String? = null,
144
+ var recurringPaymentDescription: String? = null,
145
+ @Deprecated("This property is deprecated and will be removed in future release.")
146
+ var webViewTitle: String? = null,
151
147
  )
152
148
 
149
+ @Serializable
150
+ data class PrimerStripeOptionsRN(
151
+ val mandateData: MandateDataRN? = null,
152
+ val publishableKey: String? = null,
153
+ ) {
154
+ @Serializable
155
+ data class MandateDataRN(
156
+ @SerialName("fullMandateText") val fullMandateText: String? = null,
157
+ @SerialName("fullMandateStringResourceName") val fullMandateStringResName: String? = null,
158
+ val merchantName: String? = null
159
+ )
160
+ }
161
+
153
162
  @Serializable
154
163
  @Deprecated("This class is deprecated and will be removed in future release.")
155
164
  data class PrimerApayaOptionsRN(
156
- var webViewTitle: String? = null,
165
+ var webViewTitle: String? = null,
157
166
  )
158
167
 
159
- fun PrimerSettingsRN.toPrimerSettings() = PrimerSettings(
168
+ fun PrimerSettingsRN.toPrimerSettings(context: Context) = PrimerSettings(
160
169
  paymentHandling = paymentHandling,
161
170
  locale = localeData.toLocale(),
162
- paymentMethodOptions = paymentMethodOptions.toPrimerPaymentMethodOptions(),
171
+ paymentMethodOptions = paymentMethodOptions.toPrimerPaymentMethodOptions(context),
163
172
  uiOptions = uiOptions.toPrimerUIOptions(),
164
173
  debugOptions = debugOptions.toPrimerDebugOptions(),
165
174
  clientSessionCachingEnabled = clientSessionCachingEnabled
166
175
  )
167
-
168
-
@@ -0,0 +1,22 @@
1
+ package com.primerioreactnative.datamodels.ach
2
+
3
+ import com.primerioreactnative.datamodels.NamedComponentValidatableData
4
+ import kotlinx.serialization.Serializable
5
+
6
+ @Serializable
7
+ internal sealed interface AchUserDetailsCollectableDataRN : NamedComponentValidatableData {
8
+ @Serializable
9
+ data class FirstNameRN(val value: String) : AchUserDetailsCollectableDataRN {
10
+ override val validatableDataName = "firstName"
11
+ }
12
+
13
+ @Serializable
14
+ data class LastNameRN(val value: String) : AchUserDetailsCollectableDataRN {
15
+ override val validatableDataName = "lastName"
16
+ }
17
+
18
+ @Serializable
19
+ data class EmailAddressRN(val value: String) : AchUserDetailsCollectableDataRN {
20
+ override val validatableDataName = "emailAddress"
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ package com.primerioreactnative.datamodels.ach
2
+
3
+ import kotlinx.serialization.Serializable
4
+ import com.primerioreactnative.datamodels.NamedComponentStep
5
+ import com.primerioreactnative.datamodels.PrimerIssuingBankRN
6
+
7
+ @Serializable
8
+ internal sealed interface AchUserDetailsStepRN : NamedComponentStep {
9
+ @Serializable
10
+ class UserDetailsCollectedRN : AchUserDetailsStepRN {
11
+ override val stepName: String = "userDetailsCollected"
12
+ }
13
+
14
+ @Serializable
15
+ data class UserDetailsRetrievedRN(
16
+ val firstName: String,
17
+ val lastName: String,
18
+ val emailAddress: String
19
+ ) : AchUserDetailsStepRN {
20
+ override val stepName: String = "userDetailsRetrieved"
21
+ }
22
+ }
@@ -0,0 +1,11 @@
1
+ package com.primerioreactnative.datamodels.extensions.ach
2
+
3
+ import com.primerioreactnative.datamodels.NamedComponentValidatableData
4
+ import com.primerioreactnative.datamodels.ach.AchUserDetailsStepRN
5
+ import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsCollectableData
6
+ import kotlinx.serialization.Serializable
7
+ import com.primerioreactnative.datamodels.ach.AchUserDetailsCollectableDataRN
8
+
9
+ internal fun AchUserDetailsCollectableData.FirstName.toFirstNameRN() = AchUserDetailsCollectableDataRN.FirstNameRN(value)
10
+ internal fun AchUserDetailsCollectableData.LastName.toLastNameRN() = AchUserDetailsCollectableDataRN.LastNameRN(value)
11
+ internal fun AchUserDetailsCollectableData.EmailAddress.toEmailAddressRN() = AchUserDetailsCollectableDataRN.EmailAddressRN(value)
@@ -0,0 +1,14 @@
1
+ package com.primerioreactnative.datamodels.extensions.ach
2
+
3
+ import com.primerioreactnative.datamodels.ach.AchUserDetailsStepRN
4
+ import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsStep
5
+
6
+ internal fun AchUserDetailsStep.UserDetailsCollected.toUserDetailsCollectedRN() =
7
+ AchUserDetailsStepRN.UserDetailsCollectedRN()
8
+
9
+ internal fun AchUserDetailsStep.UserDetailsRetrieved.toUserDetailsRetrievedRN() =
10
+ AchUserDetailsStepRN.UserDetailsRetrievedRN(
11
+ firstName = firstName,
12
+ lastName = lastName,
13
+ emailAddress = emailAddress
14
+ )
@@ -0,0 +1,41 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import org.json.JSONObject
4
+ import org.json.JSONArray
5
+ import io.primer.android.domain.error.models.PrimerError
6
+ import io.primer.android.components.domain.error.PrimerValidationError
7
+ import kotlinx.serialization.json.Json
8
+ import com.primerioreactnative.datamodels.PrimerValidationErrorRN
9
+ import kotlinx.serialization.encodeToString
10
+
11
+ private val json = Json { encodeDefaults = true }
12
+
13
+ fun JSONObject.putErrors(error: PrimerError) {
14
+ put(
15
+ "errors",
16
+ JSONArray().apply { put(JSONObject(json.encodeToString(error.toPrimerErrorRN()))) }
17
+ )
18
+ }
19
+
20
+ fun JSONObject.putValidationErrors(errors: List<PrimerValidationError>) {
21
+ put(
22
+ "errors",
23
+ JSONArray(
24
+ errors.map {
25
+ JSONObject(
26
+ json.encodeToString(
27
+ PrimerValidationErrorRN(
28
+ it.errorId,
29
+ it.description,
30
+ it.diagnosticsId,
31
+ )
32
+ )
33
+ )
34
+ }
35
+ )
36
+ )
37
+ }
38
+
39
+ fun JSONObject.removeType() {
40
+ remove("type")
41
+ }
@@ -3,10 +3,12 @@ package com.primerioreactnative.extensions
3
3
  import com.primerioreactnative.datamodels.MultibancoCheckoutAdditionalInfoRN
4
4
  import com.primerioreactnative.datamodels.PromptPayCheckoutAdditionalInfoRN
5
5
  import com.primerioreactnative.datamodels.XenditCheckoutVoucherAdditionalInfoRN
6
+ import com.primerioreactnative.datamodels.AchAdditionalInfoDisplayMandateRN
6
7
  import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
7
8
  import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
8
9
  import io.primer.android.domain.payments.additionalInfo.PromptPayCheckoutAdditionalInfo
9
10
  import io.primer.android.domain.payments.additionalInfo.XenditCheckoutVoucherAdditionalInfo
11
+ import io.primer.android.domain.payments.additionalInfo.AchAdditionalInfo
10
12
 
11
13
  internal fun PrimerCheckoutAdditionalInfo.toCheckoutAdditionalInfoRN() = when (this) {
12
14
  is MultibancoCheckoutAdditionalInfo ->
@@ -15,5 +17,7 @@ internal fun PrimerCheckoutAdditionalInfo.toCheckoutAdditionalInfoRN() = when (t
15
17
  PromptPayCheckoutAdditionalInfoRN(expiresAt, qrCodeUrl, qrCodeBase64)
16
18
  is XenditCheckoutVoucherAdditionalInfo ->
17
19
  XenditCheckoutVoucherAdditionalInfoRN(expiresAt, couponCode, retailerName)
20
+ is AchAdditionalInfo.DisplayMandate ->
21
+ AchAdditionalInfoDisplayMandateRN()
18
22
  else -> null
19
23
  }
@@ -2,25 +2,52 @@ package com.primerioreactnative.extensions
2
2
 
3
3
  import com.primerioreactnative.datamodels.*
4
4
  import io.primer.android.data.settings.*
5
+ import io.primer.android.data.settings.PrimerStripeOptions.MandateData.TemplateMandateData
6
+ import io.primer.android.data.settings.PrimerStripeOptions.MandateData.FullMandateData
7
+ import io.primer.android.data.settings.PrimerStripeOptions.MandateData.FullMandateStringData
8
+ import android.content.Context
5
9
 
6
- fun PrimerPaymentMethodOptionsRN.toPrimerPaymentMethodOptions() = PrimerPaymentMethodOptions(
7
- androidSettingsRN.redirectScheme,
8
- googlePayOptions.toPrimerGooglePayOptions(),
9
- klarnaOptions.toPrimerKlarnaOptions(),
10
- threeDsOptions.toPrimerThreeDsOptions()
11
- )
10
+ fun PrimerPaymentMethodOptionsRN.toPrimerPaymentMethodOptions(context: Context) =
11
+ PrimerPaymentMethodOptions(
12
+ androidSettingsRN.redirectScheme,
13
+ googlePayOptions.toPrimerGooglePayOptions(),
14
+ klarnaOptions.toPrimerKlarnaOptions(),
15
+ threeDsOptions.toPrimerThreeDsOptions(),
16
+ stripeOptions.toPrimerStripeOptions(context),
17
+ )
12
18
 
13
19
  fun PrimerGooglePayOptionsRN.toPrimerGooglePayOptions() =
14
- PrimerGooglePayOptions(
15
- merchantName = merchantName,
16
- allowedCardNetworks = allowedCardNetworks,
17
- buttonStyle = buttonStyle,
18
- captureBillingAddress = captureBillingAddress,
19
- existingPaymentMethodRequired = existingPaymentMethodRequired
20
- )
20
+ PrimerGooglePayOptions(
21
+ merchantName = merchantName,
22
+ allowedCardNetworks = allowedCardNetworks,
23
+ buttonStyle = buttonStyle,
24
+ captureBillingAddress = captureBillingAddress,
25
+ existingPaymentMethodRequired = existingPaymentMethodRequired
26
+ )
21
27
 
22
28
  fun PrimerKlarnaOptionsRN.toPrimerKlarnaOptions() =
23
- PrimerKlarnaOptions(recurringPaymentDescription, webViewTitle)
29
+ PrimerKlarnaOptions(recurringPaymentDescription, webViewTitle)
24
30
 
25
31
  fun PrimerThreeDsOptionsRN.toPrimerThreeDsOptions() =
26
- PrimerThreeDsOptions(threeDsOptionsAndroid?.threeDsAppRequestorUrl)
32
+ PrimerThreeDsOptions(threeDsOptionsAndroid?.threeDsAppRequestorUrl)
33
+
34
+ fun PrimerStripeOptionsRN.toPrimerStripeOptions(context: Context) =
35
+ PrimerStripeOptions(mandateData = mandateData?.toMandateData(context), publishableKey = publishableKey)
36
+
37
+ private fun PrimerStripeOptionsRN.MandateDataRN.toMandateData(context: Context) = when {
38
+ merchantName != null -> TemplateMandateData(merchantName)
39
+ fullMandateStringResName != null -> {
40
+ val stringId = context.getResources().getIdentifier(fullMandateStringResName, "string", context.getPackageName())
41
+ if (stringId != 0) {
42
+ FullMandateData(stringId)
43
+ } else {
44
+ if (fullMandateText != null) {
45
+ FullMandateStringData(fullMandateText)
46
+ } else {
47
+ error("Missing mandate data")
48
+ }
49
+ }
50
+ }
51
+ fullMandateText != null -> FullMandateStringData(fullMandateText)
52
+ else -> error("Missing mandate data")
53
+ }
@@ -0,0 +1,54 @@
1
+ //
2
+ // RNTAchUserDetailsCollectableData.swift
3
+ // Pods
4
+ //
5
+ // Created by Flaviu Dunca on 12.06.2024.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+
11
+ protocol AchUserDetailsCollectableDataRN {
12
+ var validatableDataName: String { get }
13
+ }
14
+
15
+ class FirstNameRN: AchUserDetailsCollectableDataRN, Encodable {
16
+ let validatableDataName: String = "firstName"
17
+ let value: String
18
+
19
+ init(value: String) {
20
+ self.value = value
21
+ }
22
+ }
23
+
24
+ class LastNameRN: AchUserDetailsCollectableDataRN, Encodable {
25
+ let validatableDataName: String = "lastName"
26
+ let value: String
27
+
28
+ init(value: String) {
29
+ self.value = value
30
+ }
31
+ }
32
+
33
+ class EmailAddressRN: AchUserDetailsCollectableDataRN, Encodable {
34
+ let validatableDataName: String = "emailAddress"
35
+ let value: String
36
+
37
+ init(value: String) {
38
+ self.value = value
39
+ }
40
+ }
41
+
42
+ extension ACHUserDetailsCollectableData {
43
+ func toFirstNameRN(value: String) -> FirstNameRN {
44
+ return FirstNameRN(value: value)
45
+ }
46
+
47
+ func toLastNameRN(value: String) -> LastNameRN {
48
+ return LastNameRN(value: value)
49
+ }
50
+
51
+ func toEmailAddressRN(value: String) -> EmailAddressRN {
52
+ return EmailAddressRN(value: value)
53
+ }
54
+ }
@@ -0,0 +1,40 @@
1
+ //
2
+ // RNTAchUserDetailsStep.swift
3
+ // Pods
4
+ //
5
+ // Created by Flaviu Dunca on 12.06.2024.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+
11
+ protocol AchUserDetailsStepRN {
12
+ var stepName: String { get }
13
+ }
14
+
15
+ class UserDetailsCollectedRN: AchUserDetailsStepRN, Encodable {
16
+ let stepName: String = "userDetailsCollected"
17
+ }
18
+
19
+ class UserDetailsRetrievedRN: AchUserDetailsStepRN, Encodable {
20
+ let stepName: String = "userDetailsRetrieved"
21
+ let firstName: String
22
+ let lastName: String
23
+ let emailAddress: String
24
+
25
+ init(firstName: String, lastName: String, emailAddress: String) {
26
+ self.firstName = firstName
27
+ self.lastName = lastName
28
+ self.emailAddress = emailAddress
29
+ }
30
+ }
31
+
32
+ extension ACHUserDetailsStep {
33
+ func toUserDetailsCollectedRN() -> UserDetailsCollectedRN {
34
+ return UserDetailsCollectedRN()
35
+ }
36
+
37
+ func toUserDetailsRetrievedRN(firstName: String, lastName: String, emailAddress: String) -> UserDetailsRetrievedRN {
38
+ return UserDetailsRetrievedRN(firstName: firstName, lastName: lastName, emailAddress: emailAddress)
39
+ }
40
+ }