judokit-react-native 4.1.3 → 4.2.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 (101) hide show
  1. package/JudoKit-ReactNative.podspec +42 -0
  2. package/LICENSE +1 -2
  3. package/README.md +106 -119
  4. package/android/build.gradle +65 -202
  5. package/android/gradle.properties +6 -1
  6. package/android/src/main/AndroidManifest.xml +2 -2
  7. package/android/src/main/AndroidManifestNew.xml +2 -0
  8. package/android/src/main/java/com/judopay/judokit/reactnative/Extensions.kt +382 -0
  9. package/android/src/main/java/com/judopay/judokit/reactnative/Helpers.kt +653 -0
  10. package/android/src/main/java/com/judopay/judokit/reactnative/JudoActivityEventListener.kt +49 -0
  11. package/android/src/main/java/com/judopay/judokit/reactnative/JudoKitReactNativeModule.kt +238 -0
  12. package/android/src/main/java/com/judopay/judokit/reactnative/JudoKitReactNativePackage.kt +16 -0
  13. package/ios/{Classes/Extensions → Extensions}/NSDictionary+JudoConvert.h +1 -1
  14. package/ios/{Classes/Extensions → Extensions}/NSDictionary+JudoConvert.m +2 -2
  15. package/ios/{Classes/Extensions → Extensions}/NSException+JudoValidationExceptions.h +1 -1
  16. package/ios/{Classes/Extensions → Extensions}/NSException+JudoValidationExceptions.m +1 -1
  17. package/ios/{Classes/Extensions → Extensions}/UIColor+RNAdditions.h +1 -1
  18. package/ios/{Classes/Extensions → Extensions}/UIColor+RNAdditions.m +3 -3
  19. package/ios/{Classes/RNJudo.h → JudoKitReactNative.h} +12 -6
  20. package/ios/{Classes/RNJudo.m → JudoKitReactNative.mm} +83 -81
  21. package/ios/{Classes/RNTypes.h → RNTypes.h} +8 -2
  22. package/ios/{Classes/Wrappers → Wrappers}/RNApplePayWrappers.h +1 -1
  23. package/ios/{Classes/Wrappers → Wrappers}/RNApplePayWrappers.m +105 -4
  24. package/ios/{Classes/Wrappers → Wrappers}/RNWrappers.h +14 -14
  25. package/ios/{Classes/Wrappers → Wrappers}/RNWrappers.m +46 -25
  26. package/lib/commonjs/index.js +268 -0
  27. package/lib/commonjs/index.js.map +1 -0
  28. package/lib/commonjs/judo-kit/index.js +212 -0
  29. package/lib/commonjs/judo-kit/index.js.map +1 -0
  30. package/lib/commonjs/types/index.js +267 -0
  31. package/lib/commonjs/types/index.js.map +1 -0
  32. package/lib/commonjs/types/judo-apple-pay-configuration.js +49 -0
  33. package/lib/commonjs/types/judo-apple-pay-configuration.js.map +1 -0
  34. package/lib/commonjs/types/judo-configuration.js +71 -0
  35. package/lib/commonjs/types/judo-configuration.js.map +1 -0
  36. package/lib/commonjs/types/judo-google-pay-configuration.js +28 -0
  37. package/lib/commonjs/types/judo-google-pay-configuration.js.map +1 -0
  38. package/lib/module/index.js +6 -0
  39. package/lib/module/index.js.map +1 -0
  40. package/lib/module/judo-kit/index.js +205 -0
  41. package/lib/module/judo-kit/index.js.map +1 -0
  42. package/lib/module/types/index.js +8 -0
  43. package/lib/module/types/index.js.map +1 -0
  44. package/lib/module/types/judo-apple-pay-configuration.js +43 -0
  45. package/lib/module/types/judo-apple-pay-configuration.js.map +1 -0
  46. package/lib/module/types/judo-configuration.js +65 -0
  47. package/lib/module/types/judo-configuration.js.map +1 -0
  48. package/lib/module/types/judo-google-pay-configuration.js +22 -0
  49. package/lib/module/types/judo-google-pay-configuration.js.map +1 -0
  50. package/lib/typescript/src/index.d.ts +4 -0
  51. package/lib/typescript/src/index.d.ts.map +1 -0
  52. package/lib/typescript/src/judo-kit/index.d.ts +86 -0
  53. package/lib/typescript/src/judo-kit/index.d.ts.map +1 -0
  54. package/lib/typescript/src/types/index.d.ts +4 -0
  55. package/lib/typescript/src/types/index.d.ts.map +1 -0
  56. package/lib/typescript/src/types/judo-apple-pay-configuration.d.ts +75 -0
  57. package/lib/typescript/src/types/judo-apple-pay-configuration.d.ts.map +1 -0
  58. package/lib/typescript/src/types/judo-configuration.d.ts +236 -0
  59. package/lib/typescript/src/types/judo-configuration.d.ts.map +1 -0
  60. package/lib/typescript/src/types/judo-google-pay-configuration.d.ts +42 -0
  61. package/lib/typescript/src/types/judo-google-pay-configuration.d.ts.map +1 -0
  62. package/package.json +158 -79
  63. package/src/index.tsx +50 -0
  64. package/src/judo-kit/index.ts +262 -0
  65. package/src/types/index.ts +53 -0
  66. package/src/types/judo-apple-pay-configuration.ts +85 -0
  67. package/src/types/judo-configuration.ts +263 -0
  68. package/src/types/judo-google-pay-configuration.ts +47 -0
  69. package/JudoPay.tsx +0 -334
  70. package/RNJudopay.podspec +0 -24
  71. package/android/src/main/java/com/reactlibrary/Extensions.kt +0 -372
  72. package/android/src/main/java/com/reactlibrary/Helpers.kt +0 -606
  73. package/android/src/main/java/com/reactlibrary/JudoReactNativeActivityEventListener.kt +0 -48
  74. package/android/src/main/java/com/reactlibrary/JudoReactNativeModule.kt +0 -257
  75. package/android/src/main/java/com/reactlibrary/JudoReactNativePBBAManager.kt +0 -52
  76. package/android/src/main/java/com/reactlibrary/JudoReactNativePackage.kt +0 -14
  77. package/components/JudoPBBAButton.ts +0 -2
  78. package/ios/.xcode.env +0 -11
  79. package/ios/Classes/Views/RNPBBAButtonManager.m +0 -42
  80. package/ios/Classes/Wrappers/RNPBBAWrappers.h +0 -40
  81. package/ios/Classes/Wrappers/RNPBBAWrappers.m +0 -57
  82. package/ios/Podfile +0 -44
  83. package/ios/Podfile.lock +0 -572
  84. package/ios/RNJudo.xcodeproj/project.pbxproj +0 -703
  85. package/ios/RNJudo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  86. package/ios/RNJudo.xcodeproj/xcshareddata/xcschemes/RNJudo.xcscheme +0 -97
  87. package/ios/RNJudo.xcworkspace/contents.xcworkspacedata +0 -10
  88. package/ios/RNJudoTests/Info.plist +0 -22
  89. package/ios/RNJudoTests/MockConfiguration.json +0 -114
  90. package/ios/RNJudoTests/NSDictionaryConvertTests.m +0 -475
  91. package/ios/RNJudoTests/RNApplePayWrappersTests.m +0 -770
  92. package/ios/RNJudoTests/RNJudoTests.m +0 -37
  93. package/ios/RNJudoTests/RNMocks.h +0 -54
  94. package/ios/RNJudoTests/RNMocks.m +0 -55
  95. package/ios/RNJudoTests/RNPBBAWrappersTests.m +0 -121
  96. package/ios/RNJudoTests/RNThemeTests.m +0 -576
  97. package/ios/RNJudoTests/RNWrappersTests.m +0 -947
  98. package/types/JudoApplePayTypes.tsx +0 -59
  99. package/types/JudoGooglePayTypes.tsx +0 -47
  100. package/types/JudoPBBATypes.tsx +0 -7
  101. package/types/JudoTypes.tsx +0 -251
@@ -0,0 +1,653 @@
1
+ package com.judopay.judokit.reactnative
2
+
3
+ import android.os.Build
4
+ import android.os.Bundle
5
+ import com.facebook.react.bridge.Arguments
6
+ import com.facebook.react.bridge.ReadableMap
7
+ import com.facebook.react.bridge.WritableMap
8
+ import com.judopay.judo3ds2.customization.ButtonCustomization
9
+ import com.judopay.judo3ds2.customization.LabelCustomization
10
+ import com.judopay.judo3ds2.customization.TextBoxCustomization
11
+ import com.judopay.judo3ds2.customization.ToolbarCustomization
12
+ import com.judopay.judo3ds2.customization.UiCustomization
13
+ import com.judopay.judokit.android.Judo
14
+ import com.judopay.judokit.android.api.model.Authorization
15
+ import com.judopay.judokit.android.api.model.BasicAuthorization
16
+ import com.judopay.judokit.android.api.model.PaymentSessionAuthorization
17
+ import com.judopay.judokit.android.api.model.request.Address
18
+ import com.judopay.judokit.android.model.Amount
19
+ import com.judopay.judokit.android.model.CardNetwork
20
+ import com.judopay.judokit.android.model.ChallengeRequestIndicator
21
+ import com.judopay.judokit.android.model.Currency
22
+ import com.judopay.judokit.android.model.GooglePayConfiguration
23
+ import com.judopay.judokit.android.model.JudoResult
24
+ import com.judopay.judokit.android.model.NetworkTimeout
25
+ import com.judopay.judokit.android.model.PaymentMethod
26
+ import com.judopay.judokit.android.model.PaymentWidgetType
27
+ import com.judopay.judokit.android.model.PrimaryAccountDetails
28
+ import com.judopay.judokit.android.model.RecommendationConfiguration
29
+ import com.judopay.judokit.android.model.Reference
30
+ import com.judopay.judokit.android.model.ScaExemption
31
+ import com.judopay.judokit.android.model.SubProductInfo
32
+ import com.judopay.judokit.android.model.UiConfiguration
33
+ import com.judopay.judokit.android.model.googlepay.GooglePayAddressFormat
34
+ import com.judopay.judokit.android.model.googlepay.GooglePayBillingAddressParameters
35
+ import com.judopay.judokit.android.model.googlepay.GooglePayCheckoutOption
36
+ import com.judopay.judokit.android.model.googlepay.GooglePayEnvironment
37
+ import com.judopay.judokit.android.model.googlepay.GooglePayPriceStatus
38
+ import com.judopay.judokit.android.model.googlepay.GooglePayShippingAddressParameters
39
+
40
+ // For consistency with:
41
+ // https://github.com/Judopay/JudoKit-iOS/blob/master/Source/Models/Response/JPResponse.m#L36
42
+ private const val TRANSACTION_TYPE_PAYMENT = "payment"
43
+ private const val TRANSACTION_TYPE_PRE_AUTH = "preauth"
44
+ private const val TRANSACTION_TYPE_REGISTER = "register"
45
+ private const val TRANSACTION_TYPE_REGISTER_CARD = "registercard"
46
+ private const val TRANSACTION_TYPE_SAVE_CARD = "save"
47
+ private const val TRANSACTION_TYPE_CHECK_CARD = "checkcard"
48
+
49
+ // For consistency with:
50
+ // https://github.com/Judopay/JudoKit-iOS/blob/master/Source/Models/Transaction/JPTransactionType.h#L30
51
+ private enum class TransactionType(val value: Int, val typeAsStrings: List<String>? = null) {
52
+ PAYMENT(1, listOf(TRANSACTION_TYPE_PAYMENT)),
53
+ PRE_AUTH(2, listOf(TRANSACTION_TYPE_PRE_AUTH)),
54
+ REGISTER_CARD(3, listOf(TRANSACTION_TYPE_REGISTER, TRANSACTION_TYPE_REGISTER_CARD)),
55
+ CHECK_CARD(4, listOf(TRANSACTION_TYPE_CHECK_CARD)),
56
+ SAVE_CARD(5, listOf(TRANSACTION_TYPE_SAVE_CARD)),
57
+ UNKNOWN(-1),
58
+ }
59
+
60
+ // For consistency with:
61
+ // https://github.com/Judopay/JudoKit-iOS/blob/master/Source/Models/Response/JPResponse.m#L32
62
+ private const val STATUS_DECLINED = "declined"
63
+ private const val STATUS_SUCCESS = "success"
64
+ private const val STATUS_ERROR = "error"
65
+
66
+ // For consistency with:
67
+ // https://github.com/Judopay/JudoKit-iOS/blob/abd34bbfe4784fb5f074ed30f93d6743ba295622/Source/Models/Transaction/JPTransactionResult.h#L27
68
+ private enum class TransactionResult(val value: Int, val status: String? = null) {
69
+ ERROR(0, STATUS_ERROR),
70
+ SUCCESS(1, STATUS_SUCCESS),
71
+ DECLINED(2, STATUS_DECLINED),
72
+ UNKNOWN(-1),
73
+ }
74
+
75
+ internal fun getTransactionConfiguration(options: ReadableMap): Judo {
76
+ val widgetType = getTransactionTypeWidget(options)
77
+ return getJudoConfiguration(widgetType, options)
78
+ }
79
+
80
+ internal fun getTokenTransactionConfiguration(options: ReadableMap): Judo {
81
+ val widgetType = getTransactionModeWidget(options)
82
+ return getJudoConfiguration(widgetType, options)
83
+ }
84
+
85
+ internal fun getGoogleTransactionConfiguration(options: ReadableMap): Judo {
86
+ val type =
87
+ when (options.transactionMode) {
88
+ 0 -> PaymentWidgetType.GOOGLE_PAY
89
+ else -> PaymentWidgetType.PRE_AUTH_GOOGLE_PAY
90
+ }
91
+ return getJudoConfiguration(type, options)
92
+ }
93
+
94
+ internal fun getPaymentMethodsConfiguration(options: ReadableMap): Judo {
95
+ val type =
96
+ when (options.transactionMode) {
97
+ 0 -> PaymentWidgetType.PAYMENT_METHODS
98
+ 1 -> PaymentWidgetType.PRE_AUTH_PAYMENT_METHODS
99
+ 2 -> PaymentWidgetType.SERVER_TO_SERVER_PAYMENT_METHODS
100
+ else -> PaymentWidgetType.PAYMENT_METHODS
101
+ }
102
+ return getJudoConfiguration(type, options)
103
+ }
104
+
105
+ internal fun getMappedType(type: String?): Int {
106
+ val typeInLowercase = type?.lowercase()
107
+ val typeValue =
108
+ TransactionType.values().firstOrNull { it.typeAsStrings?.contains(typeInLowercase) ?: false }
109
+
110
+ return typeValue?.value ?: TransactionType.UNKNOWN.value
111
+ }
112
+
113
+ // consistent with:
114
+ // https://github.com/Judopay/JudoKit-iOS/blob/master/Source/Models/Response/JPResponse.m#L125
115
+ internal fun getMappedResult(result: String?): Int {
116
+ val resultInLowercase = result?.lowercase()
117
+ val resultValue = TransactionResult.values().firstOrNull { it.status == resultInLowercase }
118
+
119
+ return resultValue?.value ?: TransactionResult.UNKNOWN.value
120
+ }
121
+
122
+ internal fun getMappedResult(result: JudoResult?): WritableMap {
123
+ val map = Arguments.createMap()
124
+ map.putString("receiptId", result?.receiptId)
125
+ map.putString("yourPaymentReference", result?.yourPaymentReference)
126
+ map.putInt("type", getMappedType(result?.type))
127
+ map.putString("createdAt", result?.createdAt.toString())
128
+ map.putInt("result", getMappedResult(result?.result))
129
+ map.putString("message", result?.message)
130
+ map.putString("judoId", result?.judoId)
131
+ map.putString("merchantName", result?.merchantName)
132
+ map.putString("appearsOnStatementAs", result?.appearsOnStatementAs)
133
+ map.putString("originalAmount", result?.originalAmount.toString())
134
+ map.putString("netAmount", result?.netAmount.toString())
135
+ map.putString("amount", result?.amount.toString())
136
+ map.putString("currency", result?.currency)
137
+
138
+ val cardDetailsMap = Arguments.createMap()
139
+ cardDetailsMap.putString("cardLastFour", result?.cardDetails?.lastFour)
140
+ cardDetailsMap.putString("endDate", result?.cardDetails?.endDate)
141
+ cardDetailsMap.putString("cardToken", result?.cardDetails?.token)
142
+ result?.cardDetails?.type?.let { cardDetailsMap.putInt("cardNetwork", it) }
143
+ cardDetailsMap.putString("bank", result?.cardDetails?.bank)
144
+ cardDetailsMap.putString("cardCategory", result?.cardDetails?.category)
145
+ cardDetailsMap.putString("cardCountry", result?.cardDetails?.country)
146
+ cardDetailsMap.putString("cardFunding", result?.cardDetails?.funding)
147
+ cardDetailsMap.putString("cardScheme", result?.cardDetails?.scheme)
148
+ cardDetailsMap.putString("cardHolderName", result?.cardDetails?.cardHolderName)
149
+
150
+ map.putMap("cardDetails", cardDetailsMap)
151
+
152
+ val consumerMap = Arguments.createMap()
153
+ consumerMap.putString("consumerToken", result?.consumer?.consumerToken)
154
+ consumerMap.putString("consumerReference", result?.consumer?.yourConsumerReference)
155
+
156
+ map.putMap("consumer", consumerMap)
157
+
158
+ return map
159
+ }
160
+
161
+ internal fun getJudoConfigurationForApiService(options: ReadableMap): Judo {
162
+ val authorization = getAuthorization(options)
163
+
164
+ val amount =
165
+ Amount.Builder()
166
+ .setAmount("0.00")
167
+ .setCurrency(Currency.GBP)
168
+ .build()
169
+
170
+ val reference =
171
+ Reference.Builder()
172
+ .setConsumerReference("reference")
173
+ .build()
174
+
175
+ return Judo.Builder(PaymentWidgetType.CARD_PAYMENT)
176
+ .setIsSandboxed(options.isSandboxed)
177
+ .setJudoId("000000")
178
+ .setAuthorization(authorization)
179
+ .setAmount(amount)
180
+ .setReference(reference)
181
+ .setSubProductInfo(getSubProductInfo(options))
182
+ .build()
183
+ }
184
+
185
+ internal fun getJudoConfiguration(
186
+ type: PaymentWidgetType,
187
+ options: ReadableMap,
188
+ ): Judo {
189
+ val authorization = getAuthorization(options)
190
+ val amount = getAmount(options)
191
+ val reference = getReference(options)
192
+ val cardNetworks = getCardNetworks(options)
193
+ val paymentMethods = getPaymentMethods(options)
194
+ val uiConfiguration = getUIConfiguration(options)
195
+ val primaryAccountDetails = getPrimaryAccountDetails(options)
196
+ val googlePayConfiguration = getGooglePayConfiguration(options)
197
+ val timeouts = getNetworkTimeout(options)
198
+ val challengeRequestIndicator = getChallengeRequestIndicator(options)
199
+ val scaExemption = getScaExemption(options)
200
+ val address = getAddress(options)
201
+
202
+ val builder =
203
+ Judo.Builder(type)
204
+ .setAuthorization(authorization)
205
+ .setIsSandboxed(options.isSandboxed)
206
+ .setJudoId(options.judoId)
207
+ .setAmount(amount)
208
+ .setReference(reference)
209
+ .setSupportedCardNetworks(cardNetworks)
210
+ .setPaymentMethods(paymentMethods)
211
+ .setUiConfiguration(uiConfiguration)
212
+ .setPrimaryAccountDetails(primaryAccountDetails)
213
+ .setGooglePayConfiguration(googlePayConfiguration)
214
+ .setInitialRecurringPayment(options.isInitialRecurringPayment)
215
+ .setDelayedAuthorisation(options.isDelayedAuthorisation)
216
+ .setNetworkTimeout(timeouts)
217
+ .setChallengeRequestIndicator(challengeRequestIndicator)
218
+ .setScaExemption(scaExemption)
219
+ .setMobileNumber(options.mobileNumber)
220
+ .setEmailAddress(options.emailAddress)
221
+ .setThreeDSTwoMaxTimeout(options.threeDSTwoMaxTimeout)
222
+ .setThreeDSTwoMessageVersion(options.threeDSTwoMessageVersion)
223
+ .setPhoneCountryCode(options.phoneCountryCode)
224
+ .setAddress(address)
225
+ .setSubProductInfo(getSubProductInfo(options))
226
+
227
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
228
+ builder.setRecommendationConfiguration(getRecommendationConfiguration(options))
229
+ }
230
+
231
+ return builder.build()
232
+ }
233
+
234
+ internal fun getRecommendationConfiguration(options: ReadableMap): RecommendationConfiguration? {
235
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && options.recommendationConfiguration != null) {
236
+ RecommendationConfiguration.Builder()
237
+ .setUrl(options.recommendationURL)
238
+ .setRsaPublicKey(options.recommendationRSAPublicKey)
239
+ .setTimeout(options.recommendationTimeout)
240
+ .build()
241
+ } else {
242
+ null
243
+ }
244
+ }
245
+
246
+ internal fun getAddress(options: ReadableMap): Address? {
247
+ if (options.cardAddress != null) {
248
+ return Address.Builder()
249
+ .setLine1(options.cardAddressLine1)
250
+ .setLine2(options.cardAddressLine2)
251
+ .setLine3(options.cardAddressLine3)
252
+ .setTown(options.cardAddressTown)
253
+ .setPostCode(options.cardAddressPostCode)
254
+ .setCountryCode(options.cardAddressCountryCode)
255
+ .setState(options.cardAddressState)
256
+ .build()
257
+ }
258
+ return null
259
+ }
260
+
261
+ internal fun getNetworkTimeout(options: ReadableMap): NetworkTimeout? {
262
+ val networkTimeout = options.networkTimeout
263
+ if (networkTimeout != null) {
264
+ return NetworkTimeout.Builder()
265
+ .setConnectTimeout(options.networkConnectTimeout)
266
+ .setReadTimeout(options.networkReadTimeout)
267
+ .setWriteTimeout(options.networkWriteTimeout)
268
+ .build()
269
+ }
270
+ return null
271
+ }
272
+
273
+ internal fun getChallengeRequestIndicator(options: ReadableMap): ChallengeRequestIndicator? =
274
+ ChallengeRequestIndicator.values().firstOrNull { it.value == options.challengeRequestIndicator }
275
+
276
+ internal fun getScaExemption(options: ReadableMap): ScaExemption? = ScaExemption.values().firstOrNull { it.value == options.scaExemption }
277
+
278
+ internal fun getAuthorization(options: ReadableMap): Authorization {
279
+ val token = options.token
280
+
281
+ options.secret?.let { secret ->
282
+ return BasicAuthorization.Builder()
283
+ .setApiToken(token)
284
+ .setApiSecret(secret)
285
+ .build()
286
+ }
287
+
288
+ options.paymentSession?.let { paymentSession ->
289
+ return PaymentSessionAuthorization.Builder()
290
+ .setApiToken(token)
291
+ .setPaymentSession(paymentSession)
292
+ .build()
293
+ }
294
+
295
+ throw IllegalArgumentException("No secret or payment session in the authorization")
296
+ }
297
+
298
+ internal fun getTransactionTypeWidget(options: ReadableMap) =
299
+ when (options.getInt("transactionType")) {
300
+ 1 -> PaymentWidgetType.CARD_PAYMENT
301
+ 2 -> PaymentWidgetType.PRE_AUTH
302
+ 3 -> PaymentWidgetType.REGISTER_CARD
303
+ 4 -> PaymentWidgetType.CHECK_CARD
304
+ 5 -> PaymentWidgetType.CREATE_CARD_TOKEN
305
+ else -> throw IllegalArgumentException("Unknown transaction type")
306
+ }
307
+
308
+ internal fun getTransactionModeWidget(options: ReadableMap) =
309
+ when (options.getInt("transactionMode")) {
310
+ 1 -> PaymentWidgetType.PRE_AUTH
311
+ else -> PaymentWidgetType.CARD_PAYMENT
312
+ }
313
+
314
+ internal fun getAmount(options: ReadableMap): Amount {
315
+ val currency =
316
+ when (val currencyValue = options.currencyValue) {
317
+ null -> Currency.GBP
318
+ else -> Currency.valueOf(currencyValue)
319
+ }
320
+ return Amount.Builder()
321
+ .setAmount(options.amountValue)
322
+ .setCurrency(currency)
323
+ .build()
324
+ }
325
+
326
+ internal fun getSubProductInfo(options: ReadableMap): SubProductInfo {
327
+ val version = options.packageVersion ?: ""
328
+ return SubProductInfo.ReactNative(version)
329
+ }
330
+
331
+ internal fun getReference(options: ReadableMap): Reference? {
332
+ var builder =
333
+ Reference.Builder()
334
+ .setConsumerReference(options.consumerReference)
335
+ .setPaymentReference(options.paymentReference)
336
+
337
+ val metadataMap = options.metadata
338
+ metadataMap?.let {
339
+ val bundle = Bundle()
340
+ metadataMap.toHashMap().forEach {
341
+ bundle.putString(it.key, it.value.toString())
342
+ }
343
+ builder = builder.setMetaData(bundle)
344
+ }
345
+
346
+ return builder.build()
347
+ }
348
+
349
+ internal fun getCardNetworks(options: ReadableMap): Array<CardNetwork>? {
350
+ val cardVisa = 1
351
+ val cardMastercard = 1 shl 1
352
+ val cardMaestro = 1 shl 2
353
+ val cardAmex = 1 shl 3
354
+ val cardChinaUnionPay = 1 shl 4
355
+ val cardJcb = 1 shl 5
356
+ val cardDiscover = 1 shl 6
357
+ val cardDinersClub = 1 shl 7
358
+ val cardsAll = 1 shl 8
359
+
360
+ var supportedNetworks: MutableList<CardNetwork>? = null
361
+
362
+ val cardValue = options.cardNetworkValue
363
+ cardValue?.let {
364
+ supportedNetworks = ArrayList()
365
+
366
+ if (cardValue and cardVisa == cardVisa) {
367
+ supportedNetworks?.add(CardNetwork.VISA)
368
+ }
369
+
370
+ if (cardValue and cardMastercard == cardMastercard) {
371
+ supportedNetworks?.add(CardNetwork.MASTERCARD)
372
+ }
373
+
374
+ if (cardValue and cardMaestro == cardMaestro) {
375
+ supportedNetworks?.add(CardNetwork.MAESTRO)
376
+ }
377
+
378
+ if (cardValue and cardAmex == cardAmex) {
379
+ supportedNetworks?.add(CardNetwork.AMEX)
380
+ }
381
+
382
+ if (cardValue and cardChinaUnionPay == cardChinaUnionPay) {
383
+ supportedNetworks?.add(CardNetwork.CHINA_UNION_PAY)
384
+ }
385
+
386
+ if (cardValue and cardJcb == cardJcb) {
387
+ supportedNetworks?.add(CardNetwork.JCB)
388
+ }
389
+
390
+ if (cardValue and cardDiscover == cardDiscover) {
391
+ supportedNetworks?.add(CardNetwork.DISCOVER)
392
+ }
393
+
394
+ if (cardValue and cardDinersClub == cardDinersClub) {
395
+ supportedNetworks?.add(CardNetwork.DINERS_CLUB)
396
+ }
397
+
398
+ if (cardValue and cardsAll == cardsAll) {
399
+ return CardNetwork.values()
400
+ }
401
+ }
402
+ return supportedNetworks?.toTypedArray()
403
+ }
404
+
405
+ internal fun getPaymentMethods(options: ReadableMap): Array<PaymentMethod>? {
406
+ var paymentMethods: ArrayList<PaymentMethod>? = null
407
+
408
+ val cardPaymentValue = 1
409
+ val googlePaymentValue = 1 shl 2
410
+ val idealPaymentValue = 1 shl 3
411
+ val allPaymentValues = 1 shl 5
412
+
413
+ options.paymentMethodValue?.let {
414
+ paymentMethods = arrayListOf()
415
+
416
+ if (it and cardPaymentValue == cardPaymentValue) {
417
+ paymentMethods?.add(PaymentMethod.CARD)
418
+ }
419
+
420
+ if (it and googlePaymentValue == googlePaymentValue) {
421
+ paymentMethods?.add(PaymentMethod.GOOGLE_PAY)
422
+ }
423
+
424
+ if (it and idealPaymentValue == idealPaymentValue) {
425
+ paymentMethods?.add(PaymentMethod.IDEAL)
426
+ }
427
+
428
+ if (it and allPaymentValues == allPaymentValues) {
429
+ return PaymentMethod.values()
430
+ }
431
+ }
432
+
433
+ return paymentMethods?.toTypedArray()
434
+ }
435
+
436
+ internal fun getUIConfiguration(options: ReadableMap): UiConfiguration? {
437
+ return if (options.uiConfiguration != null) {
438
+ UiConfiguration.Builder()
439
+ .setAvsEnabled(options.isAVSEnabled)
440
+ .setShouldPaymentMethodsDisplayAmount(options.shouldPaymentMethodsDisplayAmount)
441
+ .setShouldPaymentButtonDisplayAmount(options.shouldPaymentButtonDisplayAmount)
442
+ .setShouldPaymentMethodsVerifySecurityCode(options.shouldPaymentMethodsVerifySecurityCode)
443
+ .setShouldAskForBillingInformation(options.shouldAskForBillingInformation)
444
+ .setThreeDSUiCustomization(getThreeDSUiCustomization(options))
445
+ .setShouldAskForCSC(options.shouldAskForCSC)
446
+ .setShouldAskForCardholderName(options.shouldAskForCardholderName)
447
+ .build()
448
+ } else {
449
+ null
450
+ }
451
+ }
452
+
453
+ internal fun getThreeDSUiCustomization(options: ReadableMap): UiCustomization? {
454
+ return if (options.threeDSUIConfiguration != null) {
455
+ val uiCustomization = UiCustomization()
456
+
457
+ options.threeDSUIToolbarCustomization?.let {
458
+ uiCustomization.setToolbarCustomization(
459
+ ToolbarCustomization().apply {
460
+ setTextFontName(it.textFontName)
461
+ setTextColor(it.textColor)
462
+ setTextFontSize(it.textFontSize)
463
+ setBackgroundColor(it.backgroundColor)
464
+ setHeaderText(it.headerText)
465
+ setButtonText(it.buttonText)
466
+ },
467
+ )
468
+ }
469
+
470
+ options.threeDSUILabelCustomization?.let {
471
+ uiCustomization.setLabelCustomization(
472
+ LabelCustomization().apply {
473
+ setTextFontName(it.textFontName)
474
+ setTextColor(it.textColor)
475
+ setTextFontSize(it.textFontSize)
476
+ setHeadingTextFontName(it.headingTextFontName)
477
+ setHeadingTextColor(it.headingTextColor)
478
+ setHeadingTextFontSize(it.headingTextFontSize)
479
+ },
480
+ )
481
+ }
482
+
483
+ options.threeDSUITextBoxCustomization?.let {
484
+ uiCustomization.setTextBoxCustomization(
485
+ TextBoxCustomization().apply {
486
+ setTextFontName(it.textFontName)
487
+ setTextColor(it.textColor)
488
+ setTextFontSize(it.textFontSize)
489
+ setBorderWidth(it.borderWidth)
490
+ setBorderColor(it.borderColor)
491
+ setCornerRadius(it.cornerRadius)
492
+ },
493
+ )
494
+ }
495
+
496
+ if (options.threeDSUIButtonCustomizations != null) {
497
+ options.threeDSUISubmitButtonCustomization?.let {
498
+ uiCustomization.setButtonCustomization(
499
+ ButtonCustomization().apply {
500
+ setTextFontName(it.textFontName)
501
+ setTextColor(it.textColor)
502
+ setTextFontSize(it.textFontSize)
503
+ setBackgroundColor(it.backgroundColor)
504
+ setCornerRadius(it.cornerRadius)
505
+ },
506
+ UiCustomization.ButtonType.SUBMIT,
507
+ )
508
+ }
509
+
510
+ options.threeDSUINextButtonCustomization?.let {
511
+ uiCustomization.setButtonCustomization(
512
+ ButtonCustomization().apply {
513
+ setTextFontName(it.textFontName)
514
+ setTextColor(it.textColor)
515
+ setTextFontSize(it.textFontSize)
516
+ setBackgroundColor(it.backgroundColor)
517
+ setCornerRadius(it.cornerRadius)
518
+ },
519
+ UiCustomization.ButtonType.NEXT,
520
+ )
521
+ }
522
+
523
+ options.threeDSUIContinueButtonCustomization?.let {
524
+ uiCustomization.setButtonCustomization(
525
+ ButtonCustomization().apply {
526
+ setTextFontName(it.textFontName)
527
+ setTextColor(it.textColor)
528
+ setTextFontSize(it.textFontSize)
529
+ setBackgroundColor(it.backgroundColor)
530
+ setCornerRadius(it.cornerRadius)
531
+ },
532
+ UiCustomization.ButtonType.CONTINUE,
533
+ )
534
+ }
535
+
536
+ options.threeDSUICancelButtonCustomization?.let {
537
+ uiCustomization.setButtonCustomization(
538
+ ButtonCustomization().apply {
539
+ setTextFontName(it.textFontName)
540
+ setTextColor(it.textColor)
541
+ setTextFontSize(it.textFontSize)
542
+ setBackgroundColor(it.backgroundColor)
543
+ setCornerRadius(it.cornerRadius)
544
+ },
545
+ UiCustomization.ButtonType.CANCEL,
546
+ )
547
+ }
548
+
549
+ options.threeDSUIResendButtonCustomization?.let {
550
+ uiCustomization.setButtonCustomization(
551
+ ButtonCustomization().apply {
552
+ setTextFontName(it.textFontName)
553
+ setTextColor(it.textColor)
554
+ setTextFontSize(it.textFontSize)
555
+ setBackgroundColor(it.backgroundColor)
556
+ setCornerRadius(it.cornerRadius)
557
+ },
558
+ UiCustomization.ButtonType.RESEND,
559
+ )
560
+ }
561
+ }
562
+
563
+ uiCustomization
564
+ } else {
565
+ null
566
+ }
567
+ }
568
+
569
+ internal fun getPrimaryAccountDetails(options: ReadableMap): PrimaryAccountDetails? {
570
+ return if (options.primaryAccountDetails != null) {
571
+ PrimaryAccountDetails.Builder()
572
+ .setName(options.name)
573
+ .setAccountNumber(options.accountNumber)
574
+ .setDateOfBirth(options.dateOfBirth)
575
+ .setPostCode(options.postCode)
576
+ .build()
577
+ } else {
578
+ null
579
+ }
580
+ }
581
+
582
+ internal fun getGooglePayConfiguration(options: ReadableMap): GooglePayConfiguration? {
583
+ val environment =
584
+ when (options.environmentValue) {
585
+ 0 -> GooglePayEnvironment.TEST
586
+ else -> GooglePayEnvironment.PRODUCTION
587
+ }
588
+ val totalPriceStatus =
589
+ when (options.totalPriceStatus) {
590
+ 0 -> GooglePayPriceStatus.FINAL
591
+ 1 -> GooglePayPriceStatus.ESTIMATED
592
+ 2 -> GooglePayPriceStatus.NOT_CURRENTLY_KNOWN
593
+ else -> null
594
+ }
595
+
596
+ val checkoutOption =
597
+ when (options.checkoutOption) {
598
+ 0 -> GooglePayCheckoutOption.DEFAULT
599
+ 1 -> GooglePayCheckoutOption.COMPLETE_IMMEDIATE_PURCHASE
600
+ else -> null
601
+ }
602
+
603
+ val billingParameters = getBillingParameters(options)
604
+ val shippingParameters = getShippingParameters(options)
605
+
606
+ return if (options.googlePayConfiguration != null) {
607
+ GooglePayConfiguration.Builder()
608
+ .setEnvironment(environment)
609
+ .setMerchantName(options.merchantName)
610
+ .setTransactionCountryCode(options.countryCode)
611
+ .setTransactionId(options.transactionId)
612
+ .setTotalPriceStatus(totalPriceStatus)
613
+ .setTotalPriceLabel(options.totalPriceLabel)
614
+ .setCheckoutOption(checkoutOption)
615
+ .setIsEmailRequired(options.isEmailRequired)
616
+ .setIsBillingAddressRequired(options.isBillingAddressRequired)
617
+ .setBillingAddressParameters(billingParameters)
618
+ .setIsShippingAddressRequired(options.isShippingAddressRequired)
619
+ .setShippingAddressParameters(shippingParameters)
620
+ .setAllowPrepaidCards(options.allowPrepaidCards)
621
+ .setAllowCreditCards(options.allowCreditCards)
622
+ .build()
623
+ } else {
624
+ null
625
+ }
626
+ }
627
+
628
+ internal fun getBillingParameters(options: ReadableMap): GooglePayBillingAddressParameters? {
629
+ val addressFormat =
630
+ when (options.addressFormat) {
631
+ 0 -> GooglePayAddressFormat.MIN
632
+ else -> GooglePayAddressFormat.FULL
633
+ }
634
+ return GooglePayBillingAddressParameters(
635
+ addressFormat,
636
+ options.isBillingPhoneNumberRequired,
637
+ )
638
+ }
639
+
640
+ internal fun getShippingParameters(options: ReadableMap): GooglePayShippingAddressParameters? {
641
+ var allowedCountryCodes: Array<String>? = null
642
+ val allowedCountryArray = options.allowedCountryCodeList
643
+
644
+ allowedCountryArray?.let {
645
+ val countryList = allowedCountryArray.toArrayList().mapNotNull { it as String }
646
+ allowedCountryCodes = countryList.toTypedArray()
647
+ }
648
+
649
+ return GooglePayShippingAddressParameters(
650
+ allowedCountryCodes,
651
+ options.isShippingPhoneNumberRequired,
652
+ )
653
+ }
@@ -0,0 +1,49 @@
1
+ package com.judopay.judokit.reactnative
2
+
3
+ import android.app.Activity
4
+ import android.app.Activity.RESULT_CANCELED
5
+ import android.content.Intent
6
+ import com.facebook.react.bridge.BaseActivityEventListener
7
+ import com.facebook.react.bridge.Promise
8
+ import com.judopay.judokit.android.JUDO_ERROR
9
+ import com.judopay.judokit.android.JUDO_RESULT
10
+ import com.judopay.judokit.android.PAYMENT_CANCELLED
11
+ import com.judopay.judokit.android.PAYMENT_ERROR
12
+ import com.judopay.judokit.android.PAYMENT_SUCCESS
13
+ import com.judopay.judokit.android.model.JudoError
14
+ import com.judopay.judokit.android.model.JudoResult
15
+
16
+ const val JUDO_PAYMENT_WIDGET_REQUEST_CODE = 65520
17
+ const val JUDO_PROMISE_REJECTION_CODE = "JUDO_ERROR"
18
+
19
+ class JudoActivityEventListener : BaseActivityEventListener() {
20
+ internal var transactionPromise: Promise? = null
21
+
22
+ override fun onActivityResult(
23
+ activity: Activity?,
24
+ requestCode: Int,
25
+ resultCode: Int,
26
+ data: Intent?,
27
+ ) {
28
+ if (data == null || resultCode == RESULT_CANCELED || requestCode != JUDO_PAYMENT_WIDGET_REQUEST_CODE) {
29
+ return
30
+ }
31
+
32
+ try {
33
+ when (resultCode) {
34
+ PAYMENT_ERROR, PAYMENT_CANCELLED -> {
35
+ val error = data.getParcelableExtra<JudoError>(JUDO_ERROR)
36
+ transactionPromise?.reject(JUDO_PROMISE_REJECTION_CODE, error?.message)
37
+ }
38
+ PAYMENT_SUCCESS -> {
39
+ val result = data.getParcelableExtra<JudoResult>(JUDO_RESULT)
40
+ transactionPromise?.resolve(getMappedResult(result))
41
+ }
42
+ }
43
+ } catch (throwable: Throwable) {
44
+ transactionPromise?.reject(JUDO_PROMISE_REJECTION_CODE, throwable.message)
45
+ }
46
+
47
+ transactionPromise = null
48
+ }
49
+ }