@smile_identity/react-native 10.1.2 → 10.1.4

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 (81) hide show
  1. package/android/build.gradle +5 -24
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +68 -3
  4. package/android/src/main/java/com/smileidentity/react/SmileIdPackage.kt +2 -2
  5. package/android/src/oldarch/SmileIdSpec.kt +14 -0
  6. package/ios/RNSmileID.mm +7 -0
  7. package/ios/RNSmileID.swift +145 -87
  8. package/ios/Utils/SmileIDDictExt.swift +16 -0
  9. package/ios/View/SmileIDBiometricKYCView.swift +1 -1
  10. package/ios/View/SmileIDDocumentVerificationView.swift +1 -1
  11. package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +1 -1
  12. package/ios/View/SmileIDSmartSelfieAuthView.swift +1 -1
  13. package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +1 -1
  14. package/lib/commonjs/NativeSmileId.js.map +1 -1
  15. package/lib/commonjs/SmileIDBiometricKYCView.js +2 -2
  16. package/lib/commonjs/SmileIDBiometricKYCView.js.map +1 -1
  17. package/lib/commonjs/SmileIDConsentView.js +2 -2
  18. package/lib/commonjs/SmileIDConsentView.js.map +1 -1
  19. package/lib/commonjs/SmileIDDocumentVerificationView.js +2 -2
  20. package/lib/commonjs/SmileIDDocumentVerificationView.js.map +1 -1
  21. package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js +2 -2
  22. package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
  23. package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js +2 -2
  24. package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js.map +1 -1
  25. package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js +2 -2
  26. package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js.map +1 -1
  27. package/lib/commonjs/index.js +22 -146
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/module/NativeSmileId.js.map +1 -1
  30. package/lib/module/SmileIDBiometricKYCView.js +1 -1
  31. package/lib/module/SmileIDBiometricKYCView.js.map +1 -1
  32. package/lib/module/SmileIDConsentView.js +1 -1
  33. package/lib/module/SmileIDConsentView.js.map +1 -1
  34. package/lib/module/SmileIDDocumentVerificationView.js +1 -1
  35. package/lib/module/SmileIDDocumentVerificationView.js.map +1 -1
  36. package/lib/module/SmileIDEnhancedDocumentVerificationView.js +1 -1
  37. package/lib/module/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
  38. package/lib/module/SmileIDSmartSelfieAuthenticationView.js +1 -1
  39. package/lib/module/SmileIDSmartSelfieAuthenticationView.js.map +1 -1
  40. package/lib/module/SmileIDSmartSelfieEnrollmentView.js +1 -1
  41. package/lib/module/SmileIDSmartSelfieEnrollmentView.js.map +1 -1
  42. package/lib/module/index.js +22 -4
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/typescript/{NativeSmileId.d.ts → src/NativeSmileId.d.ts} +33 -0
  45. package/lib/typescript/src/NativeSmileId.d.ts.map +1 -0
  46. package/lib/typescript/{SmileIDBiometricKYCView.d.ts → src/SmileIDBiometricKYCView.d.ts} +1 -1
  47. package/lib/typescript/src/SmileIDBiometricKYCView.d.ts.map +1 -0
  48. package/lib/typescript/{SmileIDConsentView.d.ts → src/SmileIDConsentView.d.ts} +1 -1
  49. package/lib/typescript/src/SmileIDConsentView.d.ts.map +1 -0
  50. package/lib/typescript/{SmileIDDocumentVerificationView.d.ts → src/SmileIDDocumentVerificationView.d.ts} +1 -1
  51. package/lib/typescript/src/SmileIDDocumentVerificationView.d.ts.map +1 -0
  52. package/lib/typescript/{SmileIDEnhancedDocumentVerificationView.d.ts → src/SmileIDEnhancedDocumentVerificationView.d.ts} +1 -1
  53. package/lib/typescript/src/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -0
  54. package/lib/typescript/{SmileIDSmartSelfieAuthenticationView.d.ts → src/SmileIDSmartSelfieAuthenticationView.d.ts} +1 -1
  55. package/lib/typescript/src/SmileIDSmartSelfieAuthenticationView.d.ts.map +1 -0
  56. package/lib/typescript/{SmileIDSmartSelfieEnrollmentView.d.ts → src/SmileIDSmartSelfieEnrollmentView.d.ts} +1 -1
  57. package/lib/typescript/src/SmileIDSmartSelfieEnrollmentView.d.ts.map +1 -0
  58. package/lib/typescript/{index.d.ts → src/index.d.ts} +24 -2
  59. package/lib/typescript/src/index.d.ts.map +1 -0
  60. package/lib/typescript/{types.d.ts → src/types.d.ts} +1 -1
  61. package/lib/typescript/src/types.d.ts.map +1 -0
  62. package/package.json +25 -38
  63. package/react-native-smile-id.podspec +17 -17
  64. package/src/NativeSmileId.ts +40 -0
  65. package/src/SmileIDBiometricKYCView.tsx +3 -7
  66. package/src/SmileIDConsentView.tsx +3 -7
  67. package/src/SmileIDDocumentVerificationView.tsx +3 -7
  68. package/src/SmileIDEnhancedDocumentVerificationView.tsx +3 -7
  69. package/src/SmileIDSmartSelfieAuthenticationView.tsx +3 -7
  70. package/src/SmileIDSmartSelfieEnrollmentView.tsx +3 -7
  71. package/src/index.tsx +32 -2
  72. package/src/types.ts +1 -1
  73. package/lib/typescript/NativeSmileId.d.ts.map +0 -1
  74. package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +0 -1
  75. package/lib/typescript/SmileIDConsentView.d.ts.map +0 -1
  76. package/lib/typescript/SmileIDDocumentVerificationView.d.ts.map +0 -1
  77. package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +0 -1
  78. package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts.map +0 -1
  79. package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts.map +0 -1
  80. package/lib/typescript/index.d.ts.map +0 -1
  81. package/lib/typescript/types.d.ts.map +0 -1
@@ -18,8 +18,9 @@ buildscript {
18
18
  }
19
19
  }
20
20
 
21
- def isNewArchitectureEnabled() {
22
- return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
21
+ def reactNativeArchitectures() {
22
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
23
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
23
24
  }
24
25
 
25
26
  apply plugin: "com.android.library"
@@ -27,10 +28,6 @@ apply plugin: "kotlin-android"
27
28
  apply plugin: 'kotlin-kapt'
28
29
  apply plugin: "org.jlleitschuh.gradle.ktlint"
29
30
 
30
- if (isNewArchitectureEnabled()) {
31
- apply plugin: "com.facebook.react"
32
- }
33
-
34
31
  def getExtOrDefault(name) {
35
32
  return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["SmileId_" + name]
36
33
  }
@@ -68,7 +65,7 @@ android {
68
65
  defaultConfig {
69
66
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
70
67
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
71
- buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
68
+
72
69
  }
73
70
  buildTypes {
74
71
  release {
@@ -100,15 +97,7 @@ android {
100
97
 
101
98
  sourceSets {
102
99
  main {
103
- if (isNewArchitectureEnabled()) {
104
- java.srcDirs += [
105
- "src/newarch",
106
- // This is needed to build Kotlin project with NewArch enabled
107
- "${project.buildDir}/generated/source/codegen/java"
108
- ]
109
- } else {
110
- java.srcDirs += ["src/oldarch"]
111
- }
100
+ java.srcDirs += ["src/oldarch"]
112
101
  }
113
102
  }
114
103
  }
@@ -144,11 +133,3 @@ dependencies {
144
133
  debugImplementation 'androidx.compose.ui:ui-tooling'
145
134
  debugImplementation 'androidx.compose.ui:ui-test-manifest'
146
135
  }
147
-
148
- if (isNewArchitectureEnabled()) {
149
- react {
150
- jsRootDir = file("../src/")
151
- libraryName = "SmileId"
152
- codegenJavaPackageName = "com.smileidentity.react"
153
- }
154
- }
@@ -3,4 +3,4 @@ SmileId_minSdkVersion=21
3
3
  SmileId_targetSdkVersion=34
4
4
  SmileId_compileSdkVersion=34
5
5
  SmileId_ndkversion=21.4.7075529
6
- SmileId_androidVersion=10.1.4
6
+ SmileId_androidVersion=10.1.6
@@ -1,10 +1,12 @@
1
1
  package com.smileidentity.react
2
2
 
3
3
  import android.util.Log
4
+ import com.facebook.react.bridge.Arguments
4
5
  import com.facebook.react.bridge.Promise
5
6
  import com.facebook.react.bridge.ReactApplicationContext
6
7
  import com.facebook.react.bridge.ReactMethod
7
8
  import com.facebook.react.bridge.ReadableMap
9
+ import com.facebook.react.bridge.WritableArray
8
10
  import com.smileidentity.SmileID
9
11
  import com.smileidentity.SmileIDCrashReporting
10
12
  import com.smileidentity.SmileIdSpec
@@ -27,10 +29,12 @@ import com.smileidentity.networking.pollSmartSelfieJobStatus
27
29
  import com.smileidentity.react.utils.getIntOrDefault
28
30
  import com.smileidentity.react.utils.getStringOrDefault
29
31
  import com.smileidentity.results.SmartSelfieResult
32
+ import java.net.URL
30
33
  import kotlinx.coroutines.CoroutineExceptionHandler
31
34
  import kotlinx.coroutines.CoroutineScope
32
35
  import kotlinx.coroutines.Dispatchers
33
36
  import kotlinx.coroutines.flow.Flow
37
+ import kotlinx.coroutines.flow.last
34
38
  import kotlinx.coroutines.flow.map
35
39
  import kotlinx.coroutines.flow.single
36
40
  import kotlinx.coroutines.launch
@@ -52,11 +56,72 @@ class SmileIdModule internal constructor(context: ReactApplicationContext) :
52
56
  promise.resolve(null)
53
57
  }
54
58
 
59
+ @ReactMethod
60
+ override fun setEnvironment(useSandBox: Boolean, promise: Promise) {
61
+ SmileID.setEnvironment(useSandbox = useSandBox)
62
+ promise.resolve(null)
63
+ }
64
+
65
+ @ReactMethod
66
+ override fun setCallbackUrl(callbackUrl: String, promise: Promise) {
67
+ SmileID.setCallbackUrl(callbackUrl = URL(callbackUrl))
68
+ promise.resolve(null)
69
+ }
70
+
55
71
  @ReactMethod
56
72
  override fun disableCrashReporting(promise: Promise) {
57
73
  SmileIDCrashReporting.disable()
58
74
  }
59
75
 
76
+ @ReactMethod
77
+ override fun setAllowOfflineMode(allowOfflineMode: Boolean, promise: Promise) {
78
+ SmileID.setAllowOfflineMode(allowOfflineMode)
79
+ promise.resolve(null)
80
+ }
81
+
82
+ @ReactMethod
83
+ override fun submitJob(jobId: String, promise: Promise) = launch(
84
+ work = { SmileID.submitJob(jobId) },
85
+ clazz = Unit::class.java,
86
+ promise = promise
87
+ )
88
+
89
+ @ReactMethod
90
+ override fun getUnsubmittedJobs(promise: Promise) {
91
+ try {
92
+ val writableArray: WritableArray = Arguments.createArray()
93
+ SmileID.getUnsubmittedJobs().forEach {
94
+ writableArray.pushString(it)
95
+ }
96
+ promise.resolve(writableArray)
97
+ } catch (e: Exception) {
98
+ promise.reject(e)
99
+ }
100
+ }
101
+
102
+ @ReactMethod
103
+ override fun getSubmittedJobs(promise: Promise) {
104
+ try {
105
+ val writableArray: WritableArray = Arguments.createArray()
106
+ SmileID.getSubmittedJobs().forEach {
107
+ writableArray.pushString(it)
108
+ }
109
+ promise.resolve(writableArray)
110
+ } catch (e: Exception) {
111
+ promise.reject(e)
112
+ }
113
+ }
114
+
115
+ @ReactMethod
116
+ override fun cleanup(jobId: String, promise: Promise) {
117
+ try {
118
+ SmileID.cleanup(jobId)
119
+ promise.resolve(null)
120
+ } catch (e: Exception) {
121
+ promise.resolve(e)
122
+ }
123
+ }
124
+
60
125
  @ReactMethod
61
126
  override fun authenticate(request: ReadableMap, promise: Promise) = launch(
62
127
  work = {
@@ -242,7 +307,7 @@ class SmileIdModule internal constructor(context: ReactApplicationContext) :
242
307
  .map {
243
308
  it
244
309
  }
245
- .single()
310
+ .last()
246
311
  }
247
312
  response
248
313
  } catch (e: Exception) {
@@ -263,7 +328,7 @@ class SmileIdModule internal constructor(context: ReactApplicationContext) :
263
328
  scope: CoroutineScope = CoroutineScope(Dispatchers.IO)
264
329
  ) {
265
330
  val handler = CoroutineExceptionHandler { _, throwable ->
266
- promise.reject(throwable.message)
331
+ promise.reject(throwable)
267
332
  }
268
333
  scope.launch(handler) {
269
334
  try {
@@ -275,7 +340,7 @@ class SmileIdModule internal constructor(context: ReactApplicationContext) :
275
340
  promise.resolve(jsonResult)
276
341
  }
277
342
  } catch (e: Exception) {
278
- promise.reject(e.message)
343
+ promise.reject(e)
279
344
  }
280
345
  }
281
346
  }
@@ -36,7 +36,7 @@ class SmileIdPackage : TurboReactPackage() {
36
36
  override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
37
37
  return ReactModuleInfoProvider {
38
38
  val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
39
- val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
39
+
40
40
  moduleInfos[SmileIdModule.NAME] = ReactModuleInfo(
41
41
  SmileIdModule.NAME,
42
42
  SmileIdModule.NAME,
@@ -44,7 +44,7 @@ class SmileIdPackage : TurboReactPackage() {
44
44
  false, // needsEagerInit
45
45
  true, // hasConstants
46
46
  false, // isCxxModule
47
- isTurboModule // isTurboModule
47
+ false // isTurboModule
48
48
  )
49
49
  moduleInfos
50
50
  }
@@ -10,6 +10,20 @@ abstract class SmileIdSpec internal constructor(context: ReactApplicationContext
10
10
 
11
11
  abstract fun initialize(useSandBox: Boolean ,promise: Promise)
12
12
 
13
+ abstract fun setEnvironment(useSandbox: Boolean, promise: Promise)
14
+
15
+ abstract fun setCallbackUrl(callbackUrl: String, promise: Promise)
16
+
17
+ abstract fun setAllowOfflineMode(allowOfflineMode: Boolean ,promise: Promise)
18
+
19
+ abstract fun submitJob(jobId: String ,promise: Promise)
20
+
21
+ abstract fun getUnsubmittedJobs(promise: Promise)
22
+
23
+ abstract fun getSubmittedJobs(promise: Promise)
24
+
25
+ abstract fun cleanup(jobId: String ,promise: Promise)
26
+
13
27
  abstract fun disableCrashReporting(promise: Promise)
14
28
 
15
29
  abstract fun authenticate(request: ReadableMap, promise: Promise)
package/ios/RNSmileID.mm CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  @interface RCT_EXTERN_MODULE(RNSmileID, NSObject)
4
4
  RCT_EXTERN_METHOD(initialize:(BOOL)useSandBox withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
5
+ RCT_EXTERN_METHOD(setEnvironment:(BOOL)useSandBox withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
6
+ RCT_EXTERN_METHOD(setCallbackUrl:(NSString)callbackUrl withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
7
+ RCT_EXTERN_METHOD(setAllowOfflineMode:(BOOL)allowOfflineMode withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
8
+ RCT_EXTERN_METHOD(submitJob:(NSString *)jobId withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
9
+ RCT_EXTERN_METHOD(getUnsubmittedJobs:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
10
+ RCT_EXTERN_METHOD(getSubmittedJobs:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
11
+ RCT_EXTERN_METHOD(cleanup:(NSString *)jobId withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
5
12
  RCT_EXTERN_METHOD(authenticate:(NSDictionary *)request withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
6
13
  RCT_EXTERN_METHOD(prepUpload:(NSDictionary *)request withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
7
14
  RCT_EXTERN_METHOD(upload:(NSString *)url request:(NSDictionary *)request withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
@@ -1,16 +1,71 @@
1
- import Combine
2
1
  import SmileID
3
2
 
4
3
  @objc(RNSmileID)
5
4
  class RNSmileID: NSObject {
6
- private var cancellables = Set<AnyCancellable>()
7
-
8
5
  @objc(initialize:withResolver:withRejecter:)
9
6
  func initialize(useSandBox: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
10
7
  SmileID.initialize(useSandbox: useSandBox)
11
8
  resolve(nil)
12
9
  }
13
10
 
11
+ @objc(setEnvironment:withResolver:withRejecter:)
12
+ func setEnvironment(useSandBox: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
13
+ SmileID.setEnvironment(useSandbox: useSandBox)
14
+ resolve(nil)
15
+ }
16
+
17
+ @objc(setCallbackUrl:withResolver:withRejecter:)
18
+ func setCallbackUrl(callbackUrl: URL, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
19
+ SmileID.setCallbackUrl(callbackUrl: callbackUrl)
20
+ resolve(nil)
21
+ }
22
+
23
+ @objc(setAllowOfflineMode:withResolver:withRejecter:)
24
+ func setAllowOfflineMode(allowOfflineMode: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
25
+ SmileID.setAllowOfflineMode(allowOfflineMode: allowOfflineMode)
26
+ resolve(nil)
27
+ }
28
+
29
+ @objc(submitJob:withResolver:withRejecter:)
30
+ func submitJob(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject : @escaping RCTPromiseRejectBlock) {
31
+ do {
32
+ try SmileID.submitJob(jobId: jobId)
33
+ resolve(nil)
34
+ } catch let error as NSError {
35
+ reject("Error", error.localizedDescription, error)
36
+ }
37
+ }
38
+
39
+ @objc(getSubmittedJobs:withRejecter:)
40
+ func getSubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
41
+ do {
42
+ let jobs: [String] = SmileID.getUnsubmittedJobs()
43
+ resolve(jobs)
44
+ } catch let error as NSError {
45
+ reject("Error", error.localizedDescription, error)
46
+ }
47
+ }
48
+
49
+ @objc(getUnsubmittedJobs:withRejecter:)
50
+ func getUnsubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
51
+ do {
52
+ let jobs: [String] = SmileID.getUnsubmittedJobs()
53
+ resolve(jobs)
54
+ } catch let error as NSError {
55
+ reject("Error", error.localizedDescription, error)
56
+ }
57
+ }
58
+
59
+ @objc(cleanup:withResolver:withRejecter:)
60
+ func cleanup(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject : @escaping RCTPromiseRejectBlock) {
61
+ do {
62
+ try SmileID.cleanup(jobId: jobId)
63
+ resolve(nil)
64
+ } catch let error as NSError {
65
+ reject("Error", error.localizedDescription, error)
66
+ }
67
+ }
68
+
14
69
  @objc(authenticate:withResolver:withRejecter:)
15
70
  func authenticate(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
16
71
  guard let authenticationRequest = request.toAuthenticationRequest() else {
@@ -18,12 +73,14 @@ class RNSmileID: NSObject {
18
73
  return
19
74
  }
20
75
 
21
- SmileID.api.authenticate(request: authenticationRequest)
22
- .sink(receiveCompletion: { completion in
23
- self.handleCompletion(completion, reject: reject)
24
- }, receiveValue: { response in
76
+ Task {
77
+ do {
78
+ let response = try await SmileID.api.authenticate(request: authenticationRequest)
25
79
  self.resolveResponse(response, resolve: resolve, reject: reject)
26
- }).store(in: &cancellables)
80
+ } catch {
81
+ reject("Error", error.localizedDescription, error)
82
+ }
83
+ }
27
84
  }
28
85
 
29
86
  @objc(prepUpload:withResolver:withRejecter:)
@@ -33,11 +90,14 @@ class RNSmileID: NSObject {
33
90
  return
34
91
  }
35
92
 
36
- SmileID.api.prepUpload(request: prepUploadRequest)
37
- .sink(
38
- receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
39
- receiveValue: { response in self.resolveResponse(response, resolve: resolve, reject: reject)
40
- }).store(in: &cancellables)
93
+ Task {
94
+ do {
95
+ let response = try await SmileID.api.prepUpload(request: prepUploadRequest)
96
+ self.resolveResponse(response, resolve: resolve, reject: reject)
97
+ } catch {
98
+ reject("Error", error.localizedDescription, error)
99
+ }
100
+ }
41
101
  }
42
102
 
43
103
  @objc(upload:request:withResolver:withRejecter:)
@@ -57,10 +117,14 @@ class RNSmileID: NSObject {
57
117
  return
58
118
  }
59
119
 
60
- SmileID.api.upload(zip: zipData, to: url)
61
- .sink(receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
62
- receiveValue: { _ in resolve(nil) }) // Assuming no response to return
63
- .store(in: &cancellables)
120
+ Task {
121
+ do {
122
+ try await SmileID.api.upload(zip: zipData, to: url)
123
+ resolve(nil)
124
+ } catch {
125
+ reject("Error", error.localizedDescription, error)
126
+ }
127
+ }
64
128
  }
65
129
 
66
130
  @objc(doEnhancedKyc:withResolver:withRejecter:)
@@ -111,23 +175,19 @@ class RNSmileID: NSObject {
111
175
  signature: signature
112
176
  )
113
177
 
114
- SmileID.api.doEnhancedKyc(request: request)
115
- .sink(receiveCompletion: { completion in
116
- switch completion {
117
- case let .failure(error):
118
- reject("Error", error.localizedDescription, error)
119
- case .finished:
120
- break
121
- }
122
- }, receiveValue: { response in
178
+ Task {
179
+ do {
180
+ let response = try await SmileID.api.doEnhancedKyc(request: request)
123
181
  let encoder = JSONEncoder()
124
182
  guard let jsonData = try? encoder.encode(response) else {
125
- reject("Error", "doEnhancedKyc encoding error ",
126
- SmileIDError.unknown("doEnhancedKyc encoding error "))
127
- return
183
+ throw SmileIDError.unknown("doEnhancedKyc encoding error")
128
184
  }
129
- resolve(["result": String(data: jsonData, encoding: .utf8)!]) // Assuming you have a method to convert response to a dictionary
130
- }).store(in: &cancellables)
185
+ // Assuming you have a method to convert response to a dictionary
186
+ resolve(["result": String(data: jsonData, encoding: .utf8)!])
187
+ } catch {
188
+ reject("Error", error.localizedDescription, error)
189
+ }
190
+ }
131
191
  }
132
192
 
133
193
  @objc(doEnhancedKycAsync:withResolver:withRejecter:)
@@ -178,23 +238,19 @@ class RNSmileID: NSObject {
178
238
  signature: signature
179
239
  )
180
240
 
181
- SmileID.api.doEnhancedKycAsync(request: request)
182
- .sink(receiveCompletion: { completion in
183
- switch completion {
184
- case let .failure(error):
185
- reject("Error", error.localizedDescription, error)
186
- case .finished:
187
- break
188
- }
189
- }, receiveValue: { response in
190
- let encoder = JSONEncoder()
191
- guard let jsonData = try? encoder.encode(response) else {
192
- reject("Error", "doEnhancedKyc encoding error ",
193
- SmileIDError.unknown("doEnhancedKyc encoding error "))
194
- return
195
- }
196
- resolve(["result": String(data: jsonData, encoding: .utf8)!]) // Assuming you have a method to convert response to a dictionary
197
- }).store(in: &cancellables)
241
+ Task {
242
+ do {
243
+ let response = try await SmileID.api.doEnhancedKycAsync(request: request)
244
+ let encoder = JSONEncoder()
245
+ guard let jsonData = try? encoder.encode(response) else {
246
+ throw SmileIDError.unknown("doEnhancedKyc encoding error")
247
+ }
248
+ // Assuming you have a method to convert response to a dictionary
249
+ resolve(["result": String(data: jsonData, encoding: .utf8)!])
250
+ } catch {
251
+ reject("Error", error.localizedDescription, error)
252
+ }
253
+ }
198
254
  }
199
255
 
200
256
  @objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
@@ -224,11 +280,14 @@ class RNSmileID: NSObject {
224
280
  return
225
281
  }
226
282
 
227
- SmileID.api.getProductsConfig(request: productsConfigRequest)
228
- .sink(
229
- receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
230
- receiveValue: { response in self.resolveResponse(response, resolve: resolve, reject: reject)
231
- }).store(in: &cancellables)
283
+ Task {
284
+ do {
285
+ let response = try await SmileID.api.getProductsConfig(request: productsConfigRequest)
286
+ self.resolveResponse(response, resolve: resolve, reject: reject)
287
+ } catch {
288
+ reject("Error", error.localizedDescription, error)
289
+ }
290
+ }
232
291
  }
233
292
 
234
293
  @objc(getValidDocuments:withResolver:withRejecter:)
@@ -238,18 +297,26 @@ class RNSmileID: NSObject {
238
297
  return
239
298
  }
240
299
 
241
- SmileID.api.getValidDocuments(request: validDocumentsRequest)
242
- .sink(receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
243
- receiveValue: { response in self.resolveResponse(response, resolve: resolve, reject: reject) })
244
- .store(in: &cancellables)
300
+ Task {
301
+ do {
302
+ let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
303
+ self.resolveResponse(response, resolve: resolve, reject: reject)
304
+ } catch {
305
+ reject("Error", error.localizedDescription, error)
306
+ }
307
+ }
245
308
  }
246
309
 
247
310
  @objc(getServicesWithResolver:withRejecter:)
248
311
  func getServices(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
249
- SmileID.api.getServices()
250
- .sink(receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
251
- receiveValue: { response in self.resolveResponse(response, resolve: resolve, reject: reject) })
252
- .store(in: &cancellables)
312
+ Task {
313
+ do {
314
+ let response = try await SmileID.api.getServices()
315
+ self.resolveResponse(response, resolve: resolve, reject: reject)
316
+ } catch {
317
+ reject("Error", error.localizedDescription, error)
318
+ }
319
+ }
253
320
  }
254
321
 
255
322
  @objc(getJobStatus:withResolver:withRejecter:)
@@ -259,10 +326,14 @@ class RNSmileID: NSObject {
259
326
  return
260
327
  }
261
328
 
262
- SmileID.api.getJobStatus(request: jobStatusRequest)
263
- .sink(receiveCompletion: { completion in self.handleCompletion(completion, reject: reject) },
264
- receiveValue: { response in self.resolveResponse(response, resolve: resolve, reject: reject) })
265
- .store(in: &cancellables)
329
+ Task {
330
+ do {
331
+ let response = try await SmileID.api.getJobStatus(request: jobStatusRequest)
332
+ self.resolveResponse(response, resolve: resolve, reject: reject)
333
+ } catch {
334
+ reject("Error", error.localizedDescription, error)
335
+ }
336
+ }
266
337
  }
267
338
 
268
339
  @objc(pollSmartSelfieJobStatus:withResolver:withRejecter:)
@@ -374,7 +445,7 @@ class RNSmileID: NSObject {
374
445
  }
375
446
 
376
447
  func pollJobStatus<RequestType, ResponseType: Encodable>(
377
- apiCall: @escaping (RequestType, TimeInterval, Int) -> AnyPublisher<ResponseType, Error>,
448
+ apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> ResponseType,
378
449
  request: RequestType,
379
450
  interval: Int64,
380
451
  numAttempts: Int64,
@@ -387,18 +458,14 @@ class RNSmileID: NSObject {
387
458
  return
388
459
  }
389
460
 
390
- apiCall(request, timeInterval, numAttemptsInt)
391
- .sink(receiveCompletion: { status in
392
- switch status {
393
- case .failure(let error):
394
- reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
395
- case .finished:
396
- break
397
- }
398
- }, receiveValue: { [self] response in
399
- resolveResponse(response, resolve: resolve, reject: reject)
400
- })
401
- .store(in: &cancellables)
461
+ Task {
462
+ do {
463
+ let response = try await apiCall(request, timeInterval, numAttemptsInt)
464
+ self.resolveResponse(response, resolve: resolve, reject: reject)
465
+ } catch {
466
+ reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
467
+ }
468
+ }
402
469
  }
403
470
 
404
471
 
@@ -407,15 +474,6 @@ class RNSmileID: NSObject {
407
474
  return TimeInterval(seconds)
408
475
  }
409
476
 
410
- private func handleCompletion(_ completion: Subscribers.Completion<Error>, reject: @escaping RCTPromiseRejectBlock) {
411
- switch completion {
412
- case let .failure(error):
413
- reject("Error", error.localizedDescription, error)
414
- case .finished:
415
- break
416
- }
417
- }
418
-
419
477
  private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
420
478
  let encoder = JSONEncoder()
421
479
  guard let jsonData = try? encoder.encode(response) else {
@@ -188,3 +188,19 @@ extension NSDictionary {
188
188
  )
189
189
  }
190
190
  }
191
+
192
+ extension Dictionary where Key == String, Value == Any {
193
+ func toJSONCompatibleDictionary() -> [String: Any] {
194
+ var jsonCompatibleDict = [String: Any]()
195
+ for (key, value) in self {
196
+ if let arrayValue = value as? [String] {
197
+ jsonCompatibleDict[key] = arrayValue
198
+ } else if let stringValue = value as? String {
199
+ jsonCompatibleDict[key] = stringValue
200
+ } else {
201
+ jsonCompatibleDict[key] = (value as? [String: Any])?.toJSONCompatibleDictionary() ?? [:]
202
+ }
203
+ }
204
+ return jsonCompatibleDict
205
+ }
206
+ }
@@ -38,7 +38,7 @@ extension SmileIDBiometricKYCView: BiometricKycResultDelegate {
38
38
  "didSubmitBiometricJob": didSubmitBiometricJob,
39
39
  ]
40
40
 
41
- guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) else {
41
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: params.toJSONCompatibleDictionary(), options: .prettyPrinted) else {
42
42
  product.onResult?(["error": SmileIDError.unknown("SmileIDBiometricKYCView encoding error")])
43
43
  return
44
44
  }
@@ -46,7 +46,7 @@ extension SmileIDDocumentVerificationView: DocumentVerificationResultDelegate {
46
46
  params["documentBackImage"] = documentBackImage.absoluteString
47
47
  }
48
48
 
49
- guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) else {
49
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: params.toJSONCompatibleDictionary(), options: .prettyPrinted) else {
50
50
  product.onResult?(["error": SmileIDError.unknown("SmileIDDocumentVerificationView encoding error")])
51
51
  return
52
52
  }
@@ -46,7 +46,7 @@ extension SmileIDEnhancedDocumentVerificationView: EnhancedDocumentVerificationR
46
46
  params["documentBackImage"] = documentBackImage.absoluteString
47
47
  }
48
48
 
49
- guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) else {
49
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: params.toJSONCompatibleDictionary(), options: .prettyPrinted) else {
50
50
  product.onResult?(["error": SmileIDError.unknown("SmileIDEnhancedDocumentVerificationView encoding error")])
51
51
  return
52
52
  }
@@ -32,7 +32,7 @@ extension SmileIDSmartSelfieAuthView: SmartSelfieResultDelegate {
32
32
  params["apiResponse"] = apiResponse
33
33
  }
34
34
 
35
- guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) else {
35
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: params.toJSONCompatibleDictionary(), options: .prettyPrinted) else {
36
36
  product.onResult?(["error": SmileIDError.unknown("SmileIDSmartSelfieAuthView encoding error")])
37
37
  return
38
38
  }
@@ -32,7 +32,7 @@ extension SmileIDSmartSelfieEnrollmentView: SmartSelfieResultDelegate {
32
32
  params["apiResponse"] = apiResponse
33
33
  }
34
34
 
35
- guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) else {
35
+ guard let jsonData = try? JSONSerialization.data(withJSONObject: params.toJSONCompatibleDictionary(), options: .prettyPrinted) else {
36
36
  product.onResult?(["error": SmileIDError.unknown("SmileIDSmartSelfieEnrollmentView encoding error")])
37
37
  return
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSmileId.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAuFpCC,gCAAmB,CAACC,YAAY,CAAO,WAAW,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeSmileId.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA+HpCC,gCAAmB,CAACC,YAAY,CAAO,WAAW,CAAC","ignoreList":[]}