@primer-io/react-native 0.15.8 → 2.0.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 (203) hide show
  1. package/README.md +114 -24
  2. package/android/build.gradle +7 -2
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +118 -148
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +212 -127
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +12 -0
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +54 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -7
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +13 -0
  10. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +4 -4
  11. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +8 -0
  12. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +43 -125
  13. package/android/src/main/java/com/primerioreactnative/extensions/Payment.kt +6 -0
  14. package/android/src/main/java/com/primerioreactnative/extensions/PrimerAddress.kt +15 -0
  15. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +7 -0
  16. package/android/src/main/java/com/primerioreactnative/extensions/PrimerClientSession.kt +15 -0
  17. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCustomer.kt +13 -0
  18. package/android/src/main/java/com/primerioreactnative/extensions/PrimerLineItem.kt +8 -0
  19. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +6 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodData.kt +7 -0
  21. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -3
  22. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +45 -0
  23. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +16 -6
  24. package/ios/DataModels/ImplementedRNCallbacks.swift +31 -0
  25. package/ios/DataModels/PrimerErrorRN.swift +0 -17
  26. package/ios/DataModels/PrimerSettingsRN.swift +70 -147
  27. package/ios/DataModels/PrimerThemeRN.swift +1 -10
  28. package/ios/{Pods/Manifest.lock → Podfile.lock} +1 -1
  29. package/ios/RNTPrimer.m +26 -12
  30. package/ios/RNTPrimer.swift +295 -249
  31. package/ios/ReactNative.xcodeproj/project.pbxproj +14 -14
  32. package/lib/commonjs/Primer.js +201 -150
  33. package/lib/commonjs/Primer.js.map +1 -1
  34. package/lib/commonjs/RNPrimer.js +102 -41
  35. package/lib/commonjs/RNPrimer.js.map +1 -1
  36. package/lib/commonjs/index.js +117 -4
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/models/Primer.js +6 -0
  39. package/lib/commonjs/models/{action-request.js.map → Primer.js.map} +0 -0
  40. package/lib/commonjs/models/PrimerCheckoutData.js +9 -0
  41. package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -0
  42. package/lib/commonjs/models/PrimerCheckoutPaymentMethodData.js +2 -0
  43. package/lib/commonjs/models/{client-session-actions-request.js.map → PrimerCheckoutPaymentMethodData.js.map} +0 -0
  44. package/lib/commonjs/models/PrimerClientSession.js +2 -0
  45. package/lib/commonjs/models/{primer-callbacks.js.map → PrimerClientSession.js.map} +0 -0
  46. package/lib/commonjs/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  47. package/lib/commonjs/models/PrimerCountryCode.js.map +1 -0
  48. package/lib/commonjs/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  49. package/lib/commonjs/models/PrimerCurrencyCode.js.map +1 -0
  50. package/lib/commonjs/models/PrimerError.js +28 -0
  51. package/lib/commonjs/models/PrimerError.js.map +1 -0
  52. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js +14 -0
  53. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js.map +1 -0
  54. package/lib/commonjs/models/PrimerSessionIntent.js +14 -0
  55. package/lib/commonjs/models/PrimerSessionIntent.js.map +1 -0
  56. package/lib/commonjs/models/PrimerSettings.js +6 -0
  57. package/lib/commonjs/models/{primer-config.js.map → PrimerSettings.js.map} +0 -0
  58. package/lib/commonjs/models/PrimerTheme.js +2 -0
  59. package/lib/commonjs/models/{primer-request.js.map → PrimerTheme.js.map} +0 -0
  60. package/lib/commonjs/utils/index.js +1 -1
  61. package/lib/commonjs/utils/index.js.map +1 -1
  62. package/lib/module/Primer.js +201 -137
  63. package/lib/module/Primer.js.map +1 -1
  64. package/lib/module/RNPrimer.js +102 -41
  65. package/lib/module/RNPrimer.js.map +1 -1
  66. package/lib/module/index.js +9 -4
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/models/Primer.js +2 -0
  69. package/lib/{commonjs/models/primer-settings.js.map → module/models/Primer.js.map} +0 -0
  70. package/lib/module/models/PrimerCheckoutData.js +7 -0
  71. package/lib/module/models/PrimerCheckoutData.js.map +1 -0
  72. package/lib/module/models/PrimerCheckoutPaymentMethodData.js +2 -0
  73. package/lib/{commonjs/models/primer-theme.js.map → module/models/PrimerCheckoutPaymentMethodData.js.map} +0 -0
  74. package/lib/module/models/PrimerClientSession.js +2 -0
  75. package/lib/{commonjs/models/primer.js.map → module/models/PrimerClientSession.js.map} +0 -0
  76. package/lib/module/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  77. package/lib/module/models/PrimerCountryCode.js.map +1 -0
  78. package/lib/module/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  79. package/lib/module/models/PrimerCurrencyCode.js.map +1 -0
  80. package/lib/module/models/PrimerError.js +19 -0
  81. package/lib/module/models/PrimerError.js.map +1 -0
  82. package/lib/module/models/PrimerPaymentMethodTokenData.js +7 -0
  83. package/lib/module/models/PrimerPaymentMethodTokenData.js.map +1 -0
  84. package/lib/module/models/PrimerSessionIntent.js +7 -0
  85. package/lib/module/models/PrimerSessionIntent.js.map +1 -0
  86. package/lib/module/models/PrimerSettings.js +2 -0
  87. package/lib/module/models/{action-request.js.map → PrimerSettings.js.map} +0 -0
  88. package/lib/module/models/PrimerTheme.js +2 -0
  89. package/lib/module/models/{client-session-actions-request.js.map → PrimerTheme.js.map} +0 -0
  90. package/lib/module/utils/index.js.map +1 -1
  91. package/lib/typescript/Primer.d.ts +2 -15
  92. package/lib/typescript/RNPrimer.d.ts +16 -9
  93. package/lib/typescript/index.d.ts +9 -3
  94. package/lib/typescript/models/Primer.d.ts +26 -0
  95. package/lib/typescript/models/PrimerCheckoutData.d.ts +15 -0
  96. package/lib/typescript/models/PrimerCheckoutPaymentMethodData.d.ts +5 -0
  97. package/lib/typescript/models/PrimerClientSession.d.ts +45 -0
  98. package/lib/typescript/models/{utils/countryCode.d.ts → PrimerCountryCode.d.ts} +1 -1
  99. package/lib/typescript/models/{utils/currencyCode.d.ts → PrimerCurrencyCode.d.ts} +1 -1
  100. package/lib/typescript/models/PrimerError.d.ts +11 -0
  101. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts +116 -0
  102. package/lib/typescript/models/PrimerSessionIntent.d.ts +4 -0
  103. package/lib/typescript/models/PrimerSettings.d.ts +73 -0
  104. package/lib/typescript/models/{primer-theme.d.ts → PrimerTheme.d.ts} +1 -1
  105. package/lib/typescript/utils/index.d.ts +1 -1
  106. package/package.json +1 -1
  107. package/primer-io-react-native.podspec +1 -1
  108. package/src/Primer.ts +228 -172
  109. package/src/RNPrimer.ts +135 -51
  110. package/src/index.tsx +33 -6
  111. package/src/models/Primer.ts +35 -0
  112. package/src/models/PrimerCheckoutData.ts +18 -0
  113. package/src/models/PrimerCheckoutPaymentMethodData.ts +5 -0
  114. package/src/models/PrimerClientSession.ts +53 -0
  115. package/src/models/{utils/countryCode.ts → PrimerCountryCode.ts} +1 -1
  116. package/src/models/{utils/currencyCode.ts → PrimerCurrencyCode.ts} +1 -1
  117. package/src/models/PrimerError.ts +20 -0
  118. package/src/models/PrimerPaymentMethodTokenData.ts +130 -0
  119. package/src/models/PrimerSessionIntent.ts +4 -0
  120. package/src/models/PrimerSettings.ts +93 -0
  121. package/src/models/{primer-theme.ts → PrimerTheme.ts} +1 -1
  122. package/src/utils/index.ts +1 -1
  123. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +0 -11
  124. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIntentRN.kt +0 -80
  125. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerOnClientSessionActionsRequestRN.kt +0 -65
  126. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerRequestRN.kt +0 -9
  127. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerThemeRN.kt +0 -51
  128. package/android/src/main/java/com/primerioreactnative/utils/PrimerEventQueueRN.kt +0 -30
  129. package/ios/DataModels/PrimerIntentRN.swift +0 -10
  130. package/ios/DataModels/PrimerRequestRN.swift +0 -14
  131. package/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -344
  132. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/Pods-ReactNative.xcscheme +0 -60
  133. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/xcschememanagement.plist +0 -16
  134. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.markdown +0 -3
  135. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.plist +0 -29
  136. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-dummy.m +0 -5
  137. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.debug.xcconfig +0 -8
  138. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.release.xcconfig +0 -8
  139. package/ios/ReactNative.xcworkspace/xcuserdata/aladintaleb.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  140. package/lib/commonjs/models/action-request.js +0 -2
  141. package/lib/commonjs/models/client-session-actions-request.js +0 -2
  142. package/lib/commonjs/models/payment-instrument-token.js +0 -30
  143. package/lib/commonjs/models/payment-instrument-token.js.map +0 -1
  144. package/lib/commonjs/models/primer-callbacks.js +0 -2
  145. package/lib/commonjs/models/primer-config.js +0 -2
  146. package/lib/commonjs/models/primer-error.js +0 -4
  147. package/lib/commonjs/models/primer-error.js.map +0 -1
  148. package/lib/commonjs/models/primer-intent.js +0 -4
  149. package/lib/commonjs/models/primer-intent.js.map +0 -1
  150. package/lib/commonjs/models/primer-request.js +0 -2
  151. package/lib/commonjs/models/primer-settings.js +0 -2
  152. package/lib/commonjs/models/primer-theme.js +0 -2
  153. package/lib/commonjs/models/primer.js +0 -2
  154. package/lib/commonjs/models/utils/countryCode.js.map +0 -1
  155. package/lib/commonjs/models/utils/currencyCode.js.map +0 -1
  156. package/lib/commonjs/models/utils/redirectScheme.js +0 -4
  157. package/lib/commonjs/models/utils/redirectScheme.js.map +0 -1
  158. package/lib/module/models/action-request.js +0 -2
  159. package/lib/module/models/client-session-actions-request.js +0 -2
  160. package/lib/module/models/payment-instrument-token.js +0 -28
  161. package/lib/module/models/payment-instrument-token.js.map +0 -1
  162. package/lib/module/models/primer-callbacks.js +0 -2
  163. package/lib/module/models/primer-callbacks.js.map +0 -1
  164. package/lib/module/models/primer-config.js +0 -2
  165. package/lib/module/models/primer-config.js.map +0 -1
  166. package/lib/module/models/primer-error.js +0 -2
  167. package/lib/module/models/primer-error.js.map +0 -1
  168. package/lib/module/models/primer-intent.js +0 -2
  169. package/lib/module/models/primer-intent.js.map +0 -1
  170. package/lib/module/models/primer-request.js +0 -2
  171. package/lib/module/models/primer-request.js.map +0 -1
  172. package/lib/module/models/primer-settings.js +0 -2
  173. package/lib/module/models/primer-settings.js.map +0 -1
  174. package/lib/module/models/primer-theme.js +0 -2
  175. package/lib/module/models/primer-theme.js.map +0 -1
  176. package/lib/module/models/primer.js +0 -2
  177. package/lib/module/models/primer.js.map +0 -1
  178. package/lib/module/models/utils/countryCode.js.map +0 -1
  179. package/lib/module/models/utils/currencyCode.js.map +0 -1
  180. package/lib/module/models/utils/redirectScheme.js +0 -2
  181. package/lib/module/models/utils/redirectScheme.js.map +0 -1
  182. package/lib/typescript/models/action-request.d.ts +0 -10
  183. package/lib/typescript/models/client-session-actions-request.d.ts +0 -15
  184. package/lib/typescript/models/payment-instrument-token.d.ts +0 -76
  185. package/lib/typescript/models/primer-callbacks.d.ts +0 -10
  186. package/lib/typescript/models/primer-config.d.ts +0 -44
  187. package/lib/typescript/models/primer-error.d.ts +0 -8
  188. package/lib/typescript/models/primer-intent.d.ts +0 -13
  189. package/lib/typescript/models/primer-request.d.ts +0 -7
  190. package/lib/typescript/models/primer-settings.d.ts +0 -65
  191. package/lib/typescript/models/primer.d.ts +0 -33
  192. package/lib/typescript/models/utils/redirectScheme.d.ts +0 -3
  193. package/src/models/action-request.ts +0 -12
  194. package/src/models/client-session-actions-request.ts +0 -21
  195. package/src/models/payment-instrument-token.ts +0 -109
  196. package/src/models/primer-callbacks.ts +0 -14
  197. package/src/models/primer-config.ts +0 -55
  198. package/src/models/primer-error.ts +0 -19
  199. package/src/models/primer-intent.ts +0 -49
  200. package/src/models/primer-request.ts +0 -7
  201. package/src/models/primer-settings.ts +0 -73
  202. package/src/models/primer.ts +0 -41
  203. package/src/models/utils/redirectScheme.ts +0 -5
@@ -1,145 +1,63 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
- import io.primer.android.model.PrimerDebugOptions
4
- import io.primer.android.model.dto.*
3
+ import io.primer.android.data.settings.*
4
+ import io.primer.android.ui.settings.PrimerUIOptions
5
+ import kotlinx.serialization.SerialName
5
6
  import kotlinx.serialization.Serializable
7
+ import java.util.*
6
8
 
7
9
  @Serializable
8
- class PrimerSettingsRN(
9
- val order: OrderRN? = null,
10
- val business: BusinessRN? = null,
11
- private val customer: CustomerRN? = null,
12
- private val options: OptionsRN? = null,
13
- ) {
14
- fun format(): PrimerSettings {
15
- val order = order?.format() ?: Order()
16
- val customer = customer?.format() ?: Customer()
17
- val business = business?.format() ?: Business()
18
- val options = options?.format() ?: Options()
19
- return PrimerSettings(order, customer, business, options)
20
- }
21
- }
10
+ data class PrimerSettingsRN(
11
+ var paymentHandling: PrimerPaymentHandling = PrimerPaymentHandling.AUTO,
12
+ var localeData: LocaleSettingsRN = LocaleSettingsRN(),
13
+ var paymentMethodOptions: PrimerPaymentMethodOptionsRN = PrimerPaymentMethodOptionsRN(),
14
+ var uiOptions: PrimerUIOptions = PrimerUIOptions(),
15
+ var debugOptions: PrimerDebugOptions = PrimerDebugOptions(),
16
+ )
22
17
 
23
18
  @Serializable
24
- data class OrderRN(
25
- val amount: Int? = null,
26
- val currency: String? = null,
27
- val countryCode: String? = null,
28
- val items: List<OrderItemRN>? = null,
29
- val shipping: PrimerAddressRN? = null,
30
- ) {
31
- fun format(): Order {
32
- return Order(
33
- amount = amount,
34
- currency = currency,
35
- countryCode = countryCode?.let { CountryCode.valueOf(it) },
19
+ data class LocaleSettingsRN(
20
+ val languageCode: String? = null,
21
+ val localeCode: String? = null
22
+ )
36
23
 
37
- )
24
+ fun LocaleSettingsRN.toLocale(): Locale {
25
+ return when {
26
+ languageCode == null -> Locale.getDefault()
27
+ localeCode == null -> Locale(languageCode)
28
+ else -> Locale(languageCode, localeCode)
38
29
  }
39
30
  }
40
31
 
41
32
  @Serializable
42
- data class OrderItemRN(
43
- val name: String,
44
- val unitAmount: Int?,
45
- val quantity: Int,
46
- val isPending: Boolean?,
33
+ data class PrimerPaymentMethodOptionsRN(
34
+ @SerialName("android")
35
+ val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
36
+ var cardPaymentOptions: PrimerCardPaymentOptions = PrimerCardPaymentOptions(),
37
+ var googlePayOptions: PrimerGooglePayOptions = PrimerGooglePayOptions(),
38
+ var klarnaOptions: PrimerKlarnaOptions = PrimerKlarnaOptions(),
39
+ var apayaOptions: PrimerApayaOptions = PrimerApayaOptions(),
40
+ var goCardlessOptions: PrimerGoCardlessOptions = PrimerGoCardlessOptions()
47
41
  )
48
42
 
49
- @Serializable
50
- data class BusinessRN(
51
- val name: String? = null,
52
- val registrationNumber: String? = null,
53
- val email: String? = null,
54
- val phone: String? = null,
55
- val address: PrimerAddressRN? = null,
56
- ) {
57
-
58
- fun format(): Business {
59
- return Business(
60
- name = name,
61
- registrationNumber = registrationNumber,
62
- email = email,
63
- phone = phone,
64
- address = address?.format(),
65
- )
66
- }
67
- }
68
-
69
- @Serializable
70
- data class CustomerRN(
71
- val id: String? = null,
72
- val firstName: String? = null,
73
- val lastName: String? = null,
74
- val email: String? = null,
75
- val phone: String? = null,
76
- val billing: PrimerAddressRN? = null,
77
- ) {
78
- fun format(): Customer {
79
- return Customer(
80
- id = id,
81
- firstName = firstName,
82
- lastName = lastName,
83
- email = email,
84
- homePhone = phone,
85
- billingAddress = billing?.format(),
86
- )
87
- }
88
- }
43
+ fun PrimerPaymentMethodOptionsRN.toPrimerPaymentMethodOptions() = PrimerPaymentMethodOptions(
44
+ androidSettingsRN.redirectScheme,
45
+ cardPaymentOptions,
46
+ googlePayOptions,
47
+ klarnaOptions,
48
+ apayaOptions,
49
+ goCardlessOptions
50
+ )
89
51
 
90
52
  @Serializable
91
- data class OptionsRN(
92
- val isResultScreenEnabled: Boolean? = null,
93
- val isLoadingScreenEnabled: Boolean? = null,
94
- val isFullScreenEnabled: Boolean? = null,
95
- val is3DSOnVaultingEnabled: Boolean? = null,
96
- val locale: String? = null,
97
- val android: AndroidOptionsRN? = null,
98
- val is3DSDevelopmentModeEnabled: Boolean = true
99
- ) {
100
- fun format(): Options {
101
- return Options(
102
- showUI = isLoadingScreenEnabled ?: true,
103
- redirectScheme = android?.redirectScheme,
104
- is3DSOnVaultingEnabled = is3DSOnVaultingEnabled ?: false,
105
- debugOptions = PrimerDebugOptions(
106
- is3DSSanityCheckEnabled = !is3DSDevelopmentModeEnabled, // false on emulator
107
- ),
108
- )
109
- }
110
- }
53
+ data class AndroidSettingsRN(val redirectScheme: String? = null)
111
54
 
112
- @Serializable
113
- data class AndroidOptionsRN(
114
- val redirectScheme: String? = null,
55
+ fun PrimerSettingsRN.toPrimerSettings() = PrimerSettings(
56
+ paymentHandling,
57
+ localeData.toLocale(),
58
+ paymentMethodOptions.toPrimerPaymentMethodOptions(),
59
+ uiOptions,
60
+ debugOptions
115
61
  )
116
62
 
117
- @Serializable
118
- data class PrimerAddressRN(
119
- val line1: String?,
120
- val line2: String? = null,
121
- val postalCode: String?,
122
- val state: String? = null,
123
- val city: String?,
124
- val country: String?,
125
- ) {
126
-
127
- fun format(): Address? {
128
- if (
129
- line1 == null ||
130
- postalCode == null ||
131
- city == null ||
132
- country == null
133
- ) {
134
- return null
135
- }
136
63
 
137
- return Address(
138
- line1 = line1,
139
- line2 = line2,
140
- city = city,
141
- countryCode = CountryCode.valueOf(country),
142
- postalCode = postalCode,
143
- )
144
- }
145
- }
@@ -0,0 +1,6 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerPaymentRN
4
+ import io.primer.android.domain.payments.create.model.Payment
5
+
6
+ internal fun Payment.toPrimerPaymentRN() = PrimerPaymentRN(id, orderId)
@@ -0,0 +1,15 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerAddressRN
4
+ import io.primer.android.domain.action.models.PrimerAddress
5
+
6
+ internal fun PrimerAddress.toPrimerAddressRN() = PrimerAddressRN(
7
+ firstName,
8
+ lastName,
9
+ addressLine1,
10
+ addressLine2,
11
+ postalCode,
12
+ city,
13
+ state,
14
+ countryCode
15
+ )
@@ -0,0 +1,7 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerCheckoutDataRN
4
+ import io.primer.android.domain.PrimerCheckoutData
5
+
6
+ internal fun PrimerCheckoutData.toPrimerCheckoutDataRN() =
7
+ PrimerCheckoutDataRN(payment.toPrimerPaymentRN())
@@ -0,0 +1,15 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerClientSessionRN
4
+ import io.primer.android.domain.action.models.PrimerClientSession
5
+
6
+ internal fun PrimerClientSession.toPrimerClientSessionRN() =
7
+ PrimerClientSessionRN(
8
+ customerId,
9
+ orderId,
10
+ currencyCode,
11
+ totalAmount,
12
+ lineItems?.map { it.toPrimerLineItemRN() },
13
+ orderDetails?.toPrimerOrderRN(),
14
+ customer?.toPrimerCustomerRN()
15
+ )
@@ -0,0 +1,13 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerCustomerRN
4
+ import io.primer.android.domain.action.models.PrimerCustomer
5
+
6
+ internal fun PrimerCustomer.toPrimerCustomerRN() = PrimerCustomerRN(
7
+ emailAddress,
8
+ mobileNumber,
9
+ firstName,
10
+ lastName,
11
+ billingAddress?.toPrimerAddressRN(),
12
+ shippingAddress?.toPrimerAddressRN()
13
+ )
@@ -0,0 +1,8 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerLineItemRN
4
+ import io.primer.android.domain.action.models.PrimerLineItem
5
+
6
+ internal fun PrimerLineItem.toPrimerLineItemRN() = PrimerLineItemRN(
7
+ itemId, itemDescription, amount, discountAmount, quantity, taxCode, taxAmount
8
+ )
@@ -0,0 +1,6 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerOrderRN
4
+ import io.primer.android.domain.action.models.PrimerOrder
5
+
6
+ internal fun PrimerOrder.toPrimerOrderRN() = PrimerOrderRN(countryCode)
@@ -0,0 +1,7 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerPaymentMethodDataRN
4
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
5
+
6
+ internal fun PrimerPaymentMethodData.toPrimerPaymentMethodDataRN() =
7
+ PrimerPaymentMethodDataRN(paymentMethodType)
@@ -4,8 +4,6 @@ import com.primerioreactnative.datamodels.ErrorTypeRN
4
4
  import com.primerioreactnative.datamodels.PrimerErrorRN
5
5
 
6
6
  infix fun ErrorTypeRN.errorTo(message: String) = PrimerErrorRN(
7
- ErrorTypeRN.CheckoutFlowFailed.name,
7
+ errorId,
8
8
  message
9
9
  )
10
-
11
- fun PrimerErrorRN.asError() = Error("${this.errorId}: ${this.errorDescription}")
@@ -0,0 +1,45 @@
1
+ package com.primerioreactnative.utils
2
+
3
+ import com.facebook.react.bridge.*
4
+ import org.json.JSONArray
5
+
6
+ import org.json.JSONException
7
+
8
+ import org.json.JSONObject
9
+
10
+ @Throws(JSONException::class)
11
+ internal fun convertJsonToMap(jsonObject: JSONObject): WritableMap {
12
+ val map = Arguments.createMap()
13
+ val iterator = jsonObject.keys()
14
+ while (iterator.hasNext()) {
15
+ val key = iterator.next()
16
+ when (val value = jsonObject[key]) {
17
+ is JSONObject -> map.putMap(key, convertJsonToMap(value))
18
+ is JSONArray -> map.putArray(key, convertJsonToArray(value))
19
+ is Boolean -> map.putBoolean(key, value)
20
+ is Int -> map.putInt(key, value)
21
+ is Double -> map.putDouble(key, value)
22
+ is String -> map.putString(key, value)
23
+ else -> map.putString(key, value.toString())
24
+ }
25
+ }
26
+ return map
27
+ }
28
+
29
+ @Throws(JSONException::class)
30
+ private fun convertJsonToArray(jsonArray: JSONArray): WritableArray {
31
+ val array: WritableArray = Arguments.createArray()
32
+ for (i in 0 until jsonArray.length()) {
33
+ when (val value = jsonArray[i]) {
34
+ is JSONObject -> array.pushMap(convertJsonToMap(value))
35
+ is JSONArray -> array.pushArray(convertJsonToArray(value))
36
+ is Boolean -> array.pushBoolean(value)
37
+ is Int -> array.pushInt(value)
38
+ is Double -> array.pushDouble(value)
39
+ is String -> array.pushString(value)
40
+ else -> array.pushString(value.toString())
41
+
42
+ }
43
+ }
44
+ return array
45
+ }
@@ -1,14 +1,24 @@
1
1
  package com.primerioreactnative.utils
2
2
 
3
+ import kotlinx.serialization.SerialName
3
4
  import kotlinx.serialization.Serializable
4
5
 
5
6
  @Serializable
6
7
  data class PrimerImplementedRNCallbacks(
7
- val isClientTokenCallbackImplemented: Boolean? = null,
8
- val isTokenAddedToVaultImplemented: Boolean? = null,
8
+ @SerialName("onCheckoutComplete")
9
+ val isOnCheckoutCompleteImplemented: Boolean? = null,
10
+ @SerialName("onBeforeClientSessionUpdate")
11
+ val isOnBeforeClientSessionUpdateImplemented: Boolean? = null,
12
+ @SerialName("onClientSessionUpdate")
13
+ val isOnClientSessionUpdateImplemented: Boolean? = null,
14
+ @SerialName("onBeforePaymentCreate")
15
+ val isOnBeforePaymentCreateImplemented: Boolean? = null,
16
+ @SerialName("onError")
17
+ val isOnErrorImplemented: Boolean? = null,
18
+ @SerialName("onDismiss")
19
+ val isOnDismissImplemented: Boolean? = null,
20
+ @SerialName("onTokenizeSuccess")
21
+ val isOnTokenizeSuccessImplemented: Boolean? = null,
22
+ @SerialName("onResumeSuccess")
9
23
  val isOnResumeSuccessImplemented: Boolean? = null,
10
- val isOnResumeErrorImplemented: Boolean? = null,
11
- val isOnCheckoutDismissedImplemented: Boolean? = null,
12
- val isCheckoutFailedImplemented: Boolean? = null,
13
- val isClientSessionActionsImplemented: Boolean? = null
14
24
  )
@@ -0,0 +1,31 @@
1
+ //
2
+ // ImplementedRNCallbacks.swift
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 20/5/22.
6
+ //
7
+
8
+ import Foundation
9
+
10
+ internal struct ImplementedRNCallbacks: Codable {
11
+
12
+ public var isOnCheckoutCompleteImplemented: Bool = false
13
+ public var isOnBeforeClientSessionUpdateImplemented: Bool = false
14
+ public var isOnClientSessionUpdateImplemented: Bool = false
15
+ public var isOnBeforePaymentCreateImplemented: Bool = false
16
+ public var isOnErrorImplemented: Bool = false
17
+ public var isOnDismissImplemented: Bool = false
18
+ public var isOnTokenizeSuccessImplemented: Bool = false
19
+ public var isOnResumeSuccessImplemented: Bool = false
20
+
21
+ enum CodingKeys: String, CodingKey {
22
+ case isOnCheckoutCompleteImplemented = "onCheckoutComplete"
23
+ case isOnBeforeClientSessionUpdateImplemented = "onBeforeClientSessionUpdate"
24
+ case isOnClientSessionUpdateImplemented = "onClientSessionUpdate"
25
+ case isOnBeforePaymentCreateImplemented = "onBeforePaymentCreate"
26
+ case isOnErrorImplemented = "onError"
27
+ case isOnDismissImplemented = "onDismiss"
28
+ case isOnTokenizeSuccessImplemented = "onTokenizeSuccess"
29
+ case isOnResumeSuccessImplemented = "onResumeSuccess"
30
+ }
31
+ }
@@ -1,20 +1,3 @@
1
- struct PrimerErrorRN: Encodable {
2
- let exceptionType: ErrorTypeRN
3
- let description: String?
4
- }
5
-
6
- enum ErrorTypeRN: String, Error, Encodable {
7
- case ParseJsonFailed
8
- case noIosViewController
9
- case invalidPrimerIntent
10
- case themeParsingFailed
11
- case settingsParsingFailed
12
- case settingsNotConfigured
13
- case clientTokenNotConfigured
14
- case flowParsingFailed
15
- case generic
16
- }
17
-
18
1
  struct NativeError: CustomNSError, LocalizedError, Codable {
19
2
  let errorId: String
20
3
  let errorDescription: String?
@@ -1,164 +1,87 @@
1
1
  import PrimerSDK
2
2
 
3
- struct PrimerSettingsRN: Decodable {
4
- fileprivate let order: OrderRN?
5
- fileprivate let business: BusinessRN?
6
- fileprivate let customer: CustomerRN?
7
- fileprivate let options: OptionsRN?
8
- }
3
+ extension PrimerSettings {
9
4
 
10
- extension PrimerSettingsRN {
11
- func asPrimerSettings() -> PrimerSettings {
12
- var address: Address?
13
- if let billingAddress = customer?.billing {
14
- address = Address(
15
- addressLine1: billingAddress.line1,
16
- addressLine2: billingAddress.line2,
17
- city: billingAddress.city,
18
- state: billingAddress.state,
19
- countryCode: billingAddress.country?.rawValue,
20
- postalCode: billingAddress.postalCode
21
- )
5
+ static func initialize(with settingsStr: String?) throws -> PrimerSettings {
6
+ guard let settingsStr = settingsStr,
7
+ let settingsData = settingsStr.data(using: .utf8)
8
+ else {
9
+ return PrimerSettings()
22
10
  }
23
-
24
- let debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: !(options?.is3DSDevelopmentModeEnabled ?? false))
25
-
26
- return PrimerSettings(
27
- merchantIdentifier: options?.ios?.merchantIdentifier,
28
- customerId: customer?.id,
29
- amount: order?.amount,
30
- currency: order?.currency,
31
- countryCode: order?.countryCode,
32
- klarnaSessionType: .recurringPayment, // need to update
33
- urlScheme: options?.ios?.urlScheme,
34
- urlSchemeIdentifier: options?.ios?.urlSchemeIdentifier,
35
- isFullScreenOnly: options?.isFullScreenEnabled ?? false,
36
- hasDisabledSuccessScreen: !(options?.isResultScreenEnabled ?? true),
37
- businessDetails: business?.primerFormat,
38
- orderItems: order?.itemsFormatted ?? [],
39
- isInitialLoadingHidden: !(options?.isLoadingScreenEnabled ?? true),
40
- is3DSOnVaultingEnabled: options?.is3DSOnVaultingEnabled ?? false,
41
- orderId: order?.id,
42
- debugOptions: debugOptions,
43
- customer: Customer(
44
- firstName: customer?.firstName,
45
- lastName: customer?.lastName,
46
- emailAddress: customer?.email,
47
- homePhoneNumber: nil,
48
- mobilePhoneNumber: customer?.phone,
49
- workPhoneNumber: nil,
50
- billingAddress: address
51
- )
52
- )
53
- }
54
- }
55
11
 
56
- fileprivate struct OrderRN: Decodable {
57
- let id: String?
58
- let amount: Int?
59
- let currency: Currency?
60
- // FIXME: Move countryCode only within Address (RN & Android)
61
- let countryCode: CountryCode?
62
- let items: [OrderItemRN]?
63
- let shipping: AddressRN?
64
- }
12
+ guard let settingsJson = (try JSONSerialization.jsonObject(with: settingsData)) as? [String: Any]
13
+ else {
14
+ return PrimerSettings()
15
+ }
65
16
 
66
- fileprivate extension OrderRN {
67
- var itemsFormatted: [OrderItem]? {
68
- return items?.compactMap { try? $0.primerFormat() }
69
- }
70
- }
17
+ var paymentHandling: PrimerPaymentHandling = .auto
18
+ if let rnPaymentHandling = settingsJson["paymentHandling"] as? String,
19
+ rnPaymentHandling == "MANUAL" {
20
+ paymentHandling = .manual
21
+ }
71
22
 
72
- //extension Array where Element == OrderItemRN {
73
- // var primerFormat: [OrderItem] {
74
- // return self.map { $0.primerFormat }
75
- // }
76
- //}
77
-
78
- fileprivate struct OrderItemRN: Decodable {
79
- let name: String
80
- let unitAmount: Int?
81
- let quantity: Int
82
- let isPending: Bool?
83
- }
23
+ let rnLocaleDataLanguageCode = (settingsJson["localeData"] as? [String: Any])?["languageCode"] as? String
24
+ let rnLocaleDataLocaleCode = (settingsJson["localeData"] as? [String: Any])?["localeCode"] as? String
25
+ let localeData = PrimerLocaleData(
26
+ languageCode: rnLocaleDataLanguageCode,
27
+ regionCode: rnLocaleDataLocaleCode)
84
28
 
85
- fileprivate extension OrderItemRN {
86
- func primerFormat() throws -> OrderItem {
87
- return try OrderItem(
88
- name: name,
89
- unitAmount: unitAmount,
90
- quantity: quantity,
91
- isPending: isPending ?? false
92
- )
93
- }
94
- }
29
+ let rnUrlScheme = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["iOS"] as? [String: Any])?["urlScheme"] as? String
95
30
 
96
- fileprivate struct BusinessRN: Decodable {
97
- let name: String
98
- let registrationNumber: String?
99
- let email: String?
100
- let phone: String?
101
- let address: AddressRN?
102
- }
31
+ var applePayOptions: PrimerApplePayOptions?
32
+ if let rnApplePayOptions = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["applePayOptions"] as? [String: Any]),
33
+ let rnApplePayMerchantIdentifier = rnApplePayOptions["merchantIdentifier"] as? String,
34
+ let rnApplePayMerchantName = rnApplePayOptions["merchantName"] as? String {
35
+ applePayOptions = PrimerApplePayOptions(merchantIdentifier: rnApplePayMerchantIdentifier, merchantName: rnApplePayMerchantName)
36
+ }
103
37
 
104
- fileprivate extension BusinessRN {
105
- var primerFormat: BusinessDetails? {
106
- return BusinessDetails(
107
- name: name,
108
- address: address?.primerFormat
109
- )
110
- }
111
- }
38
+ var klarnaOptions: PrimerKlarnaOptions?
39
+ if let rnKlarnaRecurringPaymentDescription = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["klarnaOptions"] as? [String: Any])?["recurringPaymentDescription"] as? String {
40
+ klarnaOptions = PrimerKlarnaOptions(recurringPaymentDescription: rnKlarnaRecurringPaymentDescription)
41
+ }
112
42
 
113
- fileprivate struct CustomerRN: Decodable {
114
- let id: String?
115
- let firstName: String?
116
- let lastName: String?
117
- let email: String?
118
- let phone: String?
119
- let billing: AddressRN?
120
- }
43
+ var cardPaymentOptions: PrimerCardPaymentOptions?
44
+ if let rnIs3DSOnVaultingEnabled = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["cardPaymentOptions"] as? [String: Any])?["is3DSOnVaultingEnabled"] as? Bool {
45
+ cardPaymentOptions = PrimerCardPaymentOptions(is3DSOnVaultingEnabled: rnIs3DSOnVaultingEnabled)
46
+ }
121
47
 
122
- fileprivate struct AddressRN: Decodable {
123
- let line1: String?
124
- let line2: String?
125
- let postalCode: String?
126
- let city: String?
127
- let state: String?
128
- let country: CountryCode?
129
- }
48
+ var uiOptions: PrimerUIOptions?
49
+ if let rnUIOptions = settingsJson["uiOptions"] as? [String: Any] {
130
50
 
131
- fileprivate extension AddressRN {
132
- var primerFormat: Address {
133
- return Address(
134
- addressLine1: line1,
135
- addressLine2: line2,
136
- city: city,
137
- state: state,
138
- countryCode: country?.rawValue,
139
- postalCode: postalCode
140
- )
141
- }
142
- }
51
+ var theme: PrimerTheme?
52
+ if let rnTheme = rnUIOptions["theme"] as? [String: Any] {
53
+ let rnThemeData = (try JSONSerialization.data(withJSONObject: rnTheme))
54
+ let rnTheme = try JSONDecoder().decode(PrimerThemeRN.self, from: rnThemeData)
55
+ theme = rnTheme.asPrimerTheme()
56
+ }
143
57
 
144
- fileprivate struct OptionsRN: Decodable {
145
- let isResultScreenEnabled: Bool?
146
- let isLoadingScreenEnabled: Bool?
147
- let isFullScreenEnabled: Bool?
148
- let is3DSOnVaultingEnabled: Bool?
149
- let is3DSDevelopmentModeEnabled: Bool?
150
- let locale: String?
151
- let ios: IosOptionsRN?
152
- }
58
+ uiOptions = PrimerUIOptions(
59
+ isInitScreenEnabled: rnUIOptions["isInitScreenEnabled"] as? Bool,
60
+ isSuccessScreenEnabled: rnUIOptions["isSuccessScreenEnabled"] as? Bool,
61
+ isErrorScreenEnabled: rnUIOptions["isErrorScreenEnabled"] as? Bool,
62
+ theme: theme)
63
+ }
153
64
 
154
- fileprivate extension String {
155
- var localeFormatted: Locale {
156
- return Locale(identifier: self)
157
- }
158
- }
65
+ var debugOptions: PrimerDebugOptions?
66
+ if let rnIs3DSSanityCheckEnabled = (settingsJson["debugOptions"] as? [String: Any])?["is3DSSanityCheckEnabled"] as? Bool {
67
+ debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: rnIs3DSSanityCheckEnabled)
68
+ }
69
+
70
+
71
+ let paymentMethodOptions = PrimerPaymentMethodOptions(
72
+ urlScheme: rnUrlScheme,
73
+ applePayOptions: applePayOptions,
74
+ klarnaOptions: klarnaOptions,
75
+ cardPaymentOptions: cardPaymentOptions)
159
76
 
160
- fileprivate struct IosOptionsRN: Decodable {
161
- let urlScheme: String?
162
- let urlSchemeIdentifier: String?
163
- let merchantIdentifier: String?
77
+ let settings = PrimerSettings(
78
+ paymentHandling: paymentHandling,
79
+ localeData: localeData,
80
+ paymentMethodOptions: paymentMethodOptions,
81
+ uiOptions: uiOptions,
82
+ debugOptions: debugOptions)
83
+
84
+
85
+ return settings
86
+ }
164
87
  }