@smile_identity/react-native 10.2.4-beta.1 → 10.2.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 (34) hide show
  1. package/ios/RNDelegates/SmileIDUIViewDelegate.swift +2 -0
  2. package/ios/RNSmileID.swift +470 -471
  3. package/ios/Utils/FileUtils.swift +17 -17
  4. package/ios/Utils/SmileIDDictExt.swift +14 -9
  5. package/ios/View/BaseSmileIDView.swift +6 -5
  6. package/ios/View/SmileIDBiometricKYCView.swift +54 -54
  7. package/ios/View/SmileIDConsentView.swift +2 -1
  8. package/ios/View/SmileIDDocumentCaptureView.swift +64 -64
  9. package/ios/View/SmileIDDocumentVerificationView.swift +51 -51
  10. package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +51 -50
  11. package/ios/View/SmileIDSmartSelfieAuthEnhancedView.swift +34 -33
  12. package/ios/View/SmileIDSmartSelfieAuthView.swift +35 -34
  13. package/ios/View/SmileIDSmartSelfieCaptureView.swift +55 -55
  14. package/ios/View/SmileIDSmartSelfieEnrollmentEnhancedView.swift +35 -34
  15. package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +37 -36
  16. package/ios/ViewManagers/SmileIDBaseViewManager.swift +38 -25
  17. package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +24 -24
  18. package/ios/ViewManagers/SmileIDConsentViewManager.swift +2 -2
  19. package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +19 -19
  20. package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +40 -40
  21. package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +40 -40
  22. package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.swift +16 -16
  23. package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +20 -20
  24. package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +27 -26
  25. package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.swift +16 -16
  26. package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +20 -20
  27. package/ios/ViewModels/SmileIDProductModel.swift +5 -5
  28. package/lib/commonjs/useSmileIDView.js +16 -6
  29. package/lib/commonjs/useSmileIDView.js.map +1 -1
  30. package/lib/module/useSmileIDView.js +17 -7
  31. package/lib/module/useSmileIDView.js.map +1 -1
  32. package/lib/typescript/useSmileIDView.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/useSmileIDView.tsx +17 -9
@@ -2,506 +2,505 @@ 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
- }
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
56
  }
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
+ 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")
197
+ }
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
+ }
332
204
  }
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
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
235
+ }
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")
260
+ }
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
+ }
340
267
  }
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
- }
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)
349
272
  }
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
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)
357
277
  }
358
-
359
- guard let interval = request["interval"] as? Int64 else {
360
- reject("Error", "interval is required", nil)
361
- return
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)
362
282
  }
363
-
364
- guard let numAttempts = request["numAttempts"] as? Int64 else {
365
- reject("Error", "numAttempts is required", nil)
366
- return
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)
367
287
  }
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
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
294
+ }
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
+ }
303
+ }
384
304
  }
385
-
386
- guard let interval = request["interval"] as? Int64 else {
387
- reject("Error", "interval is required", nil)
388
- return
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
311
+ }
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
+ }
320
+ }
389
321
  }
390
-
391
- guard let numAttempts = request["numAttempts"] as? Int64 else {
392
- reject("Error", "numAttempts is required", nil)
393
- return
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
+ }
332
+ }
394
333
  }
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
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
340
+ }
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
+ }
349
+ }
411
350
  }
412
-
413
- guard let interval = request["interval"] as? Int64 else {
414
- reject("Error", "interval is required", nil)
415
- return
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
357
+ }
358
+
359
+ guard let interval = request["interval"] as? Int64 else {
360
+ reject("Error", "interval is required", nil)
361
+ return
362
+ }
363
+
364
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
365
+ reject("Error", "numAttempts is required", nil)
366
+ return
367
+ }
368
+
369
+ pollJobStatus(
370
+ apiCall: SmileID.api.pollSmartSelfieJobStatus,
371
+ request: jobStatusRequest,
372
+ interval: interval,
373
+ numAttempts: numAttempts,
374
+ resolve: resolve,
375
+ reject: reject
376
+ )
416
377
  }
417
-
418
- guard let numAttempts = request["numAttempts"] as? Int64 else {
419
- reject("Error", "numAttempts is required", nil)
420
- return
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
384
+ }
385
+
386
+ guard let interval = request["interval"] as? Int64 else {
387
+ reject("Error", "interval is required", nil)
388
+ return
389
+ }
390
+
391
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
392
+ reject("Error", "numAttempts is required", nil)
393
+ return
394
+ }
395
+
396
+ pollJobStatus(
397
+ apiCall: SmileID.api.pollDocumentVerificationJobStatus,
398
+ request: jobStatusRequest,
399
+ interval: interval,
400
+ numAttempts: numAttempts,
401
+ resolve: resolve,
402
+ reject: reject
403
+ )
421
404
  }
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
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
411
+ }
412
+
413
+ guard let interval = request["interval"] as? Int64 else {
414
+ reject("Error", "interval is required", nil)
415
+ return
416
+ }
417
+
418
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
419
+ reject("Error", "numAttempts is required", nil)
420
+ return
421
+ }
422
+
423
+ pollJobStatus(
424
+ apiCall: SmileID.api.pollBiometricKycJobStatus,
425
+ request: jobStatusRequest,
426
+ interval: interval,
427
+ numAttempts: numAttempts,
428
+ resolve: resolve,
429
+ reject: reject
430
+ )
438
431
  }
439
-
440
- guard let interval = request["interval"] as? Int64 else {
441
- reject("Error", "interval is required", nil)
442
- return
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
438
+ }
439
+
440
+ guard let interval = request["interval"] as? Int64 else {
441
+ reject("Error", "interval is required", nil)
442
+ return
443
+ }
444
+
445
+ guard let numAttempts = request["numAttempts"] as? Int64 else {
446
+ reject("Error", "numAttempts is required", nil)
447
+ return
448
+ }
449
+
450
+ pollJobStatus(
451
+ apiCall: SmileID.api.pollEnhancedDocumentVerificationJobStatus,
452
+ request: jobStatusRequest,
453
+ interval: interval,
454
+ numAttempts: numAttempts,
455
+ resolve: resolve,
456
+ reject: reject
457
+ )
443
458
  }
444
-
445
- guard let numAttempts = request["numAttempts"] as? Int64 else {
446
- reject("Error", "numAttempts is required", nil)
447
- return
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
472
+ }
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))
486
+ }
487
+ } catch {
488
+ reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
489
+ }
490
+ }
448
491
  }
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
492
+
493
+ func convertToTimeInterval(milliSeconds: Int64) -> TimeInterval {
494
+ let seconds = milliSeconds / 1000
495
+ return TimeInterval(seconds)
472
496
  }
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))
497
+
498
+ private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
499
+ let encoder = JSONEncoder()
500
+ guard let jsonData = try? encoder.encode(response) else {
501
+ reject("Error", "Encoding error", nil)
502
+ return
486
503
  }
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
504
+ resolve(String(data: jsonData, encoding: .utf8) ?? "")
504
505
  }
505
- resolve(String(data: jsonData, encoding: .utf8) ?? "")
506
- }
507
506
  }