@smile_identity/react-native 10.3.2 → 10.3.3
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 +8 -7
- package/android/gradle.properties +1 -3
- package/android/src/main/java/com/smileidentity/react/Mapper.kt +35 -10
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +8 -5
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +7 -4
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +148 -18
- package/ios/RNSmileID.swift +460 -461
- package/ios/Utils/SmileIDDictExt.swift +35 -11
- package/ios/View/SmileIDSmartSelfieCaptureView.swift +38 -10
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +6 -4
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +6 -4
- package/ios/ViewModels/SmileIDProductModel.swift +6 -4
- package/lib/commonjs/index.js +6 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +28 -8
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/index.js +2 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +28 -8
- package/lib/module/types.js.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 +22 -4
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-smile-id.podspec +1 -1
- package/src/index.tsx +2 -0
- package/src/types.ts +41 -13
package/ios/RNSmileID.swift
CHANGED
|
@@ -2,524 +2,523 @@ 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)
|
|
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)
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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)
|
|
40
55
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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)
|
|
46
65
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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)
|
|
56
75
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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)
|
|
66
85
|
}
|
|
86
|
+
}
|
|
67
87
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} catch let error as NSError {
|
|
74
|
-
reject("Error", error.localizedDescription, error)
|
|
75
|
-
}
|
|
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
|
|
76
93
|
}
|
|
77
94
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
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
|
+
}
|
|
86
102
|
}
|
|
103
|
+
}
|
|
87
104
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
}
|
|
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
|
|
103
110
|
}
|
|
104
111
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
}
|
|
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
|
+
}
|
|
120
119
|
}
|
|
120
|
+
}
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
}
|
|
129
|
+
guard let zipData = try? LocalStorage.toZip(uploadRequest: uploadRequest) else {
|
|
130
|
+
reject("Error", "Unable to zip file", nil)
|
|
131
|
+
return
|
|
141
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
|
+
}
|
|
141
|
+
}
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
173
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
174
|
+
let consentInfo: ConsentInformation
|
|
175
|
+
if let consentInformation = request["consentInformation"] as? NSDictionary {
|
|
176
|
+
consentInfo = consentInformation.toConsentInfo()
|
|
177
|
+
} else {
|
|
178
|
+
consentInfo = ConsentInformation(consented: ConsentedInformation(consentGrantedDate: getCurrentIsoTimestamp(),
|
|
179
|
+
personalDetails: false,
|
|
180
|
+
contactInformation: false,
|
|
181
|
+
documentInformation: false)
|
|
182
|
+
)
|
|
183
|
+
}
|
|
185
184
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
// Assuming you have a method to convert response to a dictionary
|
|
212
|
-
resolve(["result": String(data: jsonData, encoding: .utf8)!])
|
|
213
|
-
} catch {
|
|
214
|
-
reject("Error", error.localizedDescription, error)
|
|
215
|
-
}
|
|
185
|
+
let request = EnhancedKycRequest(
|
|
186
|
+
country: country,
|
|
187
|
+
idType: idType,
|
|
188
|
+
idNumber: idNumber,
|
|
189
|
+
consentInformation: consentInfo,
|
|
190
|
+
firstName: request["firstName"] as? String,
|
|
191
|
+
middleName: request["middleName"] as? String,
|
|
192
|
+
lastName: request["lastName"] as? String,
|
|
193
|
+
dob: request["dob"] as? String,
|
|
194
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
195
|
+
bankCode: request["bankCode"] as? String,
|
|
196
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
197
|
+
partnerParams: partnerParams,
|
|
198
|
+
sourceSdk: "ios (react-native)",
|
|
199
|
+
timestamp: timestamp,
|
|
200
|
+
signature: signature
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
Task {
|
|
204
|
+
do {
|
|
205
|
+
let response = try await SmileID.api.doEnhancedKyc(request: request)
|
|
206
|
+
let encoder = JSONEncoder()
|
|
207
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
208
|
+
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
216
209
|
}
|
|
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
|
+
}
|
|
217
215
|
}
|
|
216
|
+
}
|
|
218
217
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
218
|
+
@objc(doEnhancedKycAsync:withResolver:withRejecter:)
|
|
219
|
+
func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
220
|
+
guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
|
|
221
|
+
reject("doEnhancedKyc", "partnerParams is required", nil)
|
|
222
|
+
return
|
|
223
|
+
}
|
|
224
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
225
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
guard let country = request["country"] as? String else {
|
|
229
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
230
|
+
return
|
|
231
|
+
}
|
|
232
|
+
guard let idType = request["idType"] as? String else {
|
|
233
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
234
|
+
return
|
|
235
|
+
}
|
|
236
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
237
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
241
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
guard let signature = request["signature"] as? String else {
|
|
245
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
246
|
+
return
|
|
247
|
+
}
|
|
249
248
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
249
|
+
guard let consentInformation = request["consentInformation"] as? NSDictionary else {
|
|
250
|
+
reject("doEnhancedKyc", "consentInformation is required", nil)
|
|
251
|
+
return
|
|
252
|
+
}
|
|
254
253
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
// Assuming you have a method to convert response to a dictionary
|
|
281
|
-
resolve(["result": String(data: jsonData, encoding: .utf8)!])
|
|
282
|
-
} catch {
|
|
283
|
-
reject("Error", error.localizedDescription, error)
|
|
284
|
-
}
|
|
254
|
+
let request = EnhancedKycRequest(
|
|
255
|
+
country: country,
|
|
256
|
+
idType: idType,
|
|
257
|
+
idNumber: idNumber,
|
|
258
|
+
consentInformation: consentInformation.toConsentInfo(),
|
|
259
|
+
firstName: request["firstName"] as? String,
|
|
260
|
+
middleName: request["middleName"] as? String,
|
|
261
|
+
lastName: request["lastName"] as? String,
|
|
262
|
+
dob: request["dob"] as? String,
|
|
263
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
264
|
+
bankCode: request["bankCode"] as? String,
|
|
265
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
266
|
+
partnerParams: partnerParams,
|
|
267
|
+
sourceSdk: "ios (react-native)",
|
|
268
|
+
timestamp: timestamp,
|
|
269
|
+
signature: signature
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
Task {
|
|
273
|
+
do {
|
|
274
|
+
let response = try await SmileID.api.doEnhancedKycAsync(request: request)
|
|
275
|
+
let encoder = JSONEncoder()
|
|
276
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
277
|
+
throw SmileIDError.unknown("doEnhancedKyc encoding error")
|
|
285
278
|
}
|
|
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
|
+
}
|
|
286
284
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
|
291
312
|
}
|
|
292
313
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
314
|
+
Task {
|
|
315
|
+
do {
|
|
316
|
+
let response = try await SmileID.api.getProductsConfig(request: productsConfigRequest)
|
|
317
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
318
|
+
} catch {
|
|
319
|
+
reject("Error", error.localizedDescription, error)
|
|
320
|
+
}
|
|
296
321
|
}
|
|
322
|
+
}
|
|
297
323
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
324
|
+
@objc(getValidDocuments:withResolver:withRejecter:)
|
|
325
|
+
func getValidDocuments(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
326
|
+
guard let validDocumentsRequest = request.toProductsConfigRequest() else {
|
|
327
|
+
reject("Error", "Invalid valid documents request", nil)
|
|
328
|
+
return
|
|
301
329
|
}
|
|
302
330
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
331
|
+
Task {
|
|
332
|
+
do {
|
|
333
|
+
let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
|
|
334
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
335
|
+
} catch {
|
|
336
|
+
reject("Error", error.localizedDescription, error)
|
|
337
|
+
}
|
|
306
338
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
319
|
-
} catch {
|
|
320
|
-
reject("Error", error.localizedDescription, error)
|
|
321
|
-
}
|
|
322
|
-
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
@objc(getServicesWithResolver:withRejecter:)
|
|
342
|
+
func getServices(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
343
|
+
Task {
|
|
344
|
+
do {
|
|
345
|
+
let response = try await SmileID.api.getServices()
|
|
346
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
347
|
+
} catch {
|
|
348
|
+
reject("Error", error.localizedDescription, error)
|
|
349
|
+
}
|
|
323
350
|
}
|
|
351
|
+
}
|
|
324
352
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
Task {
|
|
333
|
-
do {
|
|
334
|
-
let response = try await SmileID.api.getValidDocuments(request: validDocumentsRequest)
|
|
335
|
-
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
336
|
-
} catch {
|
|
337
|
-
reject("Error", error.localizedDescription, error)
|
|
338
|
-
}
|
|
339
|
-
}
|
|
353
|
+
@objc(getJobStatus:withResolver:withRejecter:)
|
|
354
|
+
func getJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
355
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
356
|
+
reject("Error", "Invalid job status request", nil)
|
|
357
|
+
return
|
|
340
358
|
}
|
|
341
359
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
reject("Error", error.localizedDescription, error)
|
|
350
|
-
}
|
|
351
|
-
}
|
|
360
|
+
Task {
|
|
361
|
+
do {
|
|
362
|
+
let response = try await SmileID.api.getJobStatus(request: jobStatusRequest)
|
|
363
|
+
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
364
|
+
} catch {
|
|
365
|
+
reject("Error", error.localizedDescription, error)
|
|
366
|
+
}
|
|
352
367
|
}
|
|
368
|
+
}
|
|
353
369
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
370
|
+
@objc(pollSmartSelfieJobStatus:withResolver:withRejecter:)
|
|
371
|
+
func pollSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
372
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
373
|
+
reject("Error", "Invalid job status request", nil)
|
|
374
|
+
return
|
|
375
|
+
}
|
|
360
376
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
self.resolveResponse(response, resolve: resolve, reject: reject)
|
|
365
|
-
} catch {
|
|
366
|
-
reject("Error", error.localizedDescription, error)
|
|
367
|
-
}
|
|
368
|
-
}
|
|
377
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
378
|
+
reject("Error", "interval is required", nil)
|
|
379
|
+
return
|
|
369
380
|
}
|
|
370
381
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
return
|
|
376
|
-
}
|
|
382
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
383
|
+
reject("Error", "numAttempts is required", nil)
|
|
384
|
+
return
|
|
385
|
+
}
|
|
377
386
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
387
|
+
pollJobStatus(
|
|
388
|
+
apiCall: SmileID.api.pollSmartSelfieJobStatus,
|
|
389
|
+
request: jobStatusRequest,
|
|
390
|
+
interval: interval,
|
|
391
|
+
numAttempts: numAttempts,
|
|
392
|
+
resolve: resolve,
|
|
393
|
+
reject: reject
|
|
394
|
+
)
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
@objc(pollDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
398
|
+
func pollDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
399
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
400
|
+
reject("Error", "Invalid job status request", nil)
|
|
401
|
+
return
|
|
402
|
+
}
|
|
382
403
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
404
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
405
|
+
reject("Error", "interval is required", nil)
|
|
406
|
+
return
|
|
407
|
+
}
|
|
387
408
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
numAttempts: numAttempts,
|
|
393
|
-
resolve: resolve,
|
|
394
|
-
reject: reject
|
|
395
|
-
)
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
@objc(pollDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
399
|
-
func pollDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
400
|
-
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
401
|
-
reject("Error", "Invalid job status request", nil)
|
|
402
|
-
return
|
|
403
|
-
}
|
|
409
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
410
|
+
reject("Error", "numAttempts is required", nil)
|
|
411
|
+
return
|
|
412
|
+
}
|
|
404
413
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
414
|
+
pollJobStatus(
|
|
415
|
+
apiCall: SmileID.api.pollDocumentVerificationJobStatus,
|
|
416
|
+
request: jobStatusRequest,
|
|
417
|
+
interval: interval,
|
|
418
|
+
numAttempts: numAttempts,
|
|
419
|
+
resolve: resolve,
|
|
420
|
+
reject: reject
|
|
421
|
+
)
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
@objc(pollBiometricKycJobStatus:withResolver:withRejecter:)
|
|
425
|
+
func pollBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
426
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
427
|
+
reject("Error", "Invalid job status request", nil)
|
|
428
|
+
return
|
|
429
|
+
}
|
|
409
430
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
431
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
432
|
+
reject("Error", "interval is required", nil)
|
|
433
|
+
return
|
|
434
|
+
}
|
|
414
435
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
numAttempts: numAttempts,
|
|
420
|
-
resolve: resolve,
|
|
421
|
-
reject: reject
|
|
422
|
-
)
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
@objc(pollBiometricKycJobStatus:withResolver:withRejecter:)
|
|
426
|
-
func pollBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
427
|
-
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
428
|
-
reject("Error", "Invalid job status request", nil)
|
|
429
|
-
return
|
|
430
|
-
}
|
|
436
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
437
|
+
reject("Error", "numAttempts is required", nil)
|
|
438
|
+
return
|
|
439
|
+
}
|
|
431
440
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
441
|
+
pollJobStatus(
|
|
442
|
+
apiCall: SmileID.api.pollBiometricKycJobStatus,
|
|
443
|
+
request: jobStatusRequest,
|
|
444
|
+
interval: interval,
|
|
445
|
+
numAttempts: numAttempts,
|
|
446
|
+
resolve: resolve,
|
|
447
|
+
reject: reject
|
|
448
|
+
)
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
@objc(pollEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
452
|
+
func pollEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
453
|
+
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
454
|
+
reject("Error", "Invalid job status request", nil)
|
|
455
|
+
return
|
|
456
|
+
}
|
|
436
457
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
458
|
+
guard let interval = request["interval"] as? Int64 else {
|
|
459
|
+
reject("Error", "interval is required", nil)
|
|
460
|
+
return
|
|
461
|
+
}
|
|
441
462
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
numAttempts: numAttempts,
|
|
447
|
-
resolve: resolve,
|
|
448
|
-
reject: reject
|
|
449
|
-
)
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
@objc(pollEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
|
|
453
|
-
func pollEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
454
|
-
guard let jobStatusRequest = request.toJobStatusRequest() else {
|
|
455
|
-
reject("Error", "Invalid job status request", nil)
|
|
456
|
-
return
|
|
457
|
-
}
|
|
463
|
+
guard let numAttempts = request["numAttempts"] as? Int64 else {
|
|
464
|
+
reject("Error", "numAttempts is required", nil)
|
|
465
|
+
return
|
|
466
|
+
}
|
|
458
467
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
468
|
+
pollJobStatus(
|
|
469
|
+
apiCall: SmileID.api.pollEnhancedDocumentVerificationJobStatus,
|
|
470
|
+
request: jobStatusRequest,
|
|
471
|
+
interval: interval,
|
|
472
|
+
numAttempts: numAttempts,
|
|
473
|
+
resolve: resolve,
|
|
474
|
+
reject: reject
|
|
475
|
+
)
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
func pollJobStatus<RequestType, T: JobResult>(
|
|
479
|
+
apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
|
|
480
|
+
request: RequestType,
|
|
481
|
+
interval: Int64,
|
|
482
|
+
numAttempts: Int64,
|
|
483
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
484
|
+
reject: @escaping RCTPromiseRejectBlock
|
|
485
|
+
) {
|
|
486
|
+
let timeInterval = convertToTimeInterval(milliSeconds: interval)
|
|
487
|
+
guard let numAttemptsInt = Int(exactly: numAttempts) else {
|
|
488
|
+
reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
|
|
489
|
+
return
|
|
490
|
+
}
|
|
463
491
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
492
|
+
Task {
|
|
493
|
+
do {
|
|
494
|
+
let pollStream = try await apiCall(request, timeInterval, numAttemptsInt)
|
|
495
|
+
var result: JobStatusResponse<T>?
|
|
468
496
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
request: jobStatusRequest,
|
|
472
|
-
interval: interval,
|
|
473
|
-
numAttempts: numAttempts,
|
|
474
|
-
resolve: resolve,
|
|
475
|
-
reject: reject
|
|
476
|
-
)
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
func pollJobStatus<RequestType, T: JobResult>(
|
|
480
|
-
apiCall: @escaping (RequestType, TimeInterval, Int) async throws -> AsyncThrowingStream<JobStatusResponse<T>, Error>,
|
|
481
|
-
request: RequestType,
|
|
482
|
-
interval: Int64,
|
|
483
|
-
numAttempts: Int64,
|
|
484
|
-
resolve: @escaping RCTPromiseResolveBlock,
|
|
485
|
-
reject: @escaping RCTPromiseRejectBlock
|
|
486
|
-
) {
|
|
487
|
-
let timeInterval = convertToTimeInterval(milliSeconds: interval)
|
|
488
|
-
guard let numAttemptsInt = Int(exactly: numAttempts) else {
|
|
489
|
-
reject("InvalidNumAttempts", "Invalid numAttempts value", NSError(domain: "Invalid numAttempts value", code: -1, userInfo: nil))
|
|
490
|
-
return
|
|
497
|
+
for try await res in pollStream {
|
|
498
|
+
result = res
|
|
491
499
|
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
var result: JobStatusResponse<T>? = nil
|
|
497
|
-
|
|
498
|
-
for try await res in pollStream {
|
|
499
|
-
result = res
|
|
500
|
-
}
|
|
501
|
-
if let finalResult = result {
|
|
502
|
-
self.resolveResponse(finalResult, resolve: resolve, reject: reject)
|
|
503
|
-
} else {
|
|
504
|
-
reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
|
|
505
|
-
}
|
|
506
|
-
} catch {
|
|
507
|
-
reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
|
|
508
|
-
}
|
|
500
|
+
if let finalResult = result {
|
|
501
|
+
self.resolveResponse(finalResult, resolve: resolve, reject: reject)
|
|
502
|
+
} else {
|
|
503
|
+
reject("NoResult", "Polling completed without a result", NSError(domain: "No result obtained", code: -1, userInfo: nil))
|
|
509
504
|
}
|
|
505
|
+
} catch {
|
|
506
|
+
reject("ApiCallFailure", "API call failed with error: \(error.localizedDescription)", error)
|
|
507
|
+
}
|
|
510
508
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
resolve(String(data: jsonData, encoding: .utf8) ?? "")
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
func convertToTimeInterval(milliSeconds: Int64) -> TimeInterval {
|
|
512
|
+
let seconds = milliSeconds / 1000
|
|
513
|
+
return TimeInterval(seconds)
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
517
|
+
let encoder = JSONEncoder()
|
|
518
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
519
|
+
reject("Error", "Encoding error", nil)
|
|
520
|
+
return
|
|
524
521
|
}
|
|
522
|
+
resolve(String(data: jsonData, encoding: .utf8) ?? "")
|
|
523
|
+
}
|
|
525
524
|
}
|