@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.
Files changed (60) hide show
  1. package/android/gradle.properties +1 -1
  2. package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +10 -0
  3. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +2 -0
  4. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDConsentViewManager.kt +0 -1
  5. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentCaptureViewManager.kt +0 -1
  6. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +2 -0
  7. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +2 -0
  8. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationViewManager.kt +1 -0
  9. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieCaptureViewManager.kt +1 -0
  10. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentViewManager.kt +1 -0
  11. package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +2 -0
  12. package/android/src/main/java/com/smileidentity/react/views/SmileIDConsentView.kt +1 -0
  13. package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentCaptureView.kt +0 -10
  14. package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +2 -0
  15. package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +2 -0
  16. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt +1 -0
  17. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +17 -4
  18. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt +1 -0
  19. package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +5 -6
  20. package/android/src/oldarch/SmileIdSpec.kt +2 -0
  21. package/ios/RNSmileID.mm +1 -0
  22. package/ios/RNSmileID.swift +511 -497
  23. package/ios/View/SmileIDBiometricKYCView.swift +2 -0
  24. package/ios/View/SmileIDDocumentVerificationView.swift +1 -0
  25. package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +1 -0
  26. package/ios/View/SmileIDSmartSelfieAuthView.swift +1 -0
  27. package/ios/View/SmileIDSmartSelfieCaptureView.swift +58 -38
  28. package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +1 -0
  29. package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +2 -0
  30. package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +0 -1
  31. package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +1 -0
  32. package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +1 -0
  33. package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +1 -0
  34. package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +5 -7
  35. package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +1 -0
  36. package/ios/ViewModels/SmileIDProductModel.swift +2 -0
  37. package/lib/commonjs/NativeSmileId.js.map +1 -1
  38. package/lib/commonjs/index.js +8 -0
  39. package/lib/commonjs/index.js.map +1 -1
  40. package/lib/commonjs/types.js.map +1 -1
  41. package/lib/commonjs/useSmileIDView.js +1 -1
  42. package/lib/commonjs/useSmileIDView.js.map +1 -1
  43. package/lib/module/NativeSmileId.js.map +1 -1
  44. package/lib/module/index.js +9 -1
  45. package/lib/module/index.js.map +1 -1
  46. package/lib/module/types.js.map +1 -1
  47. package/lib/module/useSmileIDView.js +1 -1
  48. package/lib/module/useSmileIDView.js.map +1 -1
  49. package/lib/typescript/NativeSmileId.d.ts +8 -1
  50. package/lib/typescript/NativeSmileId.d.ts.map +1 -1
  51. package/lib/typescript/index.d.ts +10 -2
  52. package/lib/typescript/index.d.ts.map +1 -1
  53. package/lib/typescript/types.d.ts +6 -1
  54. package/lib/typescript/types.d.ts.map +1 -1
  55. package/package.json +3 -2
  56. package/react-native-smile-id.podspec +1 -1
  57. package/src/NativeSmileId.ts +9 -1
  58. package/src/index.tsx +24 -15
  59. package/src/types.ts +11 -1
  60. package/src/useSmileIDView.tsx +1 -1
@@ -2,532 +2,546 @@ import SmileID
2
2
 
3
3
  @objc(RNSmileID)
4
4
  class RNSmileID: NSObject {
5
- @objc(initialize:enableCrashReporting:config:apiKey:withResolver:withRejecter:)
6
- func initialize(
7
- useSandBox: Bool,
8
- enableCrashReporting _: Bool,
9
- config: NSDictionary?,
10
- apiKey: String?,
11
- resolve: @escaping RCTPromiseResolveBlock,
12
- reject _: @escaping RCTPromiseRejectBlock
13
- ) {
14
- // Set wrapper info for React Native SDK using compile-time constant
15
- #if SMILE_ID_VERSION
16
- let sdkVersion = SMILE_ID_VERSION
17
- #else
18
- let sdkVersion = "unknown" // Fallback version
19
- #endif
20
-
21
- SmileID.setWrapperInfo(name: .reactNative, version: sdkVersion)
22
-
23
- // Handle different initialization scenarios based on provided parameters
24
- if let apiKey = apiKey, let config = config {
25
- // Initialize with API key and config
26
- SmileID.initialize(
27
- apiKey: apiKey,
28
- config: config.toConfig(),
29
- useSandbox: useSandBox
30
- )
31
- } else if let config = config {
32
- // Initialize with just config
33
- SmileID.initialize(
34
- config: config.toConfig(),
35
- useSandbox: useSandBox
36
- )
37
- } else {
38
- // Basic initialization with just sandbox flag
39
- SmileID.initialize(useSandbox: useSandBox)
40
- }
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
- @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)
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
- @objc(setAllowOfflineMode:withResolver:withRejecter:)
52
- func setAllowOfflineMode(allowOfflineMode: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
53
- SmileID.setAllowOfflineMode(allowOfflineMode: allowOfflineMode)
54
- resolve(nil)
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
- @objc(submitJob:withResolver:withRejecter:)
58
- func submitJob(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
59
- do {
60
- try SmileID.submitJob(jobId: jobId)
61
- resolve(nil)
62
- } catch let error as NSError {
63
- reject("Error", error.localizedDescription, error)
64
- }
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
- @objc(getSubmittedJobs:withRejecter:)
68
- func getSubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
69
- do {
70
- let jobs: [String] = SmileID.getUnsubmittedJobs()
71
- resolve(jobs)
72
- } catch let error as NSError {
73
- reject("Error", error.localizedDescription, error)
74
- }
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
- @objc(getUnsubmittedJobs:withRejecter:)
78
- func getUnsubmittedJobs(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
79
- do {
80
- let jobs: [String] = SmileID.getUnsubmittedJobs()
81
- resolve(jobs)
82
- } catch let error as NSError {
83
- reject("Error", error.localizedDescription, error)
84
- }
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
- @objc(cleanup:withResolver:withRejecter:)
88
- func cleanup(jobId: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
89
- do {
90
- try SmileID.cleanup(jobId: jobId)
91
- resolve(nil)
92
- } catch let error as NSError {
93
- reject("Error", error.localizedDescription, error)
94
- }
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
- @objc(authenticate:withResolver:withRejecter:)
98
- func authenticate(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
99
- guard let authenticationRequest = request.toAuthenticationRequest() else {
100
- reject("Error", "Invalid request data", nil)
101
- return
102
- }
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
- @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
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
- @objc(upload:request:withResolver:withRejecter:)
132
- func upload(url: String, request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
133
- guard let uploadRequest = request.toUploadRequest() else {
134
- reject("Error", "Invalid upload request", nil)
135
- return
136
- }
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
- @objc(doEnhancedKyc:withResolver:withRejecter:)
153
- func doEnhancedKyc(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
154
- guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
155
- reject("doEnhancedKyc", "partnerParams is required", nil)
156
- return
157
- }
158
- guard let partnerParams = partnerParamsDict.toPartnerParams() else {
159
- reject("doEnhancedKyc", "partnerParams is missing required data", nil)
160
- return
161
- }
162
- guard let country = request["country"] as? String else {
163
- reject("doEnhancedKyc", "country is required", nil)
164
- return
165
- }
166
- guard let idType = request["idType"] as? String else {
167
- reject("doEnhancedKyc", "idType is required", nil)
168
- return
169
- }
170
- guard let idNumber = request["idNumber"] as? String else {
171
- reject("doEnhancedKyc", "idNumber is required", nil)
172
- return
173
- }
174
- guard let timestamp = request["timestamp"] as? String else {
175
- reject("doEnhancedKyc", "timestamp is required", nil)
176
- return
177
- }
178
- guard let signature = request["signature"] as? String else {
179
- reject("doEnhancedKyc", "signature is required", nil)
180
- return
181
- }
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
- @objc(doEnhancedKycAsync:withResolver:withRejecter:)
228
- func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
229
- guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
230
- reject("doEnhancedKyc", "partnerParams is required", nil)
231
- return
232
- }
233
- guard let partnerParams = partnerParamsDict.toPartnerParams() else {
234
- reject("doEnhancedKyc", "partnerParams is missing required data", nil)
235
- return
236
- }
237
- guard let country = request["country"] as? String else {
238
- reject("doEnhancedKyc", "country is required", nil)
239
- return
240
- }
241
- guard let idType = request["idType"] as? String else {
242
- reject("doEnhancedKyc", "idType is required", nil)
243
- return
244
- }
245
- guard let idNumber = request["idNumber"] as? String else {
246
- reject("doEnhancedKyc", "idNumber is required", nil)
247
- return
248
- }
249
- guard let timestamp = request["timestamp"] as? String else {
250
- reject("doEnhancedKyc", "timestamp is required", nil)
251
- return
252
- }
253
- guard let signature = request["signature"] as? String else {
254
- reject("doEnhancedKyc", "signature is required", nil)
255
- return
256
- }
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
- @objc(getSmartSelfieJobStatus:withResolver:withRejecter:)
297
- func getSmartSelfieJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
298
- getJobStatus(request: request, resolve: resolve, reject: reject)
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
- @objc(getDocumentVerificationJobStatus:withResolver:withRejecter:)
302
- func getDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
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
- @objc(getBiometricKycJobStatus:withResolver:withRejecter:)
307
- func getBiometricKycJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
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
- @objc(getEnhancedDocumentVerificationJobStatus:withResolver:withRejecter:)
312
- func getEnhancedDocumentVerificationJobStatus(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
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
- @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
- }
170
+ guard let idNumber = request["idNumber"] as? String else {
171
+ reject("doEnhancedKyc", "idNumber is required", nil)
172
+ return
331
173
  }
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
- }
174
+ guard let timestamp = request["timestamp"] as? String else {
175
+ reject("doEnhancedKyc", "timestamp is required", nil)
176
+ return
348
177
  }
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
- }
178
+ guard let signature = request["signature"] as? String else {
179
+ reject("doEnhancedKyc", "signature is required", nil)
180
+ return
360
181
  }
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
- }
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
- @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
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
- pollJobStatus(
397
- apiCall: SmileID.api.pollSmartSelfieJobStatus,
398
- request: jobStatusRequest,
399
- interval: interval,
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
- @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
- )
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
- @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
- )
233
+ guard let partnerParams = partnerParamsDict.toPartnerParams() else {
234
+ reject("doEnhancedKyc", "partnerParams is missing required data", nil)
235
+ return
458
236
  }
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
- )
237
+ guard let country = request["country"] as? String else {
238
+ reject("doEnhancedKyc", "country is required", nil)
239
+ return
485
240
  }
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
- }
241
+ guard let idType = request["idType"] as? String else {
242
+ reject("doEnhancedKyc", "idType is required", nil)
243
+ return
518
244
  }
519
-
520
- func convertToTimeInterval(milliSeconds: Int64) -> TimeInterval {
521
- let seconds = milliSeconds / 1000
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
- private func resolveResponse<T: Encodable>(_ response: T, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
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
- reject("Error", "Encoding error", nil)
529
- return
286
+ throw SmileIDError.unknown("doEnhancedKyc encoding error")
530
287
  }
531
- resolve(String(data: jsonData, encoding: .utf8) ?? "")
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
  }