@smile_identity/react-native 10.3.3 → 11.0.0

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