@smile_identity/react-native 10.2.4-beta.1 → 10.2.5

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 (70) hide show
  1. package/android/build.gradle +2 -1
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/smileidentity/react/Mapper.kt +1 -1
  4. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +1 -0
  5. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +1 -0
  6. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +1 -0
  7. package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +2 -0
  8. package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +2 -0
  9. package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +2 -0
  10. package/ios/RNDelegates/SmileIDUIViewDelegate.swift +2 -0
  11. package/ios/RNSmileID.swift +482 -471
  12. package/ios/Utils/FileUtils.swift +17 -17
  13. package/ios/Utils/SmileIDDictExt.swift +29 -9
  14. package/ios/Utils/SmileIDUtils.swift +9 -0
  15. package/ios/View/BaseSmileIDView.swift +6 -5
  16. package/ios/View/SmileIDBiometricKYCView.swift +56 -54
  17. package/ios/View/SmileIDConsentView.swift +3 -2
  18. package/ios/View/SmileIDDocumentCaptureView.swift +64 -64
  19. package/ios/View/SmileIDDocumentVerificationView.swift +52 -51
  20. package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +53 -50
  21. package/ios/View/SmileIDSmartSelfieAuthEnhancedView.swift +34 -33
  22. package/ios/View/SmileIDSmartSelfieAuthView.swift +35 -34
  23. package/ios/View/SmileIDSmartSelfieCaptureView.swift +55 -55
  24. package/ios/View/SmileIDSmartSelfieEnrollmentEnhancedView.swift +35 -34
  25. package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +37 -36
  26. package/ios/ViewManagers/SmileIDBaseViewManager.swift +38 -25
  27. package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +30 -24
  28. package/ios/ViewManagers/SmileIDConsentViewManager.swift +2 -2
  29. package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +19 -19
  30. package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +41 -40
  31. package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +47 -40
  32. package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.swift +16 -16
  33. package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +20 -20
  34. package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +27 -26
  35. package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.swift +16 -16
  36. package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +20 -20
  37. package/ios/ViewModels/SmileIDProductModel.swift +7 -5
  38. package/lib/commonjs/SmileIDBiometricKYCView.js +2 -11
  39. package/lib/commonjs/SmileIDBiometricKYCView.js.map +1 -1
  40. package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js +2 -11
  41. package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
  42. package/lib/commonjs/index.js.map +1 -1
  43. package/lib/commonjs/types.js +31 -1
  44. package/lib/commonjs/types.js.map +1 -1
  45. package/lib/commonjs/useSmileIDView.js +16 -6
  46. package/lib/commonjs/useSmileIDView.js.map +1 -1
  47. package/lib/module/SmileIDBiometricKYCView.js +2 -11
  48. package/lib/module/SmileIDBiometricKYCView.js.map +1 -1
  49. package/lib/module/SmileIDEnhancedDocumentVerificationView.js +2 -11
  50. package/lib/module/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
  51. package/lib/module/index.js.map +1 -1
  52. package/lib/module/types.js +29 -0
  53. package/lib/module/types.js.map +1 -1
  54. package/lib/module/useSmileIDView.js +17 -7
  55. package/lib/module/useSmileIDView.js.map +1 -1
  56. package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +1 -1
  57. package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts +2 -2
  58. package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -1
  59. package/lib/typescript/index.d.ts +2 -2
  60. package/lib/typescript/index.d.ts.map +1 -1
  61. package/lib/typescript/types.d.ts +17 -3
  62. package/lib/typescript/types.d.ts.map +1 -1
  63. package/lib/typescript/useSmileIDView.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/react-native-smile-id.podspec +1 -1
  66. package/src/SmileIDBiometricKYCView.tsx +2 -9
  67. package/src/SmileIDEnhancedDocumentVerificationView.tsx +6 -16
  68. package/src/index.tsx +2 -0
  69. package/src/types.ts +62 -3
  70. package/src/useSmileIDView.tsx +17 -9
@@ -2,506 +2,517 @@ import SmileID
2
2
 
3
3
  @objc(RNSmileID)
4
4
  class RNSmileID: NSObject {
5
- @objc(initialize:enableCrashReporting:config:apiKey:withResolver:withRejecter:)
6
- func initialize(
7
- useSandBox: Bool,
8
- enableCrashReporting: Bool,
9
- config: NSDictionary?,
10
- apiKey: String?,
11
- resolve: @escaping RCTPromiseResolveBlock,
12
- reject: @escaping RCTPromiseRejectBlock
13
- ) {
14
- // Handle different initialization scenarios based on provided parameters
15
- if let apiKey = apiKey, let config = config {
16
- // Initialize with API key and config
17
- SmileID.initialize(
18
- apiKey: apiKey,
19
- config: config.toConfig(),
20
- useSandbox: useSandBox
21
- )
22
- } else if let config = config {
23
- // Initialize with just config
24
- SmileID.initialize(
25
- config: config.toConfig(),
26
- useSandbox: useSandBox
27
- )
28
- } else {
29
- // Basic initialization with just sandbox flag
30
- SmileID.initialize(useSandbox: useSandBox)
31
- }
32
-
33
- resolve(nil)
34
- }
35
-
36
- @objc(setCallbackUrl:withResolver:withRejecter:)
37
- func setCallbackUrl(callbackUrl: String, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
38
- SmileID.setCallbackUrl(url: URL(string: callbackUrl))
39
- resolve(nil)
40
- }
41
-
42
- @objc(setAllowOfflineMode:withResolver:withRejecter:)
43
- func setAllowOfflineMode(allowOfflineMode: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
44
- SmileID.setAllowOfflineMode(allowOfflineMode: allowOfflineMode)
45
- resolve(nil)
46
- }
47
-
48
- @objc(submitJob:withResolver:withRejecter:)
49
- func submitJob(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject : @escaping RCTPromiseRejectBlock) {
50
- do {
51
- try SmileID.submitJob(jobId: jobId)
52
- resolve(nil)
53
- } catch let error as NSError {
54
- reject("Error", error.localizedDescription, error)
55
- }
56
- }
57
-
58
- @objc(getSubmittedJobs:withRejecter:)
59
- func getSubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
60
- do {
61
- let jobs: [String] = SmileID.getUnsubmittedJobs()
62
- resolve(jobs)
63
- } catch let error as NSError {
64
- reject("Error", error.localizedDescription, error)
65
- }
66
- }
67
-
68
- @objc(getUnsubmittedJobs:withRejecter:)
69
- func getUnsubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
70
- do {
71
- let jobs: [String] = SmileID.getUnsubmittedJobs()
72
- resolve(jobs)
73
- } catch let error as NSError {
74
- reject("Error", error.localizedDescription, error)
75
- }
76
- }
77
-
78
- @objc(cleanup:withResolver:withRejecter:)
79
- func cleanup(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject : @escaping RCTPromiseRejectBlock) {
80
- do {
81
- try SmileID.cleanup(jobId: jobId)
82
- resolve(nil)
83
- } catch let error as NSError {
84
- reject("Error", error.localizedDescription, error)
85
- }
86
- }
87
-
88
- @objc(authenticate:withResolver:withRejecter:)
89
- func authenticate(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
90
- guard let authenticationRequest = request.toAuthenticationRequest() else {
91
- reject("Error", "Invalid request data", nil)
92
- return
93
- }
94
-
95
- Task {
96
- do {
97
- let response = try await SmileID.api.authenticate(request: authenticationRequest)
98
- self.resolveResponse(response, resolve: resolve, reject: reject)
99
- } catch {
100
- reject("Error", error.localizedDescription, error)
101
- }
102
- }
103
- }
104
-
105
- @objc(prepUpload:withResolver:withRejecter:)
106
- func prepUpload(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
107
- guard let prepUploadRequest = request.toPrepUploadRequest() else {
108
- reject("Error", "Invalid prep upload request", nil)
109
- return
110
- }
111
-
112
- Task {
113
- do {
114
- let response = try await SmileID.api.prepUpload(request: prepUploadRequest)
115
- self.resolveResponse(response, resolve: resolve, reject: reject)
116
- } catch {
117
- reject("Error", error.localizedDescription, error)
118
- }
119
- }
120
- }
121
-
122
- @objc(upload:request:withResolver:withRejecter:)
123
- func upload(url: String, request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
124
- guard let uploadRequest = request.toUploadRequest() else {
125
- reject("Error", "Invalid upload request", nil)
126
- return
127
- }
128
-
129
- guard let zipData = try? LocalStorage.toZip(uploadRequest: uploadRequest) else {
130
- reject("Error", "Unable to zip file", nil)
131
- return
132
- }
133
- Task {
134
- do {
135
- try await SmileID.api.upload(zip: zipData, to: url)
5
+ @objc(initialize:enableCrashReporting:config:apiKey:withResolver:withRejecter:)
6
+ func initialize(
7
+ useSandBox: Bool,
8
+ enableCrashReporting _: Bool,
9
+ config: NSDictionary?,
10
+ apiKey: String?,
11
+ resolve: @escaping RCTPromiseResolveBlock,
12
+ reject _: @escaping RCTPromiseRejectBlock
13
+ ) {
14
+ // Handle different initialization scenarios based on provided parameters
15
+ if let apiKey = apiKey, let config = config {
16
+ // Initialize with API key and config
17
+ SmileID.initialize(
18
+ apiKey: apiKey,
19
+ config: config.toConfig(),
20
+ useSandbox: useSandBox
21
+ )
22
+ } else if let config = config {
23
+ // Initialize with just config
24
+ SmileID.initialize(
25
+ config: config.toConfig(),
26
+ useSandbox: useSandBox
27
+ )
28
+ } else {
29
+ // Basic initialization with just sandbox flag
30
+ SmileID.initialize(useSandbox: useSandBox)
31
+ }
32
+
136
33
  resolve(nil)
137
- } catch {
138
- reject("Error", error.localizedDescription, error)
139
- }
140
- }
141
- }
142
-
143
- @objc(doEnhancedKyc:withResolver:withRejecter:)
144
- func doEnhancedKyc(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
145
- guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
146
- reject("doEnhancedKyc", "partnerParams is required", nil)
147
- return
148
- }
149
- guard let partnerParams = partnerParamsDict.toPartnerParams() else {
150
- reject("doEnhancedKyc", "partnerParams is missing required data", nil)
151
- return
152
- }
153
- guard let country = request["country"] as? String else {
154
- reject("doEnhancedKyc", "country is required", nil)
155
- return
156
34
  }
157
- guard let idType = request["idType"] as? String else {
158
- reject("doEnhancedKyc", "idType is required", nil)
159
- return
160
- }
161
- guard let idNumber = request["idNumber"] as? String else {
162
- reject("doEnhancedKyc", "idNumber is required", nil)
163
- return
164
- }
165
- guard let timestamp = request["timestamp"] as? String else {
166
- reject("doEnhancedKyc", "timestamp is required", nil)
167
- return
35
+
36
+ @objc(setCallbackUrl:withResolver:withRejecter:)
37
+ func setCallbackUrl(callbackUrl: String, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
38
+ SmileID.setCallbackUrl(url: URL(string: callbackUrl))
39
+ resolve(nil)
168
40
  }
169
- guard let signature = request["signature"] as? String else {
170
- reject("doEnhancedKyc", "signature is required", nil)
171
- return
41
+
42
+ @objc(setAllowOfflineMode:withResolver:withRejecter:)
43
+ func setAllowOfflineMode(allowOfflineMode: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
44
+ SmileID.setAllowOfflineMode(allowOfflineMode: allowOfflineMode)
45
+ resolve(nil)
172
46
  }
173
-
174
- let request = EnhancedKycRequest(
175
- country: country,
176
- idType: idType,
177
- idNumber: idNumber,
178
- firstName: request["firstName"] as? String,
179
- middleName: request["middleName"] as? String,
180
- lastName: request["lastName"] as? String,
181
- dob: request["dob"] as? String,
182
- phoneNumber: request["phoneNumber"] as? String,
183
- bankCode: request["bankCode"] as? String,
184
- callbackUrl: request["callbackUrl"] as? String,
185
- partnerParams: partnerParams,
186
- sourceSdk: "ios (react-native)",
187
- timestamp: timestamp,
188
- signature: signature
189
- )
190
-
191
- Task {
192
- do {
193
- let response = try await SmileID.api.doEnhancedKyc(request: request)
194
- let encoder = JSONEncoder()
195
- guard let jsonData = try? encoder.encode(response) else {
196
- throw SmileIDError.unknown("doEnhancedKyc encoding error")
47
+
48
+ @objc(submitJob:withResolver:withRejecter:)
49
+ func submitJob(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
50
+ do {
51
+ try SmileID.submitJob(jobId: jobId)
52
+ resolve(nil)
53
+ } catch let error as NSError {
54
+ reject("Error", error.localizedDescription, error)
197
55
  }
198
- // Assuming you have a method to convert response to a dictionary
199
- resolve(["result": String(data: jsonData, encoding: .utf8)!])
200
- } catch {
201
- reject("Error", error.localizedDescription, error)
202
- }
203
56
  }
204
- }
205
-
206
- @objc(doEnhancedKycAsync:withResolver:withRejecter:)
207
- func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
208
- guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
209
- reject("doEnhancedKyc", "partnerParams is required", nil)
210
- return
211
- }
212
- guard let partnerParams = partnerParamsDict.toPartnerParams() else {
213
- reject("doEnhancedKyc", "partnerParams is missing required data", nil)
214
- return
215
- }
216
- guard let country = request["country"] as? String else {
217
- reject("doEnhancedKyc", "country is required", nil)
218
- return
219
- }
220
- guard let idType = request["idType"] as? String else {
221
- reject("doEnhancedKyc", "idType is required", nil)
222
- return
223
- }
224
- guard let idNumber = request["idNumber"] as? String else {
225
- reject("doEnhancedKyc", "idNumber is required", nil)
226
- return
227
- }
228
- guard let timestamp = request["timestamp"] as? String else {
229
- reject("doEnhancedKyc", "timestamp is required", nil)
230
- return
231
- }
232
- guard let signature = request["signature"] as? String else {
233
- reject("doEnhancedKyc", "signature is required", nil)
234
- return
57
+
58
+ @objc(getSubmittedJobs:withRejecter:)
59
+ func getSubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
60
+ do {
61
+ let jobs: [String] = SmileID.getUnsubmittedJobs()
62
+ resolve(jobs)
63
+ } catch let error as NSError {
64
+ reject("Error", error.localizedDescription, error)
65
+ }
235
66
  }
236
-
237
- let request = EnhancedKycRequest(
238
- country: country,
239
- idType: idType,
240
- idNumber: idNumber,
241
- firstName: request["firstName"] as? String,
242
- middleName: request["middleName"] as? String,
243
- lastName: request["lastName"] as? String,
244
- dob: request["dob"] as? String,
245
- phoneNumber: request["phoneNumber"] as? String,
246
- bankCode: request["bankCode"] as? String,
247
- callbackUrl: request["callbackUrl"] as? String,
248
- partnerParams: partnerParams,
249
- sourceSdk: "ios (react-native)",
250
- timestamp: timestamp,
251
- signature: signature
252
- )
253
-
254
- Task {
255
- do {
256
- let response = try await SmileID.api.doEnhancedKycAsync(request: request)
257
- let encoder = JSONEncoder()
258
- guard let jsonData = try? encoder.encode(response) else {
259
- throw SmileIDError.unknown("doEnhancedKyc encoding error")
67
+
68
+ @objc(getUnsubmittedJobs:withRejecter:)
69
+ func getUnsubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
70
+ do {
71
+ let jobs: [String] = SmileID.getUnsubmittedJobs()
72
+ resolve(jobs)
73
+ } catch let error as NSError {
74
+ reject("Error", error.localizedDescription, error)
260
75
  }
261
- // Assuming you have a method to convert response to a dictionary
262
- resolve(["result": String(data: jsonData, encoding: .utf8)!])
263
- } catch {
264
- reject("Error", error.localizedDescription, error)
265
- }
266
76
  }
267
- }
268
-
269
- @objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
270
- func getSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
271
- getJobStatus(request: request, resolve: resolve, reject: reject)
272
- }
273
-
274
- @objc(getDocumentVerificationJobStatus:withResolver:withRejecter:)
275
- func getDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
276
- getJobStatus(request: request, resolve: resolve, reject: reject)
277
- }
278
-
279
- @objc(getBiometricKycJobStatus:withResolver:withRejecter:)
280
- func getBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
281
- getJobStatus(request: request, resolve: resolve, reject: reject)
282
- }
283
-
284
- @objc(getEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
285
- func getEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
286
- getJobStatus(request: request, resolve: resolve, reject: reject)
287
- }
288
-
289
- @objc(getProductsConfig:withResolver:withRejecter:)
290
- func getProductsConfig(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
291
- guard let productsConfigRequest = request.toProductsConfigRequest() else {
292
- reject("Error", "Invalid products config request", nil)
293
- return
77
+
78
+ @objc(cleanup:withResolver:withRejecter:)
79
+ func cleanup(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
80
+ do {
81
+ try SmileID.cleanup(jobId: jobId)
82
+ resolve(nil)
83
+ } catch let error as NSError {
84
+ reject("Error", error.localizedDescription, error)
85
+ }
294
86
  }
295
-
296
- Task {
297
- do {
298
- let response = try await SmileID.api.getProductsConfig(request: productsConfigRequest)
299
- self.resolveResponse(response, resolve: resolve, reject: reject)
300
- } catch {
301
- reject("Error", error.localizedDescription, error)
302
- }
87
+
88
+ @objc(authenticate:withResolver:withRejecter:)
89
+ func authenticate(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
90
+ guard let authenticationRequest = request.toAuthenticationRequest() else {
91
+ reject("Error", "Invalid request data", nil)
92
+ return
93
+ }
94
+
95
+ Task {
96
+ do {
97
+ let response = try await SmileID.api.authenticate(request: authenticationRequest)
98
+ self.resolveResponse(response, resolve: resolve, reject: reject)
99
+ } catch {
100
+ reject("Error", error.localizedDescription, error)
101
+ }
102
+ }
303
103
  }
304
- }
305
-
306
- @objc(getValidDocuments:withResolver:withRejecter:)
307
- func getValidDocuments(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
308
- guard let validDocumentsRequest = request.toProductsConfigRequest() else {
309
- reject("Error", "Invalid valid documents request", nil)
310
- return
104
+
105
+ @objc(prepUpload:withResolver:withRejecter:)
106
+ func prepUpload(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
107
+ guard let prepUploadRequest = request.toPrepUploadRequest() else {
108
+ reject("Error", "Invalid prep upload request", nil)
109
+ return
110
+ }
111
+
112
+ Task {
113
+ do {
114
+ let response = try await SmileID.api.prepUpload(request: prepUploadRequest)
115
+ self.resolveResponse(response, resolve: resolve, reject: reject)
116
+ } catch {
117
+ reject("Error", error.localizedDescription, error)
118
+ }
119
+ }
311
120
  }
312
-
313
- Task {
314
- do {
315
- let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
316
- self.resolveResponse(response, resolve: resolve, reject: reject)
317
- } catch {
318
- reject("Error", error.localizedDescription, error)
319
- }
121
+
122
+ @objc(upload:request:withResolver:withRejecter:)
123
+ func upload(url: String, request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
124
+ guard let uploadRequest = request.toUploadRequest() else {
125
+ reject("Error", "Invalid upload request", nil)
126
+ return
127
+ }
128
+
129
+ guard let zipData = try? LocalStorage.toZip(uploadRequest: uploadRequest) else {
130
+ reject("Error", "Unable to zip file", nil)
131
+ return
132
+ }
133
+ Task {
134
+ do {
135
+ try await SmileID.api.upload(zip: zipData, to: url)
136
+ resolve(nil)
137
+ } catch {
138
+ reject("Error", error.localizedDescription, error)
139
+ }
140
+ }
320
141
  }
321
- }
322
-
323
- @objc(getServicesWithResolver:withRejecter:)
324
- func getServices(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
325
- Task {
326
- do {
327
- let response = try await SmileID.api.getServices()
328
- self.resolveResponse(response, resolve: resolve, reject: reject)
329
- } catch {
330
- reject("Error", error.localizedDescription, error)
331
- }
142
+
143
+ @objc(doEnhancedKyc:withResolver:withRejecter:)
144
+ func doEnhancedKyc(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
145
+ guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
146
+ reject("doEnhancedKyc", "partnerParams is required", nil)
147
+ return
148
+ }
149
+ guard let partnerParams = partnerParamsDict.toPartnerParams() else {
150
+ reject("doEnhancedKyc", "partnerParams is missing required data", nil)
151
+ return
152
+ }
153
+ guard let country = request["country"] as? String else {
154
+ reject("doEnhancedKyc", "country is required", nil)
155
+ return
156
+ }
157
+ guard let idType = request["idType"] as? String else {
158
+ reject("doEnhancedKyc", "idType is required", nil)
159
+ return
160
+ }
161
+ guard let idNumber = request["idNumber"] as? String else {
162
+ reject("doEnhancedKyc", "idNumber is required", nil)
163
+ return
164
+ }
165
+ guard let timestamp = request["timestamp"] as? String else {
166
+ reject("doEnhancedKyc", "timestamp is required", nil)
167
+ return
168
+ }
169
+ guard let signature = request["signature"] as? String else {
170
+ reject("doEnhancedKyc", "signature is required", nil)
171
+ return
172
+ }
173
+
174
+ guard let consentInformation = request["consentInformation"] as? NSDictionary else {
175
+ reject("doEnhancedKyc", "consentInformation is required", nil)
176
+ return
177
+ }
178
+
179
+ let request = EnhancedKycRequest(
180
+ country: country,
181
+ idType: idType,
182
+ idNumber: idNumber,
183
+ consentInformation: consentInformation.toConsentInfo(),
184
+ firstName: request["firstName"] as? String,
185
+ middleName: request["middleName"] as? String,
186
+ lastName: request["lastName"] as? String,
187
+ dob: request["dob"] as? String,
188
+ phoneNumber: request["phoneNumber"] as? String,
189
+ bankCode: request["bankCode"] as? String,
190
+ callbackUrl: request["callbackUrl"] as? String,
191
+ partnerParams: partnerParams,
192
+ sourceSdk: "ios (react-native)",
193
+ timestamp: timestamp,
194
+ signature: signature
195
+ )
196
+
197
+ Task {
198
+ do {
199
+ let response = try await SmileID.api.doEnhancedKyc(request: request)
200
+ let encoder = JSONEncoder()
201
+ guard let jsonData = try? encoder.encode(response) else {
202
+ throw SmileIDError.unknown("doEnhancedKyc encoding error")
203
+ }
204
+ // Assuming you have a method to convert response to a dictionary
205
+ resolve(["result": String(data: jsonData, encoding: .utf8)!])
206
+ } catch {
207
+ reject("Error", error.localizedDescription, error)
208
+ }
209
+ }
332
210
  }
333
- }
334
-
335
- @objc(getJobStatus:withResolver:withRejecter:)
336
- func getJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
337
- guard let jobStatusRequest = request.toJobStatusRequest() else {
338
- reject("Error", "Invalid job status request", nil)
339
- return
211
+
212
+ @objc(doEnhancedKycAsync:withResolver:withRejecter:)
213
+ func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
214
+ guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
215
+ reject("doEnhancedKyc", "partnerParams is required", nil)
216
+ return
217
+ }
218
+ guard let partnerParams = partnerParamsDict.toPartnerParams() else {
219
+ reject("doEnhancedKyc", "partnerParams is missing required data", nil)
220
+ return
221
+ }
222
+ guard let country = request["country"] as? String else {
223
+ reject("doEnhancedKyc", "country is required", nil)
224
+ return
225
+ }
226
+ guard let idType = request["idType"] as? String else {
227
+ reject("doEnhancedKyc", "idType is required", nil)
228
+ return
229
+ }
230
+ guard let idNumber = request["idNumber"] as? String else {
231
+ reject("doEnhancedKyc", "idNumber is required", nil)
232
+ return
233
+ }
234
+ guard let timestamp = request["timestamp"] as? String else {
235
+ reject("doEnhancedKyc", "timestamp is required", nil)
236
+ return
237
+ }
238
+ guard let signature = request["signature"] as? String else {
239
+ reject("doEnhancedKyc", "signature is required", nil)
240
+ return
241
+ }
242
+
243
+ guard let consentInformation = request["consentInformation"] as? NSDictionary else {
244
+ reject("doEnhancedKyc", "consentInformation is required", nil)
245
+ return
246
+ }
247
+
248
+ let request = EnhancedKycRequest(
249
+ country: country,
250
+ idType: idType,
251
+ idNumber: idNumber,
252
+ consentInformation: consentInformation.toConsentInfo(),
253
+ firstName: request["firstName"] as? String,
254
+ middleName: request["middleName"] as? String,
255
+ lastName: request["lastName"] as? String,
256
+ dob: request["dob"] as? String,
257
+ phoneNumber: request["phoneNumber"] as? String,
258
+ bankCode: request["bankCode"] as? String,
259
+ callbackUrl: request["callbackUrl"] as? String,
260
+ partnerParams: partnerParams,
261
+ sourceSdk: "ios (react-native)",
262
+ timestamp: timestamp,
263
+ signature: signature
264
+ )
265
+
266
+ Task {
267
+ do {
268
+ let response = try await SmileID.api.doEnhancedKycAsync(request: request)
269
+ let encoder = JSONEncoder()
270
+ guard let jsonData = try? encoder.encode(response) else {
271
+ throw SmileIDError.unknown("doEnhancedKyc encoding error")
272
+ }
273
+ // Assuming you have a method to convert response to a dictionary
274
+ resolve(["result": String(data: jsonData, encoding: .utf8)!])
275
+ } catch {
276
+ reject("Error", error.localizedDescription, error)
277
+ }
278
+ }
340
279
  }
341
-
342
- Task {
343
- do {
344
- let response = try await SmileID.api.getJobStatus(request: jobStatusRequest)
345
- self.resolveResponse(response, resolve: resolve, reject: reject)
346
- } catch {
347
- reject("Error", error.localizedDescription, error)
348
- }
280
+
281
+ @objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
282
+ func getSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
283
+ getJobStatus(request: request, resolve: resolve, reject: reject)
349
284
  }
350
- }
351
-
352
- @objc(pollSmartSelfieJobStatus:withResolver:withRejecter:)
353
- func pollSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
354
- guard let jobStatusRequest = request.toJobStatusRequest() else {
355
- reject("Error", "Invalid job status request", nil)
356
- return
285
+
286
+ @objc(getDocumentVerificationJobStatus:withResolver:withRejecter:)
287
+ func getDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
288
+ getJobStatus(request: request, resolve: resolve, reject: reject)
357
289
  }
358
-
359
- guard let interval = request["interval"] as? Int64 else {
360
- reject("Error", "interval is required", nil)
361
- return
290
+
291
+ @objc(getBiometricKycJobStatus:withResolver:withRejecter:)
292
+ func getBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
293
+ getJobStatus(request: request, resolve: resolve, reject: reject)
362
294
  }
363
-
364
- guard let numAttempts = request["numAttempts"] as? Int64 else {
365
- reject("Error", "numAttempts is required", nil)
366
- return
295
+
296
+ @objc(getEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
297
+ func getEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
298
+ getJobStatus(request: request, resolve: resolve, reject: reject)
367
299
  }
368
-
369
- pollJobStatus(
370
- apiCall: SmileID.api.pollSmartSelfieJobStatus,
371
- request: jobStatusRequest,
372
- interval: interval,
373
- numAttempts: numAttempts,
374
- resolve: resolve,
375
- reject: reject
376
- )
377
- }
378
-
379
- @objc(pollDocumentVerificationJobStatus:withResolver:withRejecter:)
380
- func pollDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
381
- guard let jobStatusRequest = request.toJobStatusRequest() else {
382
- reject("Error", "Invalid job status request", nil)
383
- return
300
+
301
+ @objc(getProductsConfig:withResolver:withRejecter:)
302
+ func getProductsConfig(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
303
+ guard let productsConfigRequest = request.toProductsConfigRequest() else {
304
+ reject("Error", "Invalid products config request", nil)
305
+ return
306
+ }
307
+
308
+ Task {
309
+ do {
310
+ let response = try await SmileID.api.getProductsConfig(request: productsConfigRequest)
311
+ self.resolveResponse(response, resolve: resolve, reject: reject)
312
+ } catch {
313
+ reject("Error", error.localizedDescription, error)
314
+ }
315
+ }
384
316
  }
385
-
386
- guard let interval = request["interval"] as? Int64 else {
387
- reject("Error", "interval is required", nil)
388
- return
317
+
318
+ @objc(getValidDocuments:withResolver:withRejecter:)
319
+ func getValidDocuments(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
320
+ guard let validDocumentsRequest = request.toProductsConfigRequest() else {
321
+ reject("Error", "Invalid valid documents request", nil)
322
+ return
323
+ }
324
+
325
+ Task {
326
+ do {
327
+ let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
328
+ self.resolveResponse(response, resolve: resolve, reject: reject)
329
+ } catch {
330
+ reject("Error", error.localizedDescription, error)
331
+ }
332
+ }
389
333
  }
390
-
391
- guard let numAttempts = request["numAttempts"] as? Int64 else {
392
- reject("Error", "numAttempts is required", nil)
393
- return
334
+
335
+ @objc(getServicesWithResolver:withRejecter:)
336
+ func getServices(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
337
+ Task {
338
+ do {
339
+ let response = try await SmileID.api.getServices()
340
+ self.resolveResponse(response, resolve: resolve, reject: reject)
341
+ } catch {
342
+ reject("Error", error.localizedDescription, error)
343
+ }
344
+ }
394
345
  }
395
-
396
- pollJobStatus(
397
- apiCall: SmileID.api.pollDocumentVerificationJobStatus,
398
- request: jobStatusRequest,
399
- interval: interval,
400
- numAttempts: numAttempts,
401
- resolve: resolve,
402
- reject: reject
403
- )
404
- }
405
-
406
- @objc(pollBiometricKycJobStatus:withResolver:withRejecter:)
407
- func pollBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
408
- guard let jobStatusRequest = request.toJobStatusRequest() else {
409
- reject("Error", "Invalid job status request", nil)
410
- return
346
+
347
+ @objc(getJobStatus:withResolver:withRejecter:)
348
+ func getJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
349
+ guard let jobStatusRequest = request.toJobStatusRequest() else {
350
+ reject("Error", "Invalid job status request", nil)
351
+ return
352
+ }
353
+
354
+ Task {
355
+ do {
356
+ let response = try await SmileID.api.getJobStatus(request: jobStatusRequest)
357
+ self.resolveResponse(response, resolve: resolve, reject: reject)
358
+ } catch {
359
+ reject("Error", error.localizedDescription, error)
360
+ }
361
+ }
411
362
  }
412
-
413
- guard let interval = request["interval"] as? Int64 else {
414
- reject("Error", "interval is required", nil)
415
- return
363
+
364
+ @objc(pollSmartSelfieJobStatus:withResolver:withRejecter:)
365
+ func pollSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
366
+ guard let jobStatusRequest = request.toJobStatusRequest() else {
367
+ reject("Error", "Invalid job status request", nil)
368
+ return
369
+ }
370
+
371
+ guard let interval = request["interval"] as? Int64 else {
372
+ reject("Error", "interval is required", nil)
373
+ return
374
+ }
375
+
376
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
377
+ reject("Error", "numAttempts is required", nil)
378
+ return
379
+ }
380
+
381
+ pollJobStatus(
382
+ apiCall: SmileID.api.pollSmartSelfieJobStatus,
383
+ request: jobStatusRequest,
384
+ interval: interval,
385
+ numAttempts: numAttempts,
386
+ resolve: resolve,
387
+ reject: reject
388
+ )
416
389
  }
417
-
418
- guard let numAttempts = request["numAttempts"] as? Int64 else {
419
- reject("Error", "numAttempts is required", nil)
420
- return
390
+
391
+ @objc(pollDocumentVerificationJobStatus:withResolver:withRejecter:)
392
+ func pollDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
393
+ guard let jobStatusRequest = request.toJobStatusRequest() else {
394
+ reject("Error", "Invalid job status request", nil)
395
+ return
396
+ }
397
+
398
+ guard let interval = request["interval"] as? Int64 else {
399
+ reject("Error", "interval is required", nil)
400
+ return
401
+ }
402
+
403
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
404
+ reject("Error", "numAttempts is required", nil)
405
+ return
406
+ }
407
+
408
+ pollJobStatus(
409
+ apiCall: SmileID.api.pollDocumentVerificationJobStatus,
410
+ request: jobStatusRequest,
411
+ interval: interval,
412
+ numAttempts: numAttempts,
413
+ resolve: resolve,
414
+ reject: reject
415
+ )
421
416
  }
422
-
423
- pollJobStatus(
424
- apiCall: SmileID.api.pollBiometricKycJobStatus,
425
- request: jobStatusRequest,
426
- interval: interval,
427
- numAttempts: numAttempts,
428
- resolve: resolve,
429
- reject: reject
430
- )
431
- }
432
-
433
- @objc(pollEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
434
- func pollEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
435
- guard let jobStatusRequest = request.toJobStatusRequest() else {
436
- reject("Error", "Invalid job status request", nil)
437
- return
417
+
418
+ @objc(pollBiometricKycJobStatus:withResolver:withRejecter:)
419
+ func pollBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
420
+ guard let jobStatusRequest = request.toJobStatusRequest() else {
421
+ reject("Error", "Invalid job status request", nil)
422
+ return
423
+ }
424
+
425
+ guard let interval = request["interval"] as? Int64 else {
426
+ reject("Error", "interval is required", nil)
427
+ return
428
+ }
429
+
430
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
431
+ reject("Error", "numAttempts is required", nil)
432
+ return
433
+ }
434
+
435
+ pollJobStatus(
436
+ apiCall: SmileID.api.pollBiometricKycJobStatus,
437
+ request: jobStatusRequest,
438
+ interval: interval,
439
+ numAttempts: numAttempts,
440
+ resolve: resolve,
441
+ reject: reject
442
+ )
438
443
  }
439
-
440
- guard let interval = request["interval"] as? Int64 else {
441
- reject("Error", "interval is required", nil)
442
- return
444
+
445
+ @objc(pollEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
446
+ func pollEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
447
+ guard let jobStatusRequest = request.toJobStatusRequest() else {
448
+ reject("Error", "Invalid job status request", nil)
449
+ return
450
+ }
451
+
452
+ guard let interval = request["interval"] as? Int64 else {
453
+ reject("Error", "interval is required", nil)
454
+ return
455
+ }
456
+
457
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
458
+ reject("Error", "numAttempts is required", nil)
459
+ return
460
+ }
461
+
462
+ pollJobStatus(
463
+ apiCall: SmileID.api.pollEnhancedDocumentVerificationJobStatus,
464
+ request: jobStatusRequest,
465
+ interval: interval,
466
+ numAttempts: numAttempts,
467
+ resolve: resolve,
468
+ reject: reject
469
+ )
443
470
  }
444
-
445
- guard let numAttempts = request["numAttempts"] as? Int64 else {
446
- reject("Error", "numAttempts is required", nil)
447
- return
471
+
472
+ func pollJobStatus<RequestType, T: JobResult>(
473
+ apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
474
+ request: RequestType,
475
+ interval: Int64,
476
+ numAttempts: Int64,
477
+ resolve: @escaping RCTPromiseResolveBlock,
478
+ reject: @escaping RCTPromiseRejectBlock
479
+ ) {
480
+ let timeInterval = convertToTimeInterval(milliSeconds: interval)
481
+ guard let numAttemptsInt = Int(exactly: numAttempts) else {
482
+ reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
483
+ return
484
+ }
485
+
486
+ Task {
487
+ do {
488
+ let pollStream = try await apiCall(request, timeInterval, numAttemptsInt)
489
+ var result: JobStatusResponse<T>? = nil
490
+
491
+ for try await res in pollStream {
492
+ result = res
493
+ }
494
+ if let finalResult = result {
495
+ self.resolveResponse(finalResult, resolve: resolve, reject: reject)
496
+ } else {
497
+ reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
498
+ }
499
+ } catch {
500
+ reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
501
+ }
502
+ }
448
503
  }
449
-
450
- pollJobStatus(
451
- apiCall: SmileID.api.pollEnhancedDocumentVerificationJobStatus,
452
- request: jobStatusRequest,
453
- interval: interval,
454
- numAttempts: numAttempts,
455
- resolve: resolve,
456
- reject: reject
457
- )
458
- }
459
-
460
- func pollJobStatus<RequestType, T: JobResult>(
461
- apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
462
- request: RequestType,
463
- interval: Int64,
464
- numAttempts: Int64,
465
- resolve: @escaping RCTPromiseResolveBlock,
466
- reject: @escaping RCTPromiseRejectBlock
467
- ) {
468
- let timeInterval = convertToTimeInterval(milliSeconds: interval)
469
- guard let numAttemptsInt = Int(exactly: numAttempts) else {
470
- reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
471
- return
504
+
505
+ func convertToTimeInterval(milliSeconds: Int64) -> TimeInterval {
506
+ let seconds = milliSeconds / 1000
507
+ return TimeInterval(seconds)
472
508
  }
473
-
474
- Task {
475
- do {
476
- let pollStream = try await apiCall(request, timeInterval, numAttemptsInt)
477
- var result: JobStatusResponse<T>? = nil
478
-
479
- for try await res in pollStream {
480
- result = res
481
- }
482
- if let finalResult = result {
483
- self.resolveResponse(finalResult, resolve: resolve, reject: reject)
484
- } else {
485
- reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
509
+
510
+ private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
511
+ let encoder = JSONEncoder()
512
+ guard let jsonData = try? encoder.encode(response) else {
513
+ reject("Error", "Encoding error", nil)
514
+ return
486
515
  }
487
- } catch {
488
- reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
489
- }
490
- }
491
- }
492
-
493
-
494
- func convertToTimeInterval(milliSeconds:Int64) -> TimeInterval {
495
- let seconds = milliSeconds/1000
496
- return TimeInterval(seconds)
497
- }
498
-
499
- private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
500
- let encoder = JSONEncoder()
501
- guard let jsonData = try? encoder.encode(response) else {
502
- reject("Error", "Encoding error", nil)
503
- return
516
+ resolve(String(data: jsonData, encoding: .utf8) ?? "")
504
517
  }
505
- resolve(String(data: jsonData, encoding: .utf8) ?? "")
506
- }
507
518
  }