@smile_identity/react-native 10.2.2 → 10.2.4-beta.1

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