@smile_identity/react-native 10.2.4-beta.1 → 10.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +2 -1
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/smileidentity/react/Mapper.kt +1 -1
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +2 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +2 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +2 -0
- package/ios/RNDelegates/SmileIDUIViewDelegate.swift +2 -0
- package/ios/RNSmileID.swift +482 -471
- package/ios/Utils/FileUtils.swift +17 -17
- package/ios/Utils/SmileIDDictExt.swift +29 -9
- package/ios/Utils/SmileIDUtils.swift +9 -0
- package/ios/View/BaseSmileIDView.swift +6 -5
- package/ios/View/SmileIDBiometricKYCView.swift +56 -54
- package/ios/View/SmileIDConsentView.swift +3 -2
- package/ios/View/SmileIDDocumentCaptureView.swift +64 -64
- package/ios/View/SmileIDDocumentVerificationView.swift +52 -51
- package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +53 -50
- package/ios/View/SmileIDSmartSelfieAuthEnhancedView.swift +34 -33
- package/ios/View/SmileIDSmartSelfieAuthView.swift +35 -34
- package/ios/View/SmileIDSmartSelfieCaptureView.swift +55 -55
- package/ios/View/SmileIDSmartSelfieEnrollmentEnhancedView.swift +35 -34
- package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +37 -36
- package/ios/ViewManagers/SmileIDBaseViewManager.swift +38 -25
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +30 -24
- package/ios/ViewManagers/SmileIDConsentViewManager.swift +2 -2
- package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +19 -19
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +41 -40
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +47 -40
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.swift +16 -16
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +20 -20
- package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +27 -26
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.swift +16 -16
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +20 -20
- package/ios/ViewModels/SmileIDProductModel.swift +7 -5
- package/lib/commonjs/SmileIDBiometricKYCView.js +2 -11
- package/lib/commonjs/SmileIDBiometricKYCView.js.map +1 -1
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js +2 -11
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +31 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/useSmileIDView.js +16 -6
- package/lib/commonjs/useSmileIDView.js.map +1 -1
- package/lib/module/SmileIDBiometricKYCView.js +2 -11
- package/lib/module/SmileIDBiometricKYCView.js.map +1 -1
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js +2 -11
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +29 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/useSmileIDView.js +17 -7
- package/lib/module/useSmileIDView.js.map +1 -1
- package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +1 -1
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts +2 -2
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +2 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +17 -3
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/useSmileIDView.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-smile-id.podspec +1 -1
- package/src/SmileIDBiometricKYCView.tsx +2 -9
- package/src/SmileIDEnhancedDocumentVerificationView.tsx +6 -16
- package/src/index.tsx +2 -0
- package/src/types.ts +62 -3
- package/src/useSmileIDView.tsx +17 -9
package/ios/RNSmileID.swift
CHANGED
|
@@ -2,506 +2,517 @@ 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
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
dob: request["dob"] as? String,
|
|
182
|
-
phoneNumber: request["phoneNumber"] as? String,
|
|
183
|
-
bankCode: request["bankCode"] as? String,
|
|
184
|
-
callbackUrl: request["callbackUrl"] as? String,
|
|
185
|
-
partnerParams: partnerParams,
|
|
186
|
-
sourceSdk: "ios (react-native)",
|
|
187
|
-
timestamp: timestamp,
|
|
188
|
-
signature: signature
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
Task {
|
|
192
|
-
do {
|
|
193
|
-
let response = try await SmileID.api.doEnhancedKyc(request: request)
|
|
194
|
-
let encoder = JSONEncoder()
|
|
195
|
-
guard let jsonData = try? encoder.encode(response) else {
|
|
196
|
-
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
47
|
+
|
|
48
|
+
@objc(submitJob:withResolver:withRejecter:)
|
|
49
|
+
func submitJob(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
50
|
+
do {
|
|
51
|
+
try SmileID.submitJob(jobId: jobId)
|
|
52
|
+
resolve(nil)
|
|
53
|
+
} catch let error as NSError {
|
|
54
|
+
reject("Error", error.localizedDescription, error)
|
|
197
55
|
}
|
|
198
|
-
// Assuming you have a method to convert response to a dictionary
|
|
199
|
-
resolve(["result": String(data: jsonData, encoding: .utf8)!])
|
|
200
|
-
} catch {
|
|
201
|
-
reject("Error", error.localizedDescription, error)
|
|
202
|
-
}
|
|
203
56
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
214
|
-
return
|
|
215
|
-
}
|
|
216
|
-
guard let country = request["country"] as? String else {
|
|
217
|
-
reject("doEnhancedKyc", "country is required", nil)
|
|
218
|
-
return
|
|
219
|
-
}
|
|
220
|
-
guard let idType = request["idType"] as? String else {
|
|
221
|
-
reject("doEnhancedKyc", "idType is required", nil)
|
|
222
|
-
return
|
|
223
|
-
}
|
|
224
|
-
guard let idNumber = request["idNumber"] as? String else {
|
|
225
|
-
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
226
|
-
return
|
|
227
|
-
}
|
|
228
|
-
guard let timestamp = request["timestamp"] as? String else {
|
|
229
|
-
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
230
|
-
return
|
|
231
|
-
}
|
|
232
|
-
guard let signature = request["signature"] as? String else {
|
|
233
|
-
reject("doEnhancedKyc", "signature is required", nil)
|
|
234
|
-
return
|
|
57
|
+
|
|
58
|
+
@objc(getSubmittedJobs:withRejecter:)
|
|
59
|
+
func getSubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
60
|
+
do {
|
|
61
|
+
let jobs: [String] = SmileID.getUnsubmittedJobs()
|
|
62
|
+
resolve(jobs)
|
|
63
|
+
} catch let error as NSError {
|
|
64
|
+
reject("Error", error.localizedDescription, error)
|
|
65
|
+
}
|
|
235
66
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
297
|
-
|
|
298
|
-
let
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
let
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
142
|
+
|
|
143
|
+
@objc(doEnhancedKyc:withResolver:withRejecter:)
|
|
144
|
+
func doEnhancedKyc(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
145
|
+
guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
|
|
146
|
+
reject("doEnhancedKyc", "partnerParams is required", nil)
|
|
147
|
+
return
|
|
148
|
+
}
|
|
149
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
150
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
guard let country = request["country"] as? String else {
|
|
154
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
155
|
+
return
|
|
156
|
+
}
|
|
157
|
+
guard let idType = request["idType"] as? String else {
|
|
158
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
159
|
+
return
|
|
160
|
+
}
|
|
161
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
162
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
163
|
+
return
|
|
164
|
+
}
|
|
165
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
166
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
guard let signature = request["signature"] as? String else {
|
|
170
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
171
|
+
return
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
guard let consentInformation = request["consentInformation"] as? NSDictionary else {
|
|
175
|
+
reject("doEnhancedKyc", "consentInformation is required", nil)
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let request = EnhancedKycRequest(
|
|
180
|
+
country: country,
|
|
181
|
+
idType: idType,
|
|
182
|
+
idNumber: idNumber,
|
|
183
|
+
consentInformation: consentInformation.toConsentInfo(),
|
|
184
|
+
firstName: request["firstName"] as? String,
|
|
185
|
+
middleName: request["middleName"] as? String,
|
|
186
|
+
lastName: request["lastName"] as? String,
|
|
187
|
+
dob: request["dob"] as? String,
|
|
188
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
189
|
+
bankCode: request["bankCode"] as? String,
|
|
190
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
191
|
+
partnerParams: partnerParams,
|
|
192
|
+
sourceSdk: "ios (react-native)",
|
|
193
|
+
timestamp: timestamp,
|
|
194
|
+
signature: signature
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
Task {
|
|
198
|
+
do {
|
|
199
|
+
let response = try await SmileID.api.doEnhancedKyc(request: request)
|
|
200
|
+
let encoder = JSONEncoder()
|
|
201
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
202
|
+
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
203
|
+
}
|
|
204
|
+
// Assuming you have a method to convert response to a dictionary
|
|
205
|
+
resolve(["result": String(data: jsonData, encoding: .utf8)!])
|
|
206
|
+
} catch {
|
|
207
|
+
reject("Error", error.localizedDescription, error)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
332
210
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
211
|
+
|
|
212
|
+
@objc(doEnhancedKycAsync:withResolver:withRejecter:)
|
|
213
|
+
func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
214
|
+
guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
|
|
215
|
+
reject("doEnhancedKyc", "partnerParams is required", nil)
|
|
216
|
+
return
|
|
217
|
+
}
|
|
218
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
219
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
220
|
+
return
|
|
221
|
+
}
|
|
222
|
+
guard let country = request["country"] as? String else {
|
|
223
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
|
+
guard let idType = request["idType"] as? String else {
|
|
227
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
228
|
+
return
|
|
229
|
+
}
|
|
230
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
231
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
232
|
+
return
|
|
233
|
+
}
|
|
234
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
235
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
guard let signature = request["signature"] as? String else {
|
|
239
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
240
|
+
return
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
guard let consentInformation = request["consentInformation"] as? NSDictionary else {
|
|
244
|
+
reject("doEnhancedKyc", "consentInformation is required", nil)
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
let request = EnhancedKycRequest(
|
|
249
|
+
country: country,
|
|
250
|
+
idType: idType,
|
|
251
|
+
idNumber: idNumber,
|
|
252
|
+
consentInformation: consentInformation.toConsentInfo(),
|
|
253
|
+
firstName: request["firstName"] as? String,
|
|
254
|
+
middleName: request["middleName"] as? String,
|
|
255
|
+
lastName: request["lastName"] as? String,
|
|
256
|
+
dob: request["dob"] as? String,
|
|
257
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
258
|
+
bankCode: request["bankCode"] as? String,
|
|
259
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
260
|
+
partnerParams: partnerParams,
|
|
261
|
+
sourceSdk: "ios (react-native)",
|
|
262
|
+
timestamp: timestamp,
|
|
263
|
+
signature: signature
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
Task {
|
|
267
|
+
do {
|
|
268
|
+
let response = try await SmileID.api.doEnhancedKycAsync(request: request)
|
|
269
|
+
let encoder = JSONEncoder()
|
|
270
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
271
|
+
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
272
|
+
}
|
|
273
|
+
// Assuming you have a method to convert response to a dictionary
|
|
274
|
+
resolve(["result": String(data: jsonData, encoding: .utf8)!])
|
|
275
|
+
} catch {
|
|
276
|
+
reject("Error", error.localizedDescription, error)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
340
279
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
346
|
-
} catch {
|
|
347
|
-
reject("Error", error.localizedDescription, error)
|
|
348
|
-
}
|
|
280
|
+
|
|
281
|
+
@objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
|
|
282
|
+
func getSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
283
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
349
284
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
355
|
-
reject("Error", "Invalid job status request", nil)
|
|
356
|
-
return
|
|
285
|
+
|
|
286
|
+
@objc(getDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
287
|
+
func getDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
288
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
357
289
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
290
|
+
|
|
291
|
+
@objc(getBiometricKycJobStatus:withResolver:withRejecter:)
|
|
292
|
+
func getBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
293
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
362
294
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
295
|
+
|
|
296
|
+
@objc(getEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
297
|
+
func getEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
298
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
367
299
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
300
|
+
|
|
301
|
+
@objc(getProductsConfig:withResolver:withRejecter:)
|
|
302
|
+
func getProductsConfig(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
303
|
+
guard let productsConfigRequest = request.toProductsConfigRequest() else {
|
|
304
|
+
reject("Error", "Invalid products config request", nil)
|
|
305
|
+
return
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
Task {
|
|
309
|
+
do {
|
|
310
|
+
let response = try await SmileID.api.getProductsConfig(request: productsConfigRequest)
|
|
311
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
312
|
+
} catch {
|
|
313
|
+
reject("Error", error.localizedDescription, error)
|
|
314
|
+
}
|
|
315
|
+
}
|
|
384
316
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
317
|
+
|
|
318
|
+
@objc(getValidDocuments:withResolver:withRejecter:)
|
|
319
|
+
func getValidDocuments(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
320
|
+
guard let validDocumentsRequest = request.toProductsConfigRequest() else {
|
|
321
|
+
reject("Error", "Invalid valid documents request", nil)
|
|
322
|
+
return
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
Task {
|
|
326
|
+
do {
|
|
327
|
+
let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
|
|
328
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
329
|
+
} catch {
|
|
330
|
+
reject("Error", error.localizedDescription, error)
|
|
331
|
+
}
|
|
332
|
+
}
|
|
389
333
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
334
|
+
|
|
335
|
+
@objc(getServicesWithResolver:withRejecter:)
|
|
336
|
+
func getServices(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
337
|
+
Task {
|
|
338
|
+
do {
|
|
339
|
+
let response = try await SmileID.api.getServices()
|
|
340
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
341
|
+
} catch {
|
|
342
|
+
reject("Error", error.localizedDescription, error)
|
|
343
|
+
}
|
|
344
|
+
}
|
|
394
345
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
346
|
+
|
|
347
|
+
@objc(getJobStatus:withResolver:withRejecter:)
|
|
348
|
+
func getJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
349
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
350
|
+
reject("Error", "Invalid job status request", nil)
|
|
351
|
+
return
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
Task {
|
|
355
|
+
do {
|
|
356
|
+
let response = try await SmileID.api.getJobStatus(request: jobStatusRequest)
|
|
357
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
358
|
+
} catch {
|
|
359
|
+
reject("Error", error.localizedDescription, error)
|
|
360
|
+
}
|
|
361
|
+
}
|
|
411
362
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
363
|
+
|
|
364
|
+
@objc(pollSmartSelfieJobStatus:withResolver:withRejecter:)
|
|
365
|
+
func pollSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
366
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
367
|
+
reject("Error", "Invalid job status request", nil)
|
|
368
|
+
return
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
372
|
+
reject("Error", "interval is required", nil)
|
|
373
|
+
return
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
377
|
+
reject("Error", "numAttempts is required", nil)
|
|
378
|
+
return
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
pollJobStatus(
|
|
382
|
+
apiCall: SmileID.api.pollSmartSelfieJobStatus,
|
|
383
|
+
request: jobStatusRequest,
|
|
384
|
+
interval: interval,
|
|
385
|
+
numAttempts: numAttempts,
|
|
386
|
+
resolve: resolve,
|
|
387
|
+
reject: reject
|
|
388
|
+
)
|
|
416
389
|
}
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
390
|
+
|
|
391
|
+
@objc(pollDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
392
|
+
func pollDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
393
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
394
|
+
reject("Error", "Invalid job status request", nil)
|
|
395
|
+
return
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
399
|
+
reject("Error", "interval is required", nil)
|
|
400
|
+
return
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
404
|
+
reject("Error", "numAttempts is required", nil)
|
|
405
|
+
return
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
pollJobStatus(
|
|
409
|
+
apiCall: SmileID.api.pollDocumentVerificationJobStatus,
|
|
410
|
+
request: jobStatusRequest,
|
|
411
|
+
interval: interval,
|
|
412
|
+
numAttempts: numAttempts,
|
|
413
|
+
resolve: resolve,
|
|
414
|
+
reject: reject
|
|
415
|
+
)
|
|
421
416
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
417
|
+
|
|
418
|
+
@objc(pollBiometricKycJobStatus:withResolver:withRejecter:)
|
|
419
|
+
func pollBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
420
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
421
|
+
reject("Error", "Invalid job status request", nil)
|
|
422
|
+
return
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
426
|
+
reject("Error", "interval is required", nil)
|
|
427
|
+
return
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
431
|
+
reject("Error", "numAttempts is required", nil)
|
|
432
|
+
return
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
pollJobStatus(
|
|
436
|
+
apiCall: SmileID.api.pollBiometricKycJobStatus,
|
|
437
|
+
request: jobStatusRequest,
|
|
438
|
+
interval: interval,
|
|
439
|
+
numAttempts: numAttempts,
|
|
440
|
+
resolve: resolve,
|
|
441
|
+
reject: reject
|
|
442
|
+
)
|
|
438
443
|
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
444
|
+
|
|
445
|
+
@objc(pollEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
446
|
+
func pollEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
447
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
448
|
+
reject("Error", "Invalid job status request", nil)
|
|
449
|
+
return
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
453
|
+
reject("Error", "interval is required", nil)
|
|
454
|
+
return
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
458
|
+
reject("Error", "numAttempts is required", nil)
|
|
459
|
+
return
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
pollJobStatus(
|
|
463
|
+
apiCall: SmileID.api.pollEnhancedDocumentVerificationJobStatus,
|
|
464
|
+
request: jobStatusRequest,
|
|
465
|
+
interval: interval,
|
|
466
|
+
numAttempts: numAttempts,
|
|
467
|
+
resolve: resolve,
|
|
468
|
+
reject: reject
|
|
469
|
+
)
|
|
443
470
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
471
|
+
|
|
472
|
+
func pollJobStatus<RequestType, T: JobResult>(
|
|
473
|
+
apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
|
|
474
|
+
request: RequestType,
|
|
475
|
+
interval: Int64,
|
|
476
|
+
numAttempts: Int64,
|
|
477
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
478
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
479
|
+
) {
|
|
480
|
+
let timeInterval = convertToTimeInterval(milliSeconds: interval)
|
|
481
|
+
guard let numAttemptsInt = Int(exactly: numAttempts) else {
|
|
482
|
+
reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
|
|
483
|
+
return
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
Task {
|
|
487
|
+
do {
|
|
488
|
+
let pollStream = try await apiCall(request, timeInterval, numAttemptsInt)
|
|
489
|
+
var result: JobStatusResponse<T>? = nil
|
|
490
|
+
|
|
491
|
+
for try await res in pollStream {
|
|
492
|
+
result = res
|
|
493
|
+
}
|
|
494
|
+
if let finalResult = result {
|
|
495
|
+
self.resolveResponse(finalResult, resolve: resolve, reject: reject)
|
|
496
|
+
} else {
|
|
497
|
+
reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
|
|
498
|
+
}
|
|
499
|
+
} catch {
|
|
500
|
+
reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
|
|
501
|
+
}
|
|
502
|
+
}
|
|
448
503
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
interval: interval,
|
|
454
|
-
numAttempts: numAttempts,
|
|
455
|
-
resolve: resolve,
|
|
456
|
-
reject: reject
|
|
457
|
-
)
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
func pollJobStatus<RequestType, T: JobResult>(
|
|
461
|
-
apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
|
|
462
|
-
request: RequestType,
|
|
463
|
-
interval: Int64,
|
|
464
|
-
numAttempts: Int64,
|
|
465
|
-
resolve: @escaping RCTPromiseResolveBlock,
|
|
466
|
-
reject: @escaping RCTPromiseRejectBlock
|
|
467
|
-
) {
|
|
468
|
-
let timeInterval = convertToTimeInterval(milliSeconds: interval)
|
|
469
|
-
guard let numAttemptsInt = Int(exactly: numAttempts) else {
|
|
470
|
-
reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
|
|
471
|
-
return
|
|
504
|
+
|
|
505
|
+
func convertToTimeInterval(milliSeconds: Int64) -> TimeInterval {
|
|
506
|
+
let seconds = milliSeconds / 1000
|
|
507
|
+
return TimeInterval(seconds)
|
|
472
508
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
let
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
for try await res in pollStream {
|
|
480
|
-
result = res
|
|
481
|
-
}
|
|
482
|
-
if let finalResult = result {
|
|
483
|
-
self.resolveResponse(finalResult, resolve: resolve, reject: reject)
|
|
484
|
-
} else {
|
|
485
|
-
reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
|
|
509
|
+
|
|
510
|
+
private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
511
|
+
let encoder = JSONEncoder()
|
|
512
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
513
|
+
reject("Error", "Encoding error", nil)
|
|
514
|
+
return
|
|
486
515
|
}
|
|
487
|
-
|
|
488
|
-
reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
func convertToTimeInterval(milliSeconds:Int64) -> TimeInterval {
|
|
495
|
-
let seconds = milliSeconds/1000
|
|
496
|
-
return TimeInterval(seconds)
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
500
|
-
let encoder = JSONEncoder()
|
|
501
|
-
guard let jsonData = try? encoder.encode(response) else {
|
|
502
|
-
reject("Error", "Encoding error", nil)
|
|
503
|
-
return
|
|
516
|
+
resolve(String(data: jsonData, encoding: .utf8) ?? "")
|
|
504
517
|
}
|
|
505
|
-
resolve(String(data: jsonData, encoding: .utf8) ?? "")
|
|
506
|
-
}
|
|
507
518
|
}
|