@primer-io/react-native 0.16.2 → 2.1.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 (233) hide show
  1. package/README.md +114 -24
  2. package/android/build.gradle +10 -2
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +124 -150
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +212 -128
  6. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +244 -0
  7. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +275 -0
  8. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +2 -2
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +12 -0
  10. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +54 -0
  11. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +6 -9
  12. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +13 -0
  13. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +4 -4
  14. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +8 -0
  15. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +43 -125
  16. package/android/src/main/java/com/primerioreactnative/extensions/Payment.kt +6 -0
  17. package/android/src/main/java/com/primerioreactnative/extensions/PrimerAddress.kt +15 -0
  18. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +7 -0
  19. package/android/src/main/java/com/primerioreactnative/extensions/PrimerClientSession.kt +15 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCustomer.kt +13 -0
  21. package/android/src/main/java/com/primerioreactnative/extensions/PrimerLineItem.kt +8 -0
  22. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +6 -0
  23. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodData.kt +7 -0
  24. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +11 -7
  25. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -3
  26. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +45 -0
  27. package/android/src/main/java/com/primerioreactnative/utils/PrimerHeadlessUniversalCheckoutImplementedRNCallbacks.kt +31 -0
  28. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +16 -6
  29. package/ios/Core/ReactNative-Bridging-Header.h +10 -0
  30. package/ios/DataModels/ImplementedRNCallbacks.swift +56 -0
  31. package/ios/DataModels/PrimerErrorRN.swift +0 -17
  32. package/ios/DataModels/PrimerSettingsRN.swift +78 -156
  33. package/ios/DataModels/PrimerThemeRN.swift +1 -10
  34. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +33 -1
  35. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +306 -54
  36. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +5 -1
  37. package/ios/RNTPrimer.m +28 -12
  38. package/ios/RNTPrimer.swift +273 -222
  39. package/ios/ReactNative-Bridging-Header.h +4 -0
  40. package/ios/ReactNative.xcodeproj/project.pbxproj +14 -14
  41. package/lib/commonjs/Primer.js +206 -149
  42. package/lib/commonjs/Primer.js.map +1 -1
  43. package/lib/commonjs/RNPrimer.js +113 -41
  44. package/lib/commonjs/RNPrimer.js.map +1 -1
  45. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +240 -71
  46. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  47. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +197 -0
  48. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  49. package/lib/commonjs/headless_checkout/types.js +4 -0
  50. package/lib/commonjs/index.js +118 -24
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/models/PrimerCheckoutData.js +9 -0
  53. package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -0
  54. package/lib/commonjs/models/PrimerCheckoutPaymentMethodData.js +2 -0
  55. package/lib/commonjs/models/{action-request.js.map → PrimerCheckoutPaymentMethodData.js.map} +0 -0
  56. package/lib/commonjs/models/PrimerClientSession.js +2 -0
  57. package/lib/commonjs/models/{client-session-actions-request.js.map → PrimerClientSession.js.map} +0 -0
  58. package/lib/commonjs/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  59. package/lib/commonjs/models/PrimerCountryCode.js.map +1 -0
  60. package/lib/commonjs/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  61. package/lib/commonjs/models/PrimerCurrencyCode.js.map +1 -0
  62. package/lib/commonjs/models/PrimerError.js +28 -0
  63. package/lib/commonjs/models/PrimerError.js.map +1 -0
  64. package/lib/commonjs/models/{primer-settings.js → PrimerInterfaces.js} +1 -1
  65. package/lib/commonjs/models/{primer-callbacks.js.map → PrimerInterfaces.js.map} +0 -0
  66. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js +14 -0
  67. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js.map +1 -0
  68. package/lib/commonjs/models/PrimerSessionIntent.js +14 -0
  69. package/lib/commonjs/models/PrimerSessionIntent.js.map +1 -0
  70. package/lib/commonjs/models/{primer.js → PrimerSettings.js} +1 -1
  71. package/lib/commonjs/models/{primer-config.js.map → PrimerSettings.js.map} +0 -0
  72. package/lib/commonjs/models/PrimerTheme.js +2 -0
  73. package/lib/commonjs/models/{primer-request.js.map → PrimerTheme.js.map} +0 -0
  74. package/lib/commonjs/utils/index.js.map +1 -1
  75. package/lib/module/Primer.js +205 -136
  76. package/lib/module/Primer.js.map +1 -1
  77. package/lib/module/RNPrimer.js +113 -41
  78. package/lib/module/RNPrimer.js.map +1 -1
  79. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +243 -70
  80. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  81. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +188 -0
  82. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  83. package/lib/module/headless_checkout/types.js +1 -1
  84. package/lib/module/index.js +10 -5
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/models/PrimerCheckoutData.js +7 -0
  87. package/lib/module/models/PrimerCheckoutData.js.map +1 -0
  88. package/lib/module/models/PrimerCheckoutPaymentMethodData.js +2 -0
  89. package/lib/{commonjs/models/primer-settings.js.map → module/models/PrimerCheckoutPaymentMethodData.js.map} +0 -0
  90. package/lib/module/models/PrimerClientSession.js +2 -0
  91. package/lib/{commonjs/models/primer-theme.js.map → module/models/PrimerClientSession.js.map} +0 -0
  92. package/lib/module/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  93. package/lib/module/models/PrimerCountryCode.js.map +1 -0
  94. package/lib/module/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  95. package/lib/module/models/PrimerCurrencyCode.js.map +1 -0
  96. package/lib/module/models/PrimerError.js +19 -0
  97. package/lib/module/models/PrimerError.js.map +1 -0
  98. package/lib/module/models/PrimerInterfaces.js +2 -0
  99. package/lib/{commonjs/models/primer.js.map → module/models/PrimerInterfaces.js.map} +0 -0
  100. package/lib/module/models/PrimerPaymentMethodTokenData.js +7 -0
  101. package/lib/module/models/PrimerPaymentMethodTokenData.js.map +1 -0
  102. package/lib/module/models/PrimerSessionIntent.js +7 -0
  103. package/lib/module/models/PrimerSessionIntent.js.map +1 -0
  104. package/lib/module/models/PrimerSettings.js +2 -0
  105. package/lib/module/models/{action-request.js.map → PrimerSettings.js.map} +0 -0
  106. package/lib/module/models/PrimerTheme.js +2 -0
  107. package/lib/module/models/{client-session-actions-request.js.map → PrimerTheme.js.map} +0 -0
  108. package/lib/module/utils/index.js.map +1 -1
  109. package/lib/typescript/MerchantExample/App.d.ts +11 -0
  110. package/lib/typescript/src/Primer.d.ts +2 -0
  111. package/lib/typescript/{PrimerInput.d.ts → src/PrimerInput.d.ts} +0 -0
  112. package/lib/typescript/src/RNPrimer.d.ts +32 -0
  113. package/lib/typescript/{RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts → src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts} +0 -0
  114. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +11 -0
  115. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.d.ts +22 -0
  116. package/lib/typescript/src/headless_checkout/types.d.ts +22 -0
  117. package/lib/typescript/src/index.d.ts +10 -0
  118. package/lib/typescript/src/models/PrimerCheckoutData.d.ts +15 -0
  119. package/lib/typescript/src/models/PrimerCheckoutPaymentMethodData.d.ts +5 -0
  120. package/lib/typescript/src/models/PrimerClientSession.d.ts +45 -0
  121. package/lib/typescript/{models/utils/countryCode.d.ts → src/models/PrimerCountryCode.d.ts} +1 -1
  122. package/lib/typescript/{models/utils/currencyCode.d.ts → src/models/PrimerCurrencyCode.d.ts} +1 -1
  123. package/lib/typescript/src/models/PrimerError.d.ts +11 -0
  124. package/lib/typescript/src/models/PrimerInterfaces.d.ts +27 -0
  125. package/lib/typescript/src/models/PrimerPaymentMethodTokenData.d.ts +116 -0
  126. package/lib/typescript/src/models/PrimerSessionIntent.d.ts +4 -0
  127. package/lib/typescript/src/models/PrimerSettings.d.ts +77 -0
  128. package/lib/typescript/{models/primer-theme.d.ts → src/models/PrimerTheme.d.ts} +1 -1
  129. package/lib/typescript/{utils → src/utils}/index.d.ts +1 -1
  130. package/package.json +1 -1
  131. package/primer-io-react-native.podspec +1 -1
  132. package/src/Primer.ts +231 -170
  133. package/src/RNPrimer.ts +148 -51
  134. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +281 -94
  135. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.ts +252 -0
  136. package/src/headless_checkout/types.ts +26 -12
  137. package/src/index.tsx +36 -8
  138. package/src/models/PrimerCheckoutData.ts +18 -0
  139. package/src/models/PrimerCheckoutPaymentMethodData.ts +5 -0
  140. package/src/models/PrimerClientSession.ts +53 -0
  141. package/src/models/{utils/countryCode.ts → PrimerCountryCode.ts} +1 -1
  142. package/src/models/{utils/currencyCode.ts → PrimerCurrencyCode.ts} +1 -1
  143. package/src/models/PrimerError.ts +20 -0
  144. package/src/models/PrimerInterfaces.ts +36 -0
  145. package/src/models/PrimerPaymentMethodTokenData.ts +130 -0
  146. package/src/models/PrimerSessionIntent.ts +4 -0
  147. package/src/models/PrimerSettings.ts +108 -0
  148. package/src/models/{primer-theme.ts → PrimerTheme.ts} +1 -1
  149. package/src/utils/index.ts +1 -1
  150. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -198
  151. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +0 -11
  152. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIntentRN.kt +0 -80
  153. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerOnClientSessionActionsRequestRN.kt +0 -65
  154. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerRequestRN.kt +0 -9
  155. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerThemeRN.kt +0 -51
  156. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  157. package/android/src/main/java/com/primerioreactnative/utils/Keys.kt +0 -7
  158. package/android/src/main/java/com/primerioreactnative/utils/PrimerEventQueueRN.kt +0 -30
  159. package/ios/DataModels/PrimerIntentRN.swift +0 -10
  160. package/ios/DataModels/PrimerRequestRN.swift +0 -14
  161. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -110
  162. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  163. package/lib/commonjs/models/action-request.js +0 -2
  164. package/lib/commonjs/models/client-session-actions-request.js +0 -2
  165. package/lib/commonjs/models/payment-instrument-token.js +0 -30
  166. package/lib/commonjs/models/payment-instrument-token.js.map +0 -1
  167. package/lib/commonjs/models/primer-callbacks.js +0 -6
  168. package/lib/commonjs/models/primer-config.js +0 -6
  169. package/lib/commonjs/models/primer-error.js +0 -4
  170. package/lib/commonjs/models/primer-error.js.map +0 -1
  171. package/lib/commonjs/models/primer-intent.js +0 -4
  172. package/lib/commonjs/models/primer-intent.js.map +0 -1
  173. package/lib/commonjs/models/primer-request.js +0 -2
  174. package/lib/commonjs/models/primer-theme.js +0 -2
  175. package/lib/commonjs/models/utils/countryCode.js.map +0 -1
  176. package/lib/commonjs/models/utils/currencyCode.js.map +0 -1
  177. package/lib/commonjs/models/utils/redirectScheme.js +0 -4
  178. package/lib/commonjs/models/utils/redirectScheme.js.map +0 -1
  179. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -98
  180. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  181. package/lib/module/models/action-request.js +0 -2
  182. package/lib/module/models/client-session-actions-request.js +0 -2
  183. package/lib/module/models/payment-instrument-token.js +0 -28
  184. package/lib/module/models/payment-instrument-token.js.map +0 -1
  185. package/lib/module/models/primer-callbacks.js +0 -2
  186. package/lib/module/models/primer-callbacks.js.map +0 -1
  187. package/lib/module/models/primer-config.js +0 -2
  188. package/lib/module/models/primer-config.js.map +0 -1
  189. package/lib/module/models/primer-error.js +0 -2
  190. package/lib/module/models/primer-error.js.map +0 -1
  191. package/lib/module/models/primer-intent.js +0 -2
  192. package/lib/module/models/primer-intent.js.map +0 -1
  193. package/lib/module/models/primer-request.js +0 -2
  194. package/lib/module/models/primer-request.js.map +0 -1
  195. package/lib/module/models/primer-settings.js +0 -2
  196. package/lib/module/models/primer-settings.js.map +0 -1
  197. package/lib/module/models/primer-theme.js +0 -2
  198. package/lib/module/models/primer-theme.js.map +0 -1
  199. package/lib/module/models/primer.js +0 -2
  200. package/lib/module/models/primer.js.map +0 -1
  201. package/lib/module/models/utils/countryCode.js.map +0 -1
  202. package/lib/module/models/utils/currencyCode.js.map +0 -1
  203. package/lib/module/models/utils/redirectScheme.js +0 -2
  204. package/lib/module/models/utils/redirectScheme.js.map +0 -1
  205. package/lib/typescript/Primer.d.ts +0 -15
  206. package/lib/typescript/RNPrimer.d.ts +0 -24
  207. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -13
  208. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -13
  209. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  210. package/lib/typescript/index.d.ts +0 -5
  211. package/lib/typescript/models/action-request.d.ts +0 -10
  212. package/lib/typescript/models/client-session-actions-request.d.ts +0 -15
  213. package/lib/typescript/models/payment-instrument-token.d.ts +0 -76
  214. package/lib/typescript/models/primer-callbacks.d.ts +0 -10
  215. package/lib/typescript/models/primer-config.d.ts +0 -44
  216. package/lib/typescript/models/primer-error.d.ts +0 -8
  217. package/lib/typescript/models/primer-intent.d.ts +0 -13
  218. package/lib/typescript/models/primer-request.d.ts +0 -7
  219. package/lib/typescript/models/primer-settings.d.ts +0 -65
  220. package/lib/typescript/models/primer.d.ts +0 -33
  221. package/lib/typescript/models/utils/redirectScheme.d.ts +0 -3
  222. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -132
  223. package/src/models/action-request.ts +0 -12
  224. package/src/models/client-session-actions-request.ts +0 -21
  225. package/src/models/payment-instrument-token.ts +0 -109
  226. package/src/models/primer-callbacks.ts +0 -14
  227. package/src/models/primer-config.ts +0 -55
  228. package/src/models/primer-error.ts +0 -19
  229. package/src/models/primer-intent.ts +0 -49
  230. package/src/models/primer-request.ts +0 -7
  231. package/src/models/primer-settings.ts +0 -73
  232. package/src/models/primer.ts +0 -41
  233. package/src/models/utils/redirectScheme.ts +0 -5
@@ -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)
@@ -1,11 +1,15 @@
1
1
  package com.primerioreactnative.huc.events
2
2
 
3
3
  internal enum class PrimerHeadlessUniversalCheckoutEvent(val eventName: String) {
4
- CLIENT_SESSION_SETUP_SUCCESS("clientSessionDidSetUpSuccessfully"),
5
- TOKENIZATION_PREPARATION_STARTED("preparationStarted"),
6
- PAYMENT_METH0D_SHOWED("paymentMethodPresented"),
7
- TOKENIZATION_STARTED("tokenizationStarted"),
8
- TOKENIZATION_SUCCESS("tokenizationSucceeded"),
9
- RESUME("resume"),
10
- ERROR("error");
4
+ ON_HUC_AVAILABLE_PAYMENT_METHODS_LOADED("onHUCAvailablePaymentMethodsLoaded"),
5
+ ON_HUC_PREPARE_START("onHUCPrepareStart"),
6
+ ON_HUC_PAYMENT_METHOD_SHOW("onHUCPaymentMethodShow"),
7
+ ON_HUC_TOKENIZE_START("onHUCTokenizeStart"),
8
+ ON_CHECKOUT_COMPLETE("onCheckoutComplete"),
9
+ ON_BEFORE_CLIENT_SESSION_UPDATE("onBeforeClientSessionUpdate"),
10
+ ON_CLIENT_SESSION_UPDATE("onClientSessionUpdate"),
11
+ ON_BEFORE_PAYMENT_CREATE("onBeforePaymentCreate"),
12
+ ON_TOKENIZE_SUCCESS("onTokenizeSuccess"),
13
+ ON_RESUME_SUCCESS("onResumeSuccess"),
14
+ ON_ERROR("onError"),
11
15
  }
@@ -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
- 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
+ }
@@ -0,0 +1,31 @@
1
+ package com.primerioreactnative.utils
2
+
3
+ import kotlinx.serialization.SerialName
4
+ import kotlinx.serialization.Serializable
5
+
6
+ @Serializable
7
+ data class PrimerHeadlessUniversalCheckoutImplementedRNCallbacks(
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("onTokenizeSuccess")
19
+ val isOnTokenizeSuccessImplemented: Boolean? = null,
20
+ @SerialName("onResumeSuccess")
21
+ val isOnResumeSuccessImplemented: Boolean? = null,
22
+ @SerialName("onHUCTokenizeStart")
23
+ val isOnHUCTokenizeStartsImplemented: Boolean? = null,
24
+ @SerialName("onHUCPrepareStart")
25
+ val isOnHUCPrepareStartImplemented: Boolean? = null,
26
+ @SerialName("onHUCAvailablePaymentMethodsLoaded")
27
+ val isOnHUCAvailablePaymentMethodsLoadedImplemented: Boolean? = null,
28
+ @SerialName("onHUCPaymentMethodShow")
29
+ val isOnHUCPaymentMethodShowImplemented: Boolean? = null,
30
+ )
31
+
@@ -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
  )
@@ -2,3 +2,13 @@
2
2
  #import <React/RCTEventEmitter.h>
3
3
  #import <React/RCTViewManager.h>
4
4
  #import <React/RCTUIManager.h>
5
+ #import <React/RCTView.h>
6
+
7
+ // for view controller implementation https://stackoverflow.com/questions/45741903/react-native-ios-how-can-i-navigate-to-a-non-react-native-view-native-ios-vie/46007680#46007680
8
+ //#import "React/RCTBridge.h"
9
+ //#import "React/RCTEventDispatcher.h"
10
+ //#import "React/RCTRootView.h"
11
+ //#import "React/RCTUtils.h"
12
+ //#import "React/RCTConvert.h"
13
+ //#import "React/RCTBundleURLProvider.h"
14
+ //#import "RCTViewManager.h"
@@ -0,0 +1,56 @@
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: Decodable {
11
+
12
+ internal var isOnCheckoutCompleteImplemented: Bool = false
13
+ internal var isOnBeforeClientSessionUpdateImplemented: Bool = false
14
+ internal var isOnClientSessionUpdateImplemented: Bool = false
15
+ internal var isOnBeforePaymentCreateImplemented: Bool = false
16
+ internal var isOnErrorImplemented: Bool = false
17
+ internal var isOnDismissImplemented: Bool = false
18
+ internal var isOnTokenizeSuccessImplemented: Bool = false
19
+ internal var isOnResumeSuccessImplemented: Bool = false
20
+ internal var isOnHUCTokenizeStartImplemented: Bool = false
21
+ internal var isOnHUCPrepareStartImplemented: Bool = false
22
+ internal var isOnHUCAvailablePaymentMethodsLoadedImplemented: Bool = false
23
+ internal var isOnHUCPaymentMethodShowImplemented: Bool = false
24
+
25
+ enum CodingKeys: String, CodingKey {
26
+ case isOnCheckoutCompleteImplemented = "onCheckoutComplete"
27
+ case isOnBeforeClientSessionUpdateImplemented = "onBeforeClientSessionUpdate"
28
+ case isOnClientSessionUpdateImplemented = "onClientSessionUpdate"
29
+ case isOnBeforePaymentCreateImplemented = "onBeforePaymentCreate"
30
+ case isOnErrorImplemented = "onError"
31
+ case isOnDismissImplemented = "onDismiss"
32
+ case isOnTokenizeSuccessImplemented = "onTokenizeSuccess"
33
+ case isOnResumeSuccessImplemented = "onResumeSuccess"
34
+ case isOnHUCTokenizeStartImplemented = "onHUCTokenizeStart"
35
+ case isOnHUCPrepareStartImplemented = "onHUCPrepareStart"
36
+ case isOnHUCAvailablePaymentMethodsLoadedImplemented = "onHUCAvailablePaymentMethodsLoaded"
37
+ case isOnHUCPaymentMethodShowImplemented = "onHUCPaymentMethodShow"
38
+ }
39
+
40
+ init(from decoder: Decoder) throws {
41
+ let container = try decoder.container(keyedBy: CodingKeys.self)
42
+
43
+ self.isOnCheckoutCompleteImplemented = (try? container.decode(Bool?.self, forKey: .isOnCheckoutCompleteImplemented)) ?? false
44
+ self.isOnBeforeClientSessionUpdateImplemented = (try? container.decode(Bool?.self, forKey: .isOnBeforeClientSessionUpdateImplemented)) ?? false
45
+ self.isOnClientSessionUpdateImplemented = (try? container.decode(Bool?.self, forKey: .isOnClientSessionUpdateImplemented)) ?? false
46
+ self.isOnBeforePaymentCreateImplemented = (try? container.decode(Bool?.self, forKey: .isOnBeforePaymentCreateImplemented)) ?? false
47
+ self.isOnErrorImplemented = (try? container.decode(Bool?.self, forKey: .isOnErrorImplemented)) ?? false
48
+ self.isOnDismissImplemented = (try? container.decode(Bool?.self, forKey: .isOnDismissImplemented)) ?? false
49
+ self.isOnTokenizeSuccessImplemented = (try? container.decode(Bool?.self, forKey: .isOnTokenizeSuccessImplemented)) ?? false
50
+ self.isOnResumeSuccessImplemented = (try? container.decode(Bool?.self, forKey: .isOnResumeSuccessImplemented)) ?? false
51
+ self.isOnHUCTokenizeStartImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCTokenizeStartImplemented)) ?? false
52
+ self.isOnHUCPrepareStartImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCPrepareStartImplemented)) ?? false
53
+ self.isOnHUCAvailablePaymentMethodsLoadedImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCAvailablePaymentMethodsLoadedImplemented)) ?? false
54
+ self.isOnHUCPaymentMethodShowImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCPaymentMethodShowImplemented)) ?? false
55
+ }
56
+ }
@@ -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,86 @@
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
11
 
24
- let debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: !(options?.is3DSDevelopmentModeEnabled ?? false))
12
+ guard let settingsJson = (try JSONSerialization.jsonObject(with: settingsData)) as? [String: Any]
13
+ else {
14
+ return PrimerSettings()
15
+ }
25
16
 
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
-
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
- }
65
-
66
- fileprivate extension OrderRN {
67
- var itemsFormatted: [OrderItem]? {
68
- return items?.compactMap { try? $0.primerFormat() }
69
- }
70
- }
71
-
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
- }
84
-
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
- }
95
-
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
- }
103
-
104
- fileprivate extension BusinessRN {
105
- var primerFormat: BusinessDetails? {
106
- return BusinessDetails(
107
- name: name,
108
- address: address?.primerFormat
109
- )
110
- }
111
- }
112
-
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
- }
121
-
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
- }
130
-
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
- }
143
-
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
- }
153
-
154
- fileprivate extension String {
155
- var localeFormatted: Locale {
156
- return Locale(identifier: self)
17
+ var paymentHandling: PrimerPaymentHandling = .auto
18
+ if let rnPaymentHandling = settingsJson["paymentHandling"] as? String,
19
+ rnPaymentHandling == "MANUAL" {
20
+ paymentHandling = .manual
21
+ }
22
+
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)
28
+
29
+ let rnUrlScheme = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["iOS"] as? [String: Any])?["urlScheme"] as? String
30
+
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
+ }
37
+
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
+ }
42
+
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
+ }
47
+
48
+ var uiOptions: PrimerUIOptions?
49
+ if let rnUIOptions = settingsJson["uiOptions"] as? [String: Any] {
50
+
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
+ }
57
+
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
+ }
64
+
65
+ var debugOptions: PrimerDebugOptions?
66
+ if let rnIs3DSSanityCheckEnabled = (settingsJson["debugOptions"] as? [String: Any])?["is3DSSanityCheckEnabled"] as? Bool {
67
+ debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: rnIs3DSSanityCheckEnabled)
68
+ }
69
+
70
+ let paymentMethodOptions = PrimerPaymentMethodOptions(
71
+ urlScheme: rnUrlScheme,
72
+ applePayOptions: applePayOptions,
73
+ klarnaOptions: klarnaOptions,
74
+ cardPaymentOptions: cardPaymentOptions)
75
+
76
+ let settings = PrimerSettings(
77
+ paymentHandling: paymentHandling,
78
+ localeData: localeData,
79
+ paymentMethodOptions: paymentMethodOptions,
80
+ uiOptions: uiOptions,
81
+ debugOptions: debugOptions)
82
+
83
+
84
+ return settings
157
85
  }
158
86
  }
159
-
160
- fileprivate struct IosOptionsRN: Decodable {
161
- let urlScheme: String?
162
- let urlSchemeIdentifier: String?
163
- let merchantIdentifier: String?
164
- }
@@ -7,16 +7,7 @@ struct PrimerThemeRN: Decodable {
7
7
 
8
8
  extension PrimerThemeRN {
9
9
  func asPrimerTheme() -> PrimerTheme {
10
- if #available(iOS 13.0, *) {
11
- return PrimerTheme(
12
- colorTheme: colors?.primerColorTheme ?? PrimerDefaultTheme(),
13
- darkTheme: darkModeColors?.primerDarkModeTheme ?? PrimerDarkTheme()
14
- )
15
- } else {
16
- return PrimerTheme(
17
- colorTheme: colors?.primerColorTheme ?? PrimerDefaultTheme()
18
- )
19
- }
10
+ return PrimerTheme()
20
11
  }
21
12
  }
22
13
 
@@ -14,7 +14,9 @@ RCT_EXTERN_METHOD(startWithClientToken:(NSString *)clientToken settingsStr:(NSSt
14
14
 
15
15
  RCT_EXTERN_METHOD(resumeWithClientToken:(NSString *)resumeToken)
16
16
 
17
- RCT_EXTERN_METHOD(showPaymentMethod:(NSString *)paymentMethodTypeStr)
17
+ RCT_EXTERN_METHOD(showPaymentMethod:(NSString *)paymentMethodTypeStr
18
+ resolver:(RCTPromiseResolveBlock)resolver
19
+ rejecter:(RCTPromiseRejectBlock)rejecter)
18
20
 
19
21
  RCT_EXTERN_METHOD(getAssetForPaymentMethodType:(NSString *)paymentMethodTypeStr
20
22
  assetType:(NSString *)assetTypeStr
@@ -26,5 +28,35 @@ RCT_EXTERN_METHOD(getAssetForCardNetwork:(NSString *)cardNetworkStr
26
28
  errorCallback:(RCTResponseSenderBlock)errorCallback
27
29
  successCallback: (RCTResponseSenderBlock)successCallback)
28
30
 
31
+ RCT_EXTERN_METHOD(disposePrimerHeadlessUniversalCheckout)
32
+
33
+ // MARK: - HELPERS
34
+
35
+ RCT_EXTERN_METHOD(setImplementedRNCallbacks:(NSString *)implementedRNCallbacksStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
36
+
37
+ // MARK: - DECISION HANDLERS
38
+
39
+ // MARK: Tokenization Handlers
40
+
41
+ RCT_EXTERN_METHOD(handleTokenizationNewClientToken:(NSString *)newClientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
42
+
43
+ RCT_EXTERN_METHOD(handleTokenizationSuccess:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
44
+
45
+ RCT_EXTERN_METHOD(handleTokenizationFailure:(NSString *)errorMessage resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
46
+
47
+ // MARK: Resume Handlers
48
+
49
+ RCT_EXTERN_METHOD(handleResumeWithNewClientToken:(NSString *)newClientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
50
+
51
+ RCT_EXTERN_METHOD(handleResumeSuccess:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
52
+
53
+ RCT_EXTERN_METHOD(handleResumeFailure:(NSString *)errorMessage resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
54
+
55
+ // MARK: Payment Creation Handlers
56
+
57
+ RCT_EXTERN_METHOD(handlePaymentCreationAbort:(NSString *)errorMessage resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
58
+
59
+ RCT_EXTERN_METHOD(handlePaymentCreationContinue:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
60
+
29
61
 
30
62
  @end