@smile_identity/react-native 11.1.7 → 11.1.8
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/gradle.properties +1 -1
- package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +10 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +2 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDConsentViewManager.kt +0 -1
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentCaptureViewManager.kt +0 -1
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +2 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +2 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationViewManager.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieCaptureViewManager.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentViewManager.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/SmileIDConsentView.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentCaptureView.kt +0 -10
- 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/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +17 -4
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt +1 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +5 -6
- package/android/src/oldarch/SmileIdSpec.kt +2 -0
- package/ios/RNSmileID.mm +1 -0
- package/ios/RNSmileID.swift +511 -497
- package/ios/View/SmileIDBiometricKYCView.swift +2 -0
- package/ios/View/SmileIDDocumentVerificationView.swift +1 -0
- package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +1 -0
- package/ios/View/SmileIDSmartSelfieAuthView.swift +1 -0
- package/ios/View/SmileIDSmartSelfieCaptureView.swift +58 -38
- package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +1 -0
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +2 -0
- package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +0 -1
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +1 -0
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +1 -0
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +1 -0
- package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +5 -7
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +1 -0
- package/ios/ViewModels/SmileIDProductModel.swift +2 -0
- package/lib/commonjs/NativeSmileId.js.map +1 -1
- package/lib/commonjs/index.js +8 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/useSmileIDView.js +1 -1
- package/lib/commonjs/useSmileIDView.js.map +1 -1
- package/lib/module/NativeSmileId.js.map +1 -1
- package/lib/module/index.js +9 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useSmileIDView.js +1 -1
- package/lib/module/useSmileIDView.js.map +1 -1
- package/lib/typescript/NativeSmileId.d.ts +8 -1
- package/lib/typescript/NativeSmileId.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +10 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +6 -1
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/react-native-smile-id.podspec +1 -1
- package/src/NativeSmileId.ts +9 -1
- package/src/index.tsx +24 -15
- package/src/types.ts +11 -1
- package/src/useSmileIDView.tsx +1 -1
package/ios/RNSmileID.swift
CHANGED
|
@@ -2,532 +2,546 @@ 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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
resolve(nil)
|
|
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)
|
|
43
40
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
|
|
42
|
+
resolve(nil)
|
|
43
|
+
}
|
|
44
|
+
|
|
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)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@objc(setAllowOfflineMode:withResolver:withRejecter:)
|
|
52
|
+
func setAllowOfflineMode(allowOfflineMode: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
53
|
+
SmileID.setAllowOfflineMode(allowOfflineMode: allowOfflineMode)
|
|
54
|
+
resolve(nil)
|
|
55
|
+
}
|
|
56
|
+
|
|
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)
|
|
49
64
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
}
|
|
66
|
+
|
|
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)
|
|
55
74
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
75
|
+
}
|
|
76
|
+
|
|
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)
|
|
65
84
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
}
|
|
86
|
+
|
|
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)
|
|
75
94
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
reject("Error", error.localizedDescription, error)
|
|
84
|
-
}
|
|
95
|
+
}
|
|
96
|
+
|
|
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
|
|
85
102
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
103
|
+
|
|
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
|
+
}
|
|
95
111
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
}
|
|
112
|
+
}
|
|
113
|
+
|
|
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
|
|
112
119
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
}
|
|
120
|
+
|
|
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
|
+
}
|
|
129
128
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
}
|
|
149
|
-
}
|
|
129
|
+
}
|
|
130
|
+
|
|
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
|
|
150
136
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
}
|
|
182
|
-
|
|
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
|
-
}
|
|
193
|
-
|
|
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
|
-
}
|
|
137
|
+
|
|
138
|
+
guard let zipData = try? LocalStorage.toZip(uploadRequest: uploadRequest) else {
|
|
139
|
+
reject("Error", "Unable to zip file", nil)
|
|
140
|
+
return
|
|
225
141
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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
|
-
}
|
|
257
|
-
|
|
258
|
-
guard let consentInformation = request["consentInformation"] as? NSDictionary else {
|
|
259
|
-
reject("doEnhancedKyc", "consentInformation is required", nil)
|
|
260
|
-
return
|
|
261
|
-
}
|
|
262
|
-
|
|
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
|
-
}
|
|
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
|
+
}
|
|
294
149
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
150
|
+
}
|
|
151
|
+
|
|
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
|
|
299
157
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
158
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
159
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
160
|
+
return
|
|
304
161
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
162
|
+
guard let country = request["country"] as? String else {
|
|
163
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
164
|
+
return
|
|
309
165
|
}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
166
|
+
guard let idType = request["idType"] as? String else {
|
|
167
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
168
|
+
return
|
|
314
169
|
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
guard let productsConfigRequest = request.toProductsConfigRequest() else {
|
|
319
|
-
reject("Error", "Invalid products config request", nil)
|
|
320
|
-
return
|
|
321
|
-
}
|
|
322
|
-
|
|
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
|
-
}
|
|
170
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
171
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
172
|
+
return
|
|
331
173
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
guard let validDocumentsRequest = request.toProductsConfigRequest() else {
|
|
336
|
-
reject("Error", "Invalid valid documents request", nil)
|
|
337
|
-
return
|
|
338
|
-
}
|
|
339
|
-
|
|
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
|
-
}
|
|
174
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
175
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
176
|
+
return
|
|
348
177
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
}
|
|
178
|
+
guard let signature = request["signature"] as? String else {
|
|
179
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
180
|
+
return
|
|
360
181
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
-
}
|
|
182
|
+
|
|
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
|
+
)
|
|
377
192
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
193
|
+
|
|
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")
|
|
394
218
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
numAttempts: numAttempts,
|
|
401
|
-
resolve: resolve,
|
|
402
|
-
reject: reject
|
|
403
|
-
)
|
|
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
|
+
}
|
|
404
224
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
)
|
|
225
|
+
}
|
|
226
|
+
|
|
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
|
|
431
232
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
)
|
|
233
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
234
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
235
|
+
return
|
|
458
236
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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
|
-
)
|
|
237
|
+
guard let country = request["country"] as? String else {
|
|
238
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
239
|
+
return
|
|
485
240
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
-
}
|
|
517
|
-
}
|
|
241
|
+
guard let idType = request["idType"] as? String else {
|
|
242
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
243
|
+
return
|
|
518
244
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
return TimeInterval(seconds)
|
|
245
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
246
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
247
|
+
return
|
|
523
248
|
}
|
|
524
|
-
|
|
525
|
-
|
|
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
|
+
}
|
|
257
|
+
|
|
258
|
+
guard let consentInformation = request["consentInformation"] as? NSDictionary else {
|
|
259
|
+
reject("doEnhancedKyc", "consentInformation is required", nil)
|
|
260
|
+
return
|
|
261
|
+
}
|
|
262
|
+
|
|
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)
|
|
526
284
|
let encoder = JSONEncoder()
|
|
527
285
|
guard let jsonData = try? encoder.encode(response) else {
|
|
528
|
-
|
|
529
|
-
return
|
|
286
|
+
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
530
287
|
}
|
|
531
|
-
|
|
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
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
@objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
|
|
297
|
+
func getSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
298
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
@objc(getDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
302
|
+
func getDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
303
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@objc(getBiometricKycJobStatus:withResolver:withRejecter:)
|
|
307
|
+
func getBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
308
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
@objc(getEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
312
|
+
func getEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
313
|
+
getJobStatus(request: request, resolve: resolve, reject: reject)
|
|
314
|
+
}
|
|
315
|
+
|
|
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
|
+
}
|
|
322
|
+
|
|
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
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
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
|
+
}
|
|
339
|
+
|
|
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
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
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
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
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
|
+
}
|
|
368
|
+
|
|
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
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
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
|
+
}
|
|
385
|
+
|
|
386
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
387
|
+
reject("Error", "interval is required", nil)
|
|
388
|
+
return
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
392
|
+
reject("Error", "numAttempts is required", nil)
|
|
393
|
+
return
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
pollJobStatus(
|
|
397
|
+
apiCall: SmileID.api.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
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
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
|
|
532
530
|
}
|
|
531
|
+
resolve(String(data: jsonData, encoding: .utf8) ?? "")
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
@objc(applyLocalization:withRejecter:)
|
|
535
|
+
func applyLocalization(
|
|
536
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
537
|
+
reject _: @escaping RCTPromiseRejectBlock
|
|
538
|
+
) {
|
|
539
|
+
SmileID.apply(
|
|
540
|
+
SmileIDLocalizableStrings(
|
|
541
|
+
bundle: Bundle.main,
|
|
542
|
+
tablename: "Localizable"
|
|
543
|
+
)
|
|
544
|
+
)
|
|
545
|
+
resolve(nil)
|
|
546
|
+
}
|
|
533
547
|
}
|