@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.
- package/android/build.gradle +4 -1
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +169 -93
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentCaptureView.kt +13 -11
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +32 -45
- package/ios/RNSmileID.swift +469 -460
- package/ios/SmileId.xcodeproj/xcuserdata/japhetndhlovu.xcuserdatad/xcschemes/SmileId.xcscheme +23 -0
- package/ios/SmileId.xcodeproj/xcuserdata/japhetndhlovu.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/View/SmileIDDocumentCaptureView.swift +1 -2
- package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +1 -2
- package/package.json +2 -2
- package/react-native-smile-id.podspec +10 -5
package/ios/RNSmileID.swift
CHANGED
|
@@ -2,523 +2,532 @@ import SmileID
|
|
|
2
2
|
|
|
3
3
|
@objc(RNSmileID)
|
|
4
4
|
class RNSmileID: NSObject {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
315
|
-
|
|
316
|
-
let
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
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
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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
|
-
|
|
405
|
-
|
|
406
|
-
|
|
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
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
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
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
|
|
459
|
-
|
|
460
|
-
|
|
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
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
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
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
386
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
387
|
+
reject("Error", "interval is required", nil)
|
|
388
|
+
return
|
|
389
|
+
}
|
|
496
390
|
|
|
497
|
-
|
|
498
|
-
|
|
391
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
392
|
+
reject("Error", "numAttempts is required", nil)
|
|
393
|
+
return
|
|
499
394
|
}
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
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
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
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
|
}
|