@primer-io/react-native 2.21.1 → 2.23.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 (183) hide show
  1. package/android/build.gradle +23 -6
  2. package/android/config/coverage-scripts/kover.gradle +26 -0
  3. package/android/gradle/wrapper/gradle-wrapper.properties +1 -2
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +2 -2
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +10 -8
  6. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +2 -2
  7. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +12 -10
  8. package/android/src/main/java/com/primerioreactnative/PrimerRNViewModelStoreOwner.kt +9 -0
  9. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +9 -1
  10. package/android/src/main/java/com/primerioreactnative/components/events/PrimerHeadlessUniversalCheckoutComponentEvent.kt +10 -0
  11. package/android/src/main/java/com/primerioreactnative/components/manager/asset/PrimerRNHeadlessUniversalCheckoutAssetManager.kt +8 -13
  12. package/android/src/main/java/com/primerioreactnative/components/manager/banks/PrimerRNHeadlessUniversalCheckoutBanksComponent.kt +284 -0
  13. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerKlarnaPaymentViewManager.kt +103 -0
  14. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.kt +334 -0
  15. package/android/src/main/java/com/primerioreactnative/components/manager/nativeUi/PrimerRNHeadlessUniversalCheckoutNativeUiManager.kt +10 -8
  16. package/android/src/main/java/com/primerioreactnative/components/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +2 -2
  17. package/android/src/main/java/com/primerioreactnative/components/manager/vault/PrimerRNHeadlessUniversalCheckoutVaultManager.kt +5 -9
  18. package/android/src/main/java/com/primerioreactnative/datamodels/NamedComponentStepRN.kt +7 -0
  19. package/android/src/main/java/com/primerioreactnative/datamodels/NamedComponentValidatableDataRN.kt +7 -0
  20. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +8 -0
  21. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIssuingBankRN.kt +11 -0
  22. package/android/src/main/java/com/primerioreactnative/datamodels/banks/BanksCollectableDataRN.kt +17 -0
  23. package/android/src/main/java/com/primerioreactnative/datamodels/banks/BanksStepRN.kt +20 -0
  24. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/banks/BanksCollectableData.kt +8 -0
  25. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/banks/BanksStep.kt +11 -0
  26. package/android/src/main/java/com/primerioreactnative/datamodels/klarna/KlarnaPaymentCategoryRN.kt +11 -0
  27. package/android/src/main/java/com/primerioreactnative/datamodels/klarna/KlarnaPaymentCollectableDataRN.kt +21 -0
  28. package/android/src/main/java/com/primerioreactnative/datamodels/klarna/KlarnaPaymentStepRN.kt +31 -0
  29. package/android/src/main/java/com/primerioreactnative/extensions/PrimerError.kt +13 -0
  30. package/android/src/main/java/com/primerioreactnative/extensions/PrimerIssuingBank.kt +7 -0
  31. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategory.kt +12 -0
  32. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategoryRN.kt +12 -0
  33. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCollectableData.kt +14 -0
  34. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentStep.kt +21 -0
  35. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +3 -2
  36. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +8 -1
  37. package/android/src/test/java/com/primerioreactnative/utils/ErrorHelperTest.kt +24 -0
  38. package/ios/ReactNative-Bridging-Header.h +1 -0
  39. package/ios/Sources/DataModels/Banks Component/RNTBanksCollectableData.swift +42 -0
  40. package/ios/Sources/DataModels/Banks Component/RNTBanksStep.swift +36 -0
  41. package/ios/Sources/DataModels/Klarna Component/PrimerHeadlessUniversalCheckoutComponentEvent.swift +36 -0
  42. package/ios/Sources/DataModels/Klarna Component/RNTKlarnaCollectableData.swift +36 -0
  43. package/ios/Sources/DataModels/Klarna Component/RNTKlarnaPaymentCategory.swift +33 -0
  44. package/ios/Sources/DataModels/Klarna Component/RNTKlarnaStep.swift +61 -0
  45. package/ios/Sources/DataModels/Klarna Component/RNTPrimerError.swift +67 -0
  46. package/ios/Sources/Headless Universal Checkout/Managers/Klarna/KlarnaPaymentView Manager/RNTPrimerKlarnaPaymentViewManager.h +14 -0
  47. package/ios/Sources/Headless Universal Checkout/Managers/Klarna/KlarnaPaymentView Manager/RNTPrimerKlarnaPaymentViewManager.m +25 -0
  48. package/ios/Sources/Headless Universal Checkout/Managers/Klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.m +27 -0
  49. package/ios/Sources/Headless Universal Checkout/Managers/Klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.swift +283 -0
  50. package/ios/Sources/Headless Universal Checkout/Managers/RNTRedirectManager.m +25 -0
  51. package/ios/Sources/Headless Universal Checkout/Managers/RNTRedirectManager.swift +182 -0
  52. package/ios/Sources/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +5 -5
  53. package/ios/Sources/RNTPrimer.swift +12 -8
  54. package/ios/Sources/version.swift +1 -1
  55. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.js +9 -0
  56. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.js.map +1 -0
  57. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +103 -0
  58. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -0
  59. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +99 -0
  60. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -0
  61. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/RawDataManager.js +4 -4
  62. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/RawDataManager.js.map +1 -1
  63. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.js +8 -0
  64. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.js.map +1 -0
  65. package/lib/commonjs/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.js +3 -2
  66. package/lib/commonjs/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  67. package/lib/commonjs/Primer.js +2 -1
  68. package/lib/commonjs/Primer.js.map +1 -1
  69. package/lib/commonjs/index.js +186 -0
  70. package/lib/commonjs/index.js.map +1 -1
  71. package/lib/commonjs/models/IssuingBank.js +2 -0
  72. package/lib/commonjs/models/IssuingBank.js.map +1 -0
  73. package/lib/commonjs/models/NamedComponentStep.js +2 -0
  74. package/lib/commonjs/models/NamedComponentStep.js.map +1 -0
  75. package/lib/commonjs/models/NamedComponentValidatableData.js +2 -0
  76. package/lib/commonjs/models/NamedComponentValidatableData.js.map +1 -0
  77. package/lib/commonjs/models/PrimerComponentDataValidation.js +6 -0
  78. package/lib/commonjs/models/PrimerComponentDataValidation.js.map +1 -0
  79. package/lib/commonjs/models/PrimerError.js +2 -1
  80. package/lib/commonjs/models/PrimerError.js.map +1 -1
  81. package/lib/commonjs/models/banks/BanksCollectableData.js +6 -0
  82. package/lib/commonjs/models/banks/BanksCollectableData.js.map +1 -0
  83. package/lib/commonjs/models/banks/BanksSteps.js +6 -0
  84. package/lib/commonjs/models/banks/BanksSteps.js.map +1 -0
  85. package/lib/commonjs/models/klarna/KlarnaPaymentCategory.js +2 -0
  86. package/lib/commonjs/models/klarna/KlarnaPaymentCategory.js.map +1 -0
  87. package/lib/commonjs/models/klarna/KlarnaPaymentCollectableData.js +6 -0
  88. package/lib/commonjs/models/klarna/KlarnaPaymentCollectableData.js.map +1 -0
  89. package/lib/commonjs/models/klarna/KlarnaPaymentSteps.js +6 -0
  90. package/lib/commonjs/models/klarna/KlarnaPaymentSteps.js.map +1 -0
  91. package/lib/module/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.js +3 -0
  92. package/lib/module/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.js.map +1 -0
  93. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +96 -0
  94. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -0
  95. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +92 -0
  96. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -0
  97. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/RawDataManager.js +4 -4
  98. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/RawDataManager.js.map +1 -1
  99. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.js +2 -0
  100. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.js.map +1 -0
  101. package/lib/module/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.js +3 -2
  102. package/lib/module/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  103. package/lib/module/Primer.js +2 -1
  104. package/lib/module/Primer.js.map +1 -1
  105. package/lib/module/index.js +24 -0
  106. package/lib/module/index.js.map +1 -1
  107. package/lib/module/models/IssuingBank.js +2 -0
  108. package/lib/module/models/IssuingBank.js.map +1 -0
  109. package/lib/module/models/NamedComponentStep.js +2 -0
  110. package/lib/module/models/NamedComponentStep.js.map +1 -0
  111. package/lib/module/models/NamedComponentValidatableData.js +2 -0
  112. package/lib/module/models/NamedComponentValidatableData.js.map +1 -0
  113. package/lib/module/models/PrimerComponentDataValidation.js +2 -0
  114. package/lib/module/models/PrimerComponentDataValidation.js.map +1 -0
  115. package/lib/module/models/PrimerError.js +2 -1
  116. package/lib/module/models/PrimerError.js.map +1 -1
  117. package/lib/module/models/banks/BanksCollectableData.js +2 -0
  118. package/lib/module/models/banks/BanksCollectableData.js.map +1 -0
  119. package/lib/module/models/banks/BanksSteps.js +2 -0
  120. package/lib/module/models/banks/BanksSteps.js.map +1 -0
  121. package/lib/module/models/klarna/KlarnaPaymentCategory.js +2 -0
  122. package/lib/module/models/klarna/KlarnaPaymentCategory.js.map +1 -0
  123. package/lib/module/models/klarna/KlarnaPaymentCollectableData.js +2 -0
  124. package/lib/module/models/klarna/KlarnaPaymentCollectableData.js.map +1 -0
  125. package/lib/module/models/klarna/KlarnaPaymentSteps.js +2 -0
  126. package/lib/module/models/klarna/KlarnaPaymentSteps.js.map +1 -0
  127. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.d.ts +2 -0
  128. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.d.ts.map +1 -0
  129. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts +54 -0
  130. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts.map +1 -0
  131. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts +50 -0
  132. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts.map +1 -0
  133. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.d.ts +3 -0
  134. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.d.ts.map +1 -0
  135. package/lib/typescript/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.d.ts.map +1 -1
  136. package/lib/typescript/Primer.d.ts.map +1 -1
  137. package/lib/typescript/index.d.ts +26 -2
  138. package/lib/typescript/index.d.ts.map +1 -1
  139. package/lib/typescript/models/IssuingBank.d.ts +9 -0
  140. package/lib/typescript/models/IssuingBank.d.ts.map +1 -0
  141. package/lib/typescript/models/NamedComponentStep.d.ts +12 -0
  142. package/lib/typescript/models/NamedComponentStep.d.ts.map +1 -0
  143. package/lib/typescript/models/NamedComponentValidatableData.d.ts +12 -0
  144. package/lib/typescript/models/NamedComponentValidatableData.d.ts.map +1 -0
  145. package/lib/typescript/models/PrimerComponentDataValidation.d.ts +54 -0
  146. package/lib/typescript/models/PrimerComponentDataValidation.d.ts.map +1 -0
  147. package/lib/typescript/models/PrimerError.d.ts +2 -6
  148. package/lib/typescript/models/PrimerError.d.ts.map +1 -1
  149. package/lib/typescript/models/PrimerValidationError.d.ts +3 -3
  150. package/lib/typescript/models/PrimerValidationError.d.ts.map +1 -1
  151. package/lib/typescript/models/banks/BanksCollectableData.d.ts +23 -0
  152. package/lib/typescript/models/banks/BanksCollectableData.d.ts.map +1 -0
  153. package/lib/typescript/models/banks/BanksSteps.d.ts +20 -0
  154. package/lib/typescript/models/banks/BanksSteps.d.ts.map +1 -0
  155. package/lib/typescript/models/klarna/KlarnaPaymentCategory.d.ts +24 -0
  156. package/lib/typescript/models/klarna/KlarnaPaymentCategory.d.ts.map +1 -0
  157. package/lib/typescript/models/klarna/KlarnaPaymentCollectableData.d.ts +24 -0
  158. package/lib/typescript/models/klarna/KlarnaPaymentCollectableData.d.ts.map +1 -0
  159. package/lib/typescript/models/klarna/KlarnaPaymentSteps.d.ts +36 -0
  160. package/lib/typescript/models/klarna/KlarnaPaymentSteps.d.ts.map +1 -0
  161. package/package.json +4 -9
  162. package/primer-io-react-native.podspec +1 -1
  163. package/src/HeadlessUniversalCheckout/Components/PrimerKlarnaPaymentView.tsx +5 -0
  164. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.ts +161 -0
  165. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.ts +147 -0
  166. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/RawDataManager.ts +4 -4
  167. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/Utils/EventType.ts +10 -0
  168. package/src/HeadlessUniversalCheckout/PrimerHeadlessUniversalCheckout.ts +3 -2
  169. package/src/Primer.ts +2 -1
  170. package/src/index.tsx +62 -62
  171. package/src/models/IssuingBank.ts +8 -0
  172. package/src/models/NamedComponentStep.ts +11 -0
  173. package/src/models/NamedComponentValidatableData.ts +11 -0
  174. package/src/models/PrimerComponentDataValidation.ts +60 -0
  175. package/src/models/PrimerError.ts +8 -14
  176. package/src/models/PrimerValidationError.ts +3 -3
  177. package/src/models/banks/BanksCollectableData.ts +25 -0
  178. package/src/models/banks/BanksSteps.ts +22 -0
  179. package/src/models/klarna/KlarnaPaymentCategory.ts +23 -0
  180. package/src/models/klarna/KlarnaPaymentCollectableData.ts +26 -0
  181. package/src/models/klarna/KlarnaPaymentSteps.ts +36 -0
  182. /package/ios/Sources/Headless Universal Checkout/Managers/{RNTAssetsManager.m → Assets Manager/RNTAssetsManager.m} +0 -0
  183. /package/ios/Sources/Headless Universal Checkout/Managers/{RNTAssetsManager.swift → Assets Manager/RNTAssetsManager.swift} +0 -0
@@ -1,7 +1,7 @@
1
1
  buildscript {
2
2
  // Buildscript is evaluated before everything else so we can't use getExtOrDefault
3
3
  def kotlin_version = rootProject.ext.has('kotlinVersion') ? rootProject.ext.get('kotlinVersion') : project.properties['ReactNative_kotlinVersion']
4
-
4
+ def kover_version = '0.7.6'
5
5
  repositories {
6
6
  google()
7
7
  mavenCentral()
@@ -9,16 +9,18 @@ buildscript {
9
9
  }
10
10
 
11
11
  dependencies {
12
- classpath 'com.android.tools.build:gradle:4.0.2'
12
+ classpath 'com.android.tools.build:gradle:8.2.2'
13
13
  // noinspection DifferentKotlinGradleVersion
14
14
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
15
15
  classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
16
+ classpath "org.jetbrains.kotlinx:kover-gradle-plugin:$kover_version"
16
17
  }
17
18
  }
18
19
 
19
20
  apply plugin: 'com.android.library'
20
21
  apply plugin: 'kotlin-android'
21
22
  apply plugin: 'kotlinx-serialization'
23
+ apply from: "./config/coverage-scripts/kover.gradle"
22
24
 
23
25
  def getExtOrDefault(name) {
24
26
  return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ReactNative_' + name]
@@ -35,6 +37,8 @@ android {
35
37
  minSdkVersion 21
36
38
  targetSdkVersion getExtOrIntegerDefault('targetSdkVersion')
37
39
 
40
+ testInstrumentationRunnerArguments runnerBuilder: 'de.mannodermaus.junit5.AndroidJUnit5Builder'
41
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
38
42
  }
39
43
 
40
44
  buildTypes {
@@ -50,12 +54,19 @@ android {
50
54
  disable 'GradleCompatible'
51
55
  }
52
56
  compileOptions {
53
- sourceCompatibility JavaVersion.VERSION_1_8
54
- targetCompatibility JavaVersion.VERSION_1_8
57
+ sourceCompatibility JavaVersion.VERSION_17
58
+ targetCompatibility JavaVersion.VERSION_17
55
59
  }
56
60
  kotlinOptions {
57
61
  freeCompilerArgs += '-Xjvm-default=all'
58
62
  }
63
+ testOptions {
64
+ execution = 'ANDROIDX_TEST_ORCHESTRATOR'
65
+
66
+ unitTests.all {
67
+ useJUnitPlatform()
68
+ }
69
+ }
59
70
  }
60
71
 
61
72
  repositories {
@@ -135,6 +146,12 @@ dependencies {
135
146
  // noinspection GradleDynamicVersion
136
147
  api 'com.facebook.react:react-native:+'
137
148
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
138
- implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3"
139
- implementation 'io.primer:android:2.27.0'
149
+ implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
150
+ implementation 'io.primer:android:2.27.2'
151
+
152
+ testImplementation 'io.mockk:mockk:1.13.10'
153
+ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
154
+ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
155
+ testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.2'
156
+ testImplementation 'de.mannodermaus.junit5:android-test-runner:1.3.0'
140
157
  }
@@ -0,0 +1,26 @@
1
+ apply plugin: 'org.jetbrains.kotlinx.kover'
2
+
3
+ subprojects {
4
+ koverReport {
5
+ filters {
6
+ excludes {
7
+ packages(
8
+ '**.example.**',
9
+ )
10
+ }
11
+ }
12
+ androidReports("release") {
13
+ verify {
14
+ rule {
15
+ // add lower bound for percentage of covered lines
16
+ minBound(80)
17
+
18
+ // add upper bound for percentage of covered lines
19
+ maxBound(100)
20
+ }
21
+ }
22
+ }
23
+ }
24
+
25
+ tasks["koverXmlReportRelease"].dependsOn "testReleaseUnitTest"
26
+ }
@@ -1,6 +1,5 @@
1
- #Tue Feb 23 12:42:30 CET 2021
2
1
  distributionBase=GRADLE_USER_HOME
3
2
  distributionPath=wrapper/dists
4
- distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
5
4
  zipStoreBase=GRADLE_USER_HOME
6
5
  zipStorePath=wrapper/dists
@@ -5,8 +5,8 @@ import com.facebook.react.bridge.*
5
5
  import com.facebook.react.modules.core.DeviceEventManagerModule
6
6
  import com.primerioreactnative.datamodels.*
7
7
  import com.primerioreactnative.utils.PrimerImplementedRNCallbacks
8
- import com.primerioreactnative.utils.convertJsonToMap
9
8
  import com.primerioreactnative.utils.errorTo
9
+ import com.primerioreactnative.utils.toWritableMap
10
10
  import io.primer.android.Primer
11
11
  import io.primer.android.data.settings.PrimerSettings
12
12
  import kotlinx.serialization.decodeFromString
@@ -202,7 +202,7 @@ class PrimerRN(reactContext: ReactApplicationContext, private val json: Json) :
202
202
  }
203
203
 
204
204
  private fun prepareData(data: JSONObject?): WritableMap {
205
- return data?.let { convertJsonToMap(data) } ?: Arguments.createMap()
205
+ return data.toWritableMap()
206
206
  }
207
207
  }
208
208
 
@@ -211,10 +211,11 @@ class PrimerRNEventListener : PrimerCheckoutListener {
211
211
  }
212
212
  sendErrorWithCheckoutData?.invoke(
213
213
  PrimerErrorRN(
214
- error.errorId,
215
- error.description,
216
- error.diagnosticsId,
217
- error.recoverySuggestion
214
+ errorId = error.errorId,
215
+ errorCode = error.errorCode,
216
+ description = error.description,
217
+ diagnosticsId = error.diagnosticsId,
218
+ recoverySuggestion = error.recoverySuggestion
218
219
  ), checkoutData?.toPrimerCheckoutDataRN()
219
220
  )
220
221
  } else {
@@ -229,10 +230,11 @@ class PrimerRNEventListener : PrimerCheckoutListener {
229
230
  }
230
231
  sendError?.invoke(
231
232
  PrimerErrorRN(
232
- error.errorId,
233
- error.description,
234
- error.diagnosticsId,
235
- error.recoverySuggestion
233
+ errorId = error.errorId,
234
+ errorCode = error.errorCode,
235
+ description = error.description,
236
+ diagnosticsId = error.diagnosticsId,
237
+ recoverySuggestion = error.recoverySuggestion
236
238
  )
237
239
  )
238
240
  } else {
@@ -6,8 +6,8 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
6
6
  import com.primerioreactnative.datamodels.*
7
7
  import com.primerioreactnative.components.events.PrimerHeadlessUniversalCheckoutEvent
8
8
  import com.primerioreactnative.utils.PrimerHeadlessUniversalCheckoutImplementedRNCallbacks
9
- import com.primerioreactnative.utils.convertJsonToMap
10
9
  import com.primerioreactnative.utils.errorTo
10
+ import com.primerioreactnative.utils.toWritableMap
11
11
  import io.primer.android.ExperimentalPrimerApi
12
12
  import io.primer.android.components.PrimerHeadlessUniversalCheckout
13
13
  import kotlinx.serialization.decodeFromString
@@ -156,7 +156,7 @@ class PrimerRNHeadlessUniversalCheckout(
156
156
  }
157
157
 
158
158
  private fun prepareData(data: JSONObject?): WritableMap {
159
- return data?.let { convertJsonToMap(data) } ?: Arguments.createMap()
159
+ return data.toWritableMap()
160
160
  }
161
161
 
162
162
  private companion object {
@@ -10,8 +10,8 @@ import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
10
10
  import com.primerioreactnative.extensions.toPrimerClientSessionRN
11
11
  import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
12
12
  import com.primerioreactnative.utils.PrimerHeadlessUniversalCheckoutImplementedRNCallbacks
13
- import com.primerioreactnative.utils.convertJsonToMap
14
13
  import com.primerioreactnative.utils.errorTo
14
+ import com.primerioreactnative.utils.toWritableMap
15
15
  import io.primer.android.completion.PrimerHeadlessUniversalCheckoutResumeDecisionHandler
16
16
  import io.primer.android.completion.PrimerPaymentCreationDecisionHandler
17
17
  import io.primer.android.components.PrimerHeadlessUniversalCheckoutListener
@@ -61,7 +61,7 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
61
61
  availablePaymentMethods
62
62
  )
63
63
  successCallback?.resolve(
64
- convertJsonToMap(availablePaymentMethods)
64
+ availablePaymentMethods.toWritableMap()
65
65
  )
66
66
  }
67
67
 
@@ -264,10 +264,11 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
264
264
  if (implementedRNCallbacks?.isOnErrorImplemented == true) {
265
265
  sendErrorWithCheckoutData?.invoke(
266
266
  PrimerErrorRN(
267
- error.errorId,
268
- error.description,
269
- error.diagnosticsId,
270
- error.recoverySuggestion
267
+ errorId = error.errorId,
268
+ errorCode = error.errorCode,
269
+ description = error.description,
270
+ diagnosticsId = error.diagnosticsId,
271
+ recoverySuggestion = error.recoverySuggestion
271
272
  ), checkoutData?.toPrimerCheckoutDataRN()
272
273
  )
273
274
  } else {
@@ -279,10 +280,11 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
279
280
  if (implementedRNCallbacks?.isOnErrorImplemented == true) {
280
281
  sendError?.invoke(
281
282
  PrimerErrorRN(
282
- error.errorId,
283
- error.description,
284
- error.diagnosticsId,
285
- error.recoverySuggestion
283
+ errorId = error.errorId,
284
+ errorCode = error.errorCode,
285
+ description = error.description,
286
+ diagnosticsId = error.diagnosticsId,
287
+ recoverySuggestion = error.recoverySuggestion
286
288
  )
287
289
  )
288
290
  } else {
@@ -0,0 +1,9 @@
1
+ package com.primerioreactnative
2
+
3
+ import android.util.Log
4
+ import androidx.lifecycle.ViewModelStoreOwner
5
+ import androidx.lifecycle.ViewModelStore
6
+
7
+ class PrimerRNViewModelStoreOwner : ViewModelStoreOwner {
8
+ override val viewModelStore: ViewModelStore = ViewModelStore()
9
+ }
@@ -8,6 +8,9 @@ import com.primerioreactnative.components.manager.asset.PrimerRNHeadlessUniversa
8
8
  import com.primerioreactnative.components.manager.nativeUi.PrimerRNHeadlessUniversalCheckoutNativeUiManager
9
9
  import com.primerioreactnative.components.manager.raw.PrimerRNHeadlessUniversalCheckoutRawManager
10
10
  import com.primerioreactnative.components.manager.vault.PrimerRNHeadlessUniversalCheckoutVaultManager
11
+ import com.primerioreactnative.components.manager.redirect.PrimerRNHeadlessUniversalCheckoutBanksComponent
12
+ import com.primerioreactnative.components.manager.klarna.PrimerRNHeadlessUniversalCheckoutKlarnaComponent
13
+ import com.primerioreactnative.components.manager.klarna.PrimerKlarnaPaymentViewManager
11
14
  import kotlinx.serialization.json.Json
12
15
 
13
16
  class ReactNativePackage : ReactPackage {
@@ -21,7 +24,11 @@ class ReactNativePackage : ReactPackage {
21
24
  PrimerRNHeadlessUniversalCheckoutRawManager(reactContext, json),
22
25
  PrimerRNHeadlessUniversalCheckoutNativeUiManager(reactContext),
23
26
  PrimerRNHeadlessUniversalCheckoutAssetManager(reactContext),
24
- PrimerRNHeadlessUniversalCheckoutVaultManager(reactContext, json)
27
+ PrimerRNHeadlessUniversalCheckoutVaultManager(reactContext, json),
28
+ PrimerRNHeadlessUniversalCheckoutKlarnaComponent(reactContext),
29
+ //region Component with redirect components
30
+ PrimerRNHeadlessUniversalCheckoutBanksComponent(reactContext)
31
+ //endregion
25
32
  )
26
33
  }
27
34
 
@@ -31,6 +38,7 @@ class ReactNativePackage : ReactPackage {
31
38
  PrimerCardholderNameEditTextManager(),
32
39
  PrimerExpiryEditTextManager(),
33
40
  PrimerCvvEditTextManager(),
41
+ PrimerKlarnaPaymentViewManager(reactContext)
34
42
  )
35
43
  }
36
44
  }
@@ -0,0 +1,10 @@
1
+ package com.primerioreactnative.components.events
2
+
3
+ internal enum class PrimerHeadlessUniversalCheckoutComponentEvent(val eventName: String) {
4
+ ON_STEP("onStep"),
5
+ ON_ERROR("onError"),
6
+ ON_IN_VALID("onInvalid"),
7
+ ON_VALID("onValid"),
8
+ ON_VALIDATING("onValidating"),
9
+ ON_VALIDATION_ERROR("onValidationError"),
10
+ }
@@ -13,8 +13,8 @@ import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPayme
13
13
  import com.primerioreactnative.components.datamodels.manager.asset.PrimerRNPaymentMethodAssets
14
14
  import com.primerioreactnative.components.datamodels.manager.asset.toPrimerRNPaymentMethodAsset
15
15
  import com.primerioreactnative.datamodels.ErrorTypeRN
16
- import com.primerioreactnative.utils.convertJsonToMap
17
16
  import com.primerioreactnative.utils.errorTo
17
+ import com.primerioreactnative.utils.toWritableMap
18
18
  import io.primer.android.ExperimentalPrimerApi
19
19
  import io.primer.android.components.SdkUninitializedException
20
20
  import io.primer.android.components.ui.assets.PrimerHeadlessUniversalCheckoutAssetsManager
@@ -52,13 +52,11 @@ internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
52
52
  drawableToBitmap(ContextCompat.getDrawable(reactContext, resourceId)!!),
53
53
  )
54
54
  promise.resolve(
55
- convertJsonToMap(
56
- JSONObject(
55
+ JSONObject(
57
56
  Json.encodeToString(
58
57
  PrimerCardNetworkAsset("file://${file.absolutePath}")
59
58
  )
60
- )
61
- )
59
+ ).toWritableMap()
62
60
  )
63
61
  }
64
62
  } catch (e: SdkUninitializedException) {
@@ -78,8 +76,7 @@ internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
78
76
  paymentMethodTypeStr
79
77
  )
80
78
  promise.resolve(
81
- convertJsonToMap(
82
- JSONObject(
79
+ JSONObject(
83
80
  Json.encodeToString(
84
81
  PrimerRNPaymentMethodAssetWrapper(
85
82
  paymentMethodAsset.toPrimerRNPaymentMethodAsset(
@@ -87,9 +84,8 @@ internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
87
84
  paymentMethodTypeStr
88
85
  )
89
86
  )
90
- )
91
87
  )
92
- )
88
+ ).toWritableMap()
93
89
  )
94
90
  } catch (e: SdkUninitializedException) {
95
91
  promise.reject(ErrorTypeRN.UnitializedSdkSession.errorId, e.message, e)
@@ -111,18 +107,17 @@ internal class PrimerRNHeadlessUniversalCheckoutAssetManager(
111
107
  promise.reject(exception.errorId, exception.description)
112
108
  }
113
109
  promise.resolve(
114
- convertJsonToMap(
115
- JSONObject(
110
+ JSONObject(
116
111
  Json.encodeToString(
117
112
  PrimerRNPaymentMethodAssets(paymentMethodAssets.map {
118
113
  it.toPrimerRNPaymentMethodAsset(
119
114
  reactContext,
120
115
  it.paymentMethodType
121
116
  )
122
- })
117
+ }
123
118
  )
124
119
  )
125
- )
120
+ ).toWritableMap()
126
121
  )
127
122
  } catch (e: SdkUninitializedException) {
128
123
  promise.reject(ErrorTypeRN.UnitializedSdkSession.errorId, e.message, e)
@@ -0,0 +1,284 @@
1
+ package com.primerioreactnative.components.manager.redirect
2
+
3
+ import androidx.lifecycle.LifecycleOwner
4
+ import androidx.lifecycle.ViewModelStoreOwner
5
+ import androidx.lifecycle.lifecycleScope
6
+ import com.facebook.react.bridge.Arguments
7
+ import com.facebook.react.bridge.Promise
8
+ import com.facebook.react.bridge.ReactApplicationContext
9
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
10
+ import com.facebook.react.bridge.ReactMethod
11
+ import com.facebook.react.bridge.WritableMap
12
+ import com.facebook.react.bridge.WritableArray
13
+ import com.facebook.react.modules.core.DeviceEventManagerModule
14
+ import com.primerioreactnative.PrimerRNViewModelStoreOwner
15
+ import com.primerioreactnative.components.events.PrimerHeadlessUniversalCheckoutComponentEvent
16
+ import com.primerioreactnative.datamodels.ErrorTypeRN
17
+ import com.primerioreactnative.datamodels.PrimerValidationErrorRN
18
+ import com.primerioreactnative.datamodels.extensions.banks.toBankIdRN
19
+ import com.primerioreactnative.datamodels.extensions.banks.toFilterRN
20
+ import com.primerioreactnative.datamodels.extensions.banks.toLoadingRN
21
+ import com.primerioreactnative.datamodels.extensions.banks.toBanksRetrievedRN
22
+ import com.primerioreactnative.datamodels.NamedComponentStep
23
+ import com.primerioreactnative.extensions.toPrimerErrorRN
24
+ import com.primerioreactnative.extensions.toPrimerIssuingBankRN
25
+ import com.primerioreactnative.utils.convertJsonToMap
26
+ import com.primerioreactnative.utils.convertJsonToArray
27
+ import com.primerioreactnative.utils.errorTo
28
+ import io.primer.android.components.manager.banks.composable.BanksCollectableData
29
+ import io.primer.android.components.manager.banks.composable.BanksStep
30
+ import io.primer.android.components.manager.componentWithRedirect.PrimerHeadlessUniversalCheckoutComponentWithRedirectManager
31
+ import io.primer.android.components.manager.componentWithRedirect.component.BanksComponent
32
+ import io.primer.android.components.manager.core.composable.PrimerValidationStatus
33
+ import kotlinx.coroutines.CoroutineScope
34
+ import kotlinx.coroutines.Dispatchers
35
+ import kotlinx.coroutines.Job
36
+ import kotlinx.coroutines.SupervisorJob
37
+ import kotlinx.coroutines.coroutineScope
38
+ import kotlinx.coroutines.flow.collectLatest
39
+ import kotlinx.coroutines.launch
40
+ import kotlinx.serialization.encodeToString
41
+ import kotlinx.serialization.json.Json
42
+ import org.json.JSONArray
43
+ import org.json.JSONObject
44
+
45
+ class PrimerRNHeadlessUniversalCheckoutBanksComponent(
46
+ private val reactContext: ReactApplicationContext,
47
+ ) : ReactContextBaseJavaModule(reactContext) {
48
+ override fun getName() = "RNTPrimerHeadlessUniversalCheckoutBanksComponent"
49
+
50
+ private var job: Job? = null
51
+ private var banksComponent: BanksComponent? = null
52
+ private var viewModelStoreOwner: ViewModelStoreOwner? = null
53
+
54
+ @ReactMethod
55
+ fun configure(paymentMethodType: String, promise: Promise) {
56
+
57
+ val currentViewModelStoreOwner =
58
+ reactContext.currentActivity as? ViewModelStoreOwner
59
+ ?: run { PrimerRNViewModelStoreOwner() }
60
+
61
+ viewModelStoreOwner = currentViewModelStoreOwner
62
+ banksComponent =
63
+ PrimerHeadlessUniversalCheckoutComponentWithRedirectManager(currentViewModelStoreOwner)
64
+ .provide<BanksComponent>(paymentMethodType = paymentMethodType)
65
+
66
+ val lifecycleScope =
67
+ (reactContext.currentActivity as? LifecycleOwner)?.lifecycleScope
68
+ ?: CoroutineScope(SupervisorJob() + Dispatchers.Main)
69
+
70
+ job =
71
+ lifecycleScope.launch {
72
+ if (banksComponent == null) {
73
+ val exception = ErrorTypeRN.NativeBridgeFailed errorTo UNINITIALIZED_ERROR
74
+ promise.reject(exception.errorId, exception.description)
75
+ } else {
76
+ coroutineScope {
77
+ launch { configureBanksListener() }
78
+
79
+ launch { configureValidationListener() }
80
+
81
+ launch { configureErrorListener() }
82
+ promise.resolve(null)
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+ @ReactMethod
89
+ fun start(promise: Promise) {
90
+ if (banksComponent == null) {
91
+ val exception = ErrorTypeRN.NativeBridgeFailed errorTo UNINITIALIZED_ERROR
92
+ promise.reject(exception.errorId, exception.description)
93
+ } else {
94
+ banksComponent?.start()
95
+ promise.resolve(null)
96
+ }
97
+ }
98
+
99
+ @ReactMethod
100
+ fun submit(promise: Promise) {
101
+ if (banksComponent == null) {
102
+ val exception = ErrorTypeRN.NativeBridgeFailed errorTo UNINITIALIZED_ERROR
103
+ promise.reject(exception.errorId, exception.description)
104
+ } else {
105
+ banksComponent?.submit()
106
+ promise.resolve(null)
107
+ }
108
+ }
109
+
110
+ @ReactMethod
111
+ fun onBankSelected(bankId: String, promise: Promise) {
112
+ if (banksComponent == null) {
113
+ val exception = ErrorTypeRN.NativeBridgeFailed errorTo UNINITIALIZED_ERROR
114
+ promise.reject(exception.errorId, exception.description)
115
+ } else {
116
+ banksComponent?.updateCollectedData(BanksCollectableData.BankId(bankId))
117
+ promise.resolve(null)
118
+ }
119
+ }
120
+
121
+ @ReactMethod
122
+ fun onBankFilterChange(filter: String, promise: Promise) {
123
+ if (banksComponent == null) {
124
+ val exception = ErrorTypeRN.NativeBridgeFailed errorTo UNINITIALIZED_ERROR
125
+ promise.reject(exception.errorId, exception.description)
126
+ } else {
127
+ banksComponent?.updateCollectedData(BanksCollectableData.Filter(filter))
128
+ promise.resolve(null)
129
+ }
130
+ }
131
+
132
+ private suspend fun configureErrorListener() {
133
+ banksComponent?.componentError?.collectLatest { error ->
134
+ sendEvent(
135
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_ERROR.eventName,
136
+ JSONObject().apply {
137
+ put(
138
+ "errors",
139
+ JSONArray().apply {
140
+ put(JSONObject(json.encodeToString(error.toPrimerErrorRN())))
141
+ }
142
+ )
143
+ }
144
+ )
145
+ }
146
+ }
147
+
148
+ private suspend fun configureBanksListener() {
149
+ banksComponent?.componentStep?.collectLatest { banksStep ->
150
+ when (banksStep) {
151
+ is BanksStep.Loading -> {
152
+ sendEvent(
153
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_STEP.eventName,
154
+ JSONObject(json.encodeToString(banksStep.toLoadingRN()))
155
+ )
156
+ }
157
+ is BanksStep.BanksRetrieved -> {
158
+ sendEvent(
159
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_STEP.eventName,
160
+ JSONObject(
161
+ json.encodeToString(banksStep.toBanksRetrievedRN())
162
+ )
163
+ )
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ private suspend fun configureValidationListener() {
170
+ banksComponent?.componentValidationStatus?.collectLatest { validationStatus ->
171
+ when (validationStatus) {
172
+ is PrimerValidationStatus.Validating -> {
173
+ sendEvent(
174
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_VALIDATING.eventName,
175
+ JSONObject().apply {
176
+ putData(validationStatus.collectableData as BanksCollectableData)
177
+ }
178
+ )
179
+ }
180
+ is PrimerValidationStatus.Invalid -> {
181
+ sendEvent(
182
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_IN_VALID.eventName,
183
+ JSONObject().apply {
184
+ putData(validationStatus.collectableData as BanksCollectableData)
185
+ put(
186
+ "errors",
187
+ JSONArray(
188
+ validationStatus.validationErrors.map {
189
+ JSONObject(
190
+ json.encodeToString(
191
+ PrimerValidationErrorRN(
192
+ it.errorId,
193
+ it.description,
194
+ it.diagnosticsId,
195
+ )
196
+ )
197
+ )
198
+ }
199
+ )
200
+ )
201
+ }
202
+ )
203
+ }
204
+ is PrimerValidationStatus.Valid -> {
205
+ sendEvent(
206
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_VALID.eventName,
207
+ JSONObject().apply {
208
+ putData(validationStatus.collectableData as BanksCollectableData)
209
+ }
210
+ )
211
+ }
212
+ is PrimerValidationStatus.Error -> {
213
+ sendEvent(
214
+ PrimerHeadlessUniversalCheckoutComponentEvent.ON_VALIDATION_ERROR.eventName,
215
+ JSONObject().apply {
216
+ putData(validationStatus.collectableData as BanksCollectableData)
217
+ put(
218
+ "errors",
219
+ JSONArray().apply {
220
+ put(JSONObject(json.encodeToString(validationStatus.error.toPrimerErrorRN())))
221
+ }
222
+ )
223
+ }
224
+ )
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ private fun JSONObject.putData(collectableData: BanksCollectableData) {
231
+ put(
232
+ "data",
233
+ JSONObject(
234
+ json.encodeToString(
235
+ when (collectableData) {
236
+ is BanksCollectableData.BankId -> collectableData.toBankIdRN()
237
+ is BanksCollectableData.Filter -> collectableData.toFilterRN()
238
+ }
239
+ )
240
+ )
241
+ )
242
+ }
243
+
244
+ @ReactMethod fun addListener(eventName: String?) = Unit
245
+
246
+ @ReactMethod fun removeListeners(count: Int?) = Unit
247
+
248
+ private fun JSONObject?.toWritableMap(): WritableMap =
249
+ this?.let { convertJsonToMap(this) } ?: Arguments.createMap()
250
+
251
+ private fun JSONArray?.toWritableArray(): WritableArray =
252
+ this?.let { convertJsonToArray(this) } ?: Arguments.createArray()
253
+
254
+ private fun sendEvent(name: String, data: JSONObject?) {
255
+ reactApplicationContext
256
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
257
+ .emit(name, data.toWritableMap())
258
+ }
259
+
260
+ private fun sendEvent(name: String, data: JSONArray?) {
261
+ reactApplicationContext
262
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
263
+ .emit(name, data.toWritableArray())
264
+ }
265
+
266
+ @ReactMethod
267
+ fun cleanUp(promise: Promise) {
268
+ job?.cancel()
269
+ job = null
270
+ banksComponent = null
271
+ viewModelStoreOwner?.viewModelStore?.clear()
272
+ promise.resolve(null)
273
+ }
274
+
275
+ private companion object {
276
+ const val UNINITIALIZED_ERROR =
277
+ """
278
+ The BanksComponent has not been initialized.
279
+ Make sure you have initialized the `BanksComponent` first.
280
+ """
281
+
282
+ val json = Json { encodeDefaults = true }
283
+ }
284
+ }