@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
package/README.md CHANGED
@@ -20,7 +20,7 @@ Please see [CHANGELOG.md](CHANGELOG.md) or [Releases](https://github.com/smileid
20
20
 
21
21
  ## Getting Started
22
22
 
23
- Full documentation is available at [Smile ID Documentation](https://docs.usesmileid.com/integration-options/mobile)
23
+ Full documentation is available at [Smile ID Documentation]((https://docs.usesmileid.com/integration-options/mobile/getting-started))
24
24
 
25
25
  ### 0. Requirements
26
26
 
@@ -44,36 +44,12 @@ Add the dependency to your `package.json`:
44
44
  }
45
45
  ```
46
46
 
47
- ### 2. Smile Config
48
47
 
49
- #### Android
48
+ ### 2. Initialization
50
49
 
51
- Place the `smile_config.json` file under your application's assets, located at `src/main/assets` (This should be at the same level as your `java` and `res` directories). You may need to create the directory if it does not already exist.
50
+ There are multiple ways to initialize the SDK. See [Initialization](https://docs.usesmileid.com/integration-options/mobile/getting-started) and choose the best option
51
+ for your integration
52
52
 
53
- #### iOS
54
-
55
- Drag the `smile_config.json` into your project's file inspector and ensure that the file is added to your app's target. Confirm that it is by checking the Copy Bundle Resources drop down in the Build Phases tab as shown below.
56
-
57
- ### 3. Initialization
58
-
59
- Initialize the Smile ID SDK in your app's entry file (normally `index.tsx`) by calling `initialize`:
60
-
61
- ```typescript
62
- import { initialize } from 'rn-smile-id';
63
- import React, { useEffect } from 'react';
64
-
65
- const App = () => {
66
- useEffect(() => {
67
- initialize().then(() => console.log('Smile ID Initialized'));
68
- }, []);
69
-
70
- return (
71
- // ...rest of your component
72
- );
73
- };
74
-
75
- export default App;
76
- ```
77
53
 
78
54
  ## Getting Help
79
55
 
@@ -116,10 +116,13 @@ repositories {
116
116
  mavenCentral()
117
117
  google()
118
118
  gradlePluginPortal()
119
+ maven {
120
+ url 'https://oss.sonatype.org/content/repositories/snapshots/'
121
+ }
119
122
  }
120
123
 
121
124
  def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["SmileId_kotlinVersion"]
122
- def smile_id_sdk_version = project.properties["SmileId_androidVersion"]
125
+ def smile_id_sdk_version = rootProject.ext.has("smileIdAndroidSdkVersion") ? rootProject.ext.get("smileIdAndroidSdkVersion") : project.properties["SmileId_androidVersion"]
123
126
 
124
127
  dependencies {
125
128
  implementation "com.facebook.react:react-native:0.72"
@@ -1,7 +1,7 @@
1
1
  SmileId_kotlinVersion=2.0.0
2
2
  SmileId_minSdkVersion=21
3
- SmileId_targetSdkVersion=34
4
- SmileId_compileSdkVersion=34
3
+ SmileId_targetSdkVersion=35
4
+ SmileId_compileSdkVersion=35
5
5
  SmileId_ndkversion=21.4.7075529
6
- SmileId_androidVersion=10.3.7
6
+ SmileId_androidVersion=10.4.4-SNAPSHOT
7
7
  SmileId_kotlinCompilerExtensionVersion=1.5.11
@@ -1,9 +1,10 @@
1
1
  package com.smileidentity.react
2
2
 
3
+ import androidx.compose.animation.core.rememberTransition
3
4
  import com.facebook.react.bridge.ReadableMap
4
5
  import com.smileidentity.models.AuthenticationRequest
5
6
  import com.smileidentity.models.Config
6
- import com.smileidentity.models.ConsentInfo
7
+ import com.smileidentity.models.ConsentInformation
7
8
  import com.smileidentity.models.EnhancedKycRequest
8
9
  import com.smileidentity.models.IdInfo
9
10
  import com.smileidentity.models.ImageType
@@ -15,6 +16,7 @@ import com.smileidentity.models.ProductsConfigRequest
15
16
  import com.smileidentity.models.UploadImageInfo
16
17
  import com.smileidentity.models.UploadRequest
17
18
  import com.smileidentity.react.utils.getBoolOrDefault
19
+ import com.smileidentity.react.utils.getCurrentIsoTimestamp
18
20
  import com.smileidentity.react.utils.getIntOrDefault
19
21
  import com.smileidentity.react.utils.getMapOrDefault
20
22
  import com.smileidentity.react.utils.getStringOrDefault
@@ -24,17 +26,17 @@ import com.smileidentity.util.randomUserId
24
26
  import java.io.File
25
27
 
26
28
  fun ReadableMap.toConfig(): Config {
27
- return Config(
29
+ return Config(
28
30
  partnerId = getStringOrDefault("partnerId") ?: run {
29
31
  throw IllegalArgumentException("partnerId is required")
30
32
  },
31
- authToken = getStringOrDefault("authToken") ?: run {
33
+ authToken = getStringOrDefault("authToken") ?: run {
32
34
  throw IllegalArgumentException("authToken is required")
33
35
  },
34
- prodBaseUrl = getStringOrDefault("prodBaseUrl") ?: run {
36
+ prodLambdaUrl = getStringOrDefault("prodLambdaUrl") ?: run {
35
37
  throw IllegalArgumentException("prodBaseUrl is required")
36
38
  },
37
- sandboxBaseUrl = getStringOrDefault("sandboxBaseUrl") ?: run {
39
+ testLambdaUrl = getStringOrDefault("testLambdaUrl") ?: run {
38
40
  throw IllegalArgumentException("sandboxBaseUrl is required")
39
41
  },
40
42
  )
@@ -150,6 +152,20 @@ fun ReadableMap.toEnhancedKycRequest(): EnhancedKycRequest {
150
152
  signature = getStringOrDefault("signature") ?: run {
151
153
  throw IllegalArgumentException("signature is required")
152
154
  },
155
+ consentInformation = getMapOrDefault("consentInformation", null)?.toConsentInfo() ?: run {
156
+ throw IllegalArgumentException("consentInformation is required")
157
+ },
158
+ )
159
+ }
160
+
161
+ fun ReadableMap.toConsentInfo(): ConsentInformation {
162
+ return ConsentInformation(
163
+ consentGrantedDate = getStringOrDefault("consentGrantedDate", null) ?: run {
164
+ getCurrentIsoTimestamp()
165
+ },
166
+ personalDetailsConsentGranted = getBoolOrDefault("personalDetailsConsentGranted", false),
167
+ contactInfoConsentGranted = getBoolOrDefault("contactInfoConsentGranted", false),
168
+ documentInfoConsentGranted = getBoolOrDefault("contactInfoConsentGranted", false)
153
169
  )
154
170
  }
155
171
 
@@ -1,6 +1,5 @@
1
1
  package com.smileidentity.react
2
2
 
3
- import android.util.Log
4
3
  import com.facebook.react.bridge.Arguments
5
4
  import com.facebook.react.bridge.Promise
6
5
  import com.facebook.react.bridge.ReactApplicationContext
@@ -15,7 +14,6 @@ import com.smileidentity.models.BiometricKycJobStatusResponse
15
14
  import com.smileidentity.models.DocumentVerificationJobStatusResponse
16
15
  import com.smileidentity.models.EnhancedDocumentVerificationJobStatusResponse
17
16
  import com.smileidentity.models.EnhancedKycAsyncResponse
18
- import com.smileidentity.models.EnhancedKycRequest
19
17
  import com.smileidentity.models.EnhancedKycResponse
20
18
  import com.smileidentity.models.PrepUploadResponse
21
19
  import com.smileidentity.models.ProductsConfigResponse
@@ -27,18 +25,15 @@ import com.smileidentity.networking.pollDocumentVerificationJobStatus
27
25
  import com.smileidentity.networking.pollEnhancedDocumentVerificationJobStatus
28
26
  import com.smileidentity.networking.pollSmartSelfieJobStatus
29
27
  import com.smileidentity.react.utils.getIntOrDefault
30
- import com.smileidentity.react.utils.getStringOrDefault
31
- import com.smileidentity.results.SmartSelfieResult
32
- import java.net.URL
33
28
  import kotlinx.coroutines.CoroutineExceptionHandler
34
29
  import kotlinx.coroutines.CoroutineScope
35
30
  import kotlinx.coroutines.Dispatchers
36
31
  import kotlinx.coroutines.flow.Flow
37
32
  import kotlinx.coroutines.flow.last
38
33
  import kotlinx.coroutines.flow.map
39
- import kotlinx.coroutines.flow.single
40
34
  import kotlinx.coroutines.launch
41
35
  import kotlinx.coroutines.withContext
36
+ import java.net.URL
42
37
  import kotlin.time.Duration
43
38
  import kotlin.time.Duration.Companion.milliseconds
44
39
 
@@ -49,45 +44,48 @@ class SmileIdModule internal constructor(
49
44
  override fun getName(): String = NAME
50
45
 
51
46
  @ReactMethod
52
- override fun initializeWithApiKey(
53
- apiKey: String,
54
- config: ReadableMap,
55
- useSandBox: Boolean,
56
- enableCrashReporting: Boolean,
57
- promise: Promise
58
- ) {
59
- SmileID.initialize(
60
- context = reactApplicationContext,
61
- apiKey = apiKey,
62
- config = config.toConfig(),
63
- useSandbox = useSandBox,
64
- enableCrashReporting = enableCrashReporting
65
- )
66
- promise.resolve(null)
67
- }
68
-
69
- @ReactMethod
70
- override fun initializeWithConfig(
71
- config: ReadableMap,
47
+ override fun initialize(
72
48
  useSandBox: Boolean,
73
49
  enableCrashReporting: Boolean,
50
+ config: ReadableMap?,
51
+ apiKey: String?,
74
52
  promise: Promise
75
53
  ) {
76
- SmileID.initialize(
77
- context = reactApplicationContext,
78
- config = config.toConfig(),
79
- useSandbox = useSandBox,
80
- enableCrashReporting = enableCrashReporting
81
- )
82
- promise.resolve(null)
54
+ try {
55
+ when {
56
+ // Case 1: Initialize with API key and config
57
+ apiKey != null && config != null -> {
58
+ SmileID.initialize(
59
+ context = reactApplicationContext,
60
+ apiKey = apiKey,
61
+ config = config.toConfig(),
62
+ useSandbox = useSandBox,
63
+ enableCrashReporting = enableCrashReporting
64
+ )
65
+ }
66
+ // Case 2: Initialize with just config
67
+ config != null -> {
68
+ SmileID.initialize(
69
+ context = reactApplicationContext,
70
+ config = config.toConfig(),
71
+ useSandbox = useSandBox,
72
+ enableCrashReporting = enableCrashReporting
73
+ )
74
+ }
75
+ // Case 3: Basic initialization
76
+ else -> {
77
+ SmileID.initialize(
78
+ context = reactApplicationContext,
79
+ useSandbox = useSandBox
80
+ )
81
+ }
82
+ }
83
+ promise.resolve(null)
84
+ } catch (e: Exception) {
85
+ promise.reject("INITIALIZE_ERROR", e.message, e)
86
+ }
83
87
  }
84
88
 
85
- @ReactMethod
86
- override fun initialize(useSandBox: Boolean, promise: Promise) {
87
- SmileID.initialize(context = reactApplicationContext, useSandbox = useSandBox)
88
- promise.resolve(null)
89
- }
90
-
91
89
  @ReactMethod
92
90
  override fun setCallbackUrl(callbackUrl: String, promise: Promise) {
93
91
  SmileID.setCallbackUrl(callbackUrl = URL(callbackUrl))
@@ -12,8 +12,10 @@ import com.smileidentity.react.viewmanagers.SmileIDDocumentCaptureViewManager
12
12
  import com.smileidentity.react.viewmanagers.SmileIDDocumentVerificationViewManager
13
13
  import com.smileidentity.react.viewmanagers.SmileIDEnhancedDocumentVerificationViewManager
14
14
  import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieAuthenticationViewManager
15
+ import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieAuthenticationEnhancedViewManager
15
16
  import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieCaptureViewManager
16
17
  import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieEnrollmentViewManager
18
+ import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieEnrollmentEnhancedViewManager
17
19
  import com.smileidentity.react.views.SmileIDDocumentCaptureView
18
20
 
19
21
  class SmileIdPackage : TurboReactPackage() {
@@ -24,6 +26,8 @@ class SmileIdPackage : TurboReactPackage() {
24
26
  SmileIDDocumentCaptureViewManager(reactContext),
25
27
  SmileIDSmartSelfieEnrollmentViewManager(reactContext),
26
28
  SmileIDSmartSelfieAuthenticationViewManager(reactContext),
29
+ SmileIDSmartSelfieEnrollmentEnhancedViewManager(reactContext),
30
+ SmileIDSmartSelfieAuthenticationEnhancedViewManager(reactContext),
27
31
  SmileIDDocumentVerificationViewManager(reactContext),
28
32
  SmileIDEnhancedDocumentVerificationViewManager(reactContext),
29
33
  SmileIDConsentViewManager(reactContext),
@@ -0,0 +1,56 @@
1
+ package com.smileidentity.react.fragments
2
+
3
+ import android.os.Bundle
4
+ import android.view.LayoutInflater
5
+ import android.view.View
6
+ import android.view.ViewGroup
7
+ import androidx.fragment.app.Fragment
8
+ import com.facebook.react.bridge.ReactContext
9
+ import com.facebook.react.bridge.ReadableMap
10
+ import com.facebook.react.bridge.WritableMap
11
+ import com.facebook.react.modules.core.DeviceEventManagerModule
12
+ import com.smileidentity.react.views.SmileIDView
13
+ import com.smileidentity.react.views.SmileViewListener
14
+
15
+
16
+ class SmileCaptureFragment : Fragment(), SmileViewListener {
17
+ lateinit var smileIdView: SmileIDView
18
+ private var args: ReadableMap? = null
19
+ private var reactContext: ReactContext? = null
20
+
21
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
22
+ super.onCreateView(inflater, container, savedInstanceState)
23
+ return smileIdView
24
+ }
25
+
26
+ fun setSmileIDView(smileIDView: SmileIDView) {
27
+ smileIdView = smileIDView
28
+ smileIdView.smileViewListener = this
29
+ }
30
+
31
+ fun setReactContext(reactContext: ReactContext) {
32
+ this.reactContext = reactContext
33
+ }
34
+
35
+ fun updateViewWithParams(params: ReadableMap?) {
36
+ args = params
37
+ // Only update if view is created
38
+ if (view != null) {
39
+ params?.let {
40
+ smileIdView.renderContent()
41
+ }
42
+ }
43
+ }
44
+
45
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
46
+ super.onViewCreated(view, savedInstanceState)
47
+ args?.let {
48
+ smileIdView.renderContent()
49
+ }
50
+ }
51
+
52
+ override fun emitSuccess(map: WritableMap) {
53
+ reactContext?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
54
+ ?.emit("onSmileResult", map)
55
+ }
56
+ }
@@ -0,0 +1,9 @@
1
+ package com.smileidentity.react.results
2
+
3
+ import java.io.File
4
+
5
+ data class BiometricKycCaptureResult(
6
+ val selfieFile: File? = null,
7
+ val livenessFiles: List<File>? = null,
8
+ val didSubmitBiometricKycJob: Boolean? = null
9
+ )
@@ -2,10 +2,11 @@ package com.smileidentity.react.results
2
2
 
3
3
  import com.smileidentity.models.v2.SmartSelfieResponse
4
4
  import java.io.File
5
+ import com.squareup.moshi.JsonClass
5
6
 
7
+ @JsonClass(generateAdapter = true)
6
8
  data class SmartSelfieCaptureResult(
7
9
  val selfieFile: File? = null,
8
10
  val livenessFiles: List<File>? = null,
9
- val apiResponse: SmartSelfieResponse? = null,
10
- val didSubmitBiometricKycJob: Boolean? = null
11
+ val apiResponse: SmartSelfieResponse? = null
11
12
  )
@@ -0,0 +1,69 @@
1
+ package com.smileidentity.react.utils
2
+
3
+ import com.smileidentity.SmileID
4
+ import com.smileidentity.react.results.BiometricKycCaptureResult
5
+ import com.squareup.moshi.FromJson
6
+ import com.squareup.moshi.JsonAdapter
7
+ import com.squareup.moshi.JsonAdapter.Factory
8
+ import com.squareup.moshi.JsonReader
9
+ import com.squareup.moshi.JsonWriter
10
+ import com.squareup.moshi.ToJson
11
+ import java.io.File
12
+
13
+ class BiometricKycCaptureResultAdapter : JsonAdapter<BiometricKycCaptureResult>() {
14
+
15
+ @FromJson
16
+ override fun fromJson(reader: JsonReader): BiometricKycCaptureResult {
17
+ reader.beginObject()
18
+ var selfieFile: File? = null
19
+ var livenessFiles: List<File>? = null
20
+ var didSubmitBiometricKycJob: Boolean? = null
21
+
22
+ while (reader.hasNext()) {
23
+ when (reader.nextName()) {
24
+ "selfieFile" -> selfieFile = reader.nextString()?.let { File(it) }
25
+ "livenessFiles" -> {
26
+ // Assuming livenessFiles is an array of file paths in the JSON
27
+ val files = mutableListOf<File>()
28
+ reader.beginArray()
29
+ while (reader.hasNext()) {
30
+ reader.nextString()?.let { files.add(File(it)) }
31
+ }
32
+ reader.endArray()
33
+ livenessFiles = files
34
+ }
35
+ "didSubmitBiometricKycJob" -> didSubmitBiometricKycJob = reader.nextBoolean()
36
+ else -> reader.skipValue()
37
+ }
38
+ }
39
+
40
+ reader.endObject()
41
+ return BiometricKycCaptureResult(
42
+ selfieFile = selfieFile,
43
+ livenessFiles = livenessFiles,
44
+ didSubmitBiometricKycJob = didSubmitBiometricKycJob
45
+ )
46
+ }
47
+
48
+ @ToJson
49
+ override fun toJson(writer: JsonWriter, value: BiometricKycCaptureResult?) {
50
+ if (value == null) {
51
+ writer.nullValue()
52
+ return
53
+ }
54
+ writer.beginObject()
55
+ writer.name("selfieFile").value(value.selfieFile?.absolutePath)
56
+
57
+ writer.name("livenessFiles")
58
+ writer.beginArray()
59
+ value.livenessFiles?.forEach { writer.value(it.absolutePath) }
60
+ writer.endArray()
61
+
62
+ writer.name("didSubmitBiometricKycJob").value(value.didSubmitBiometricKycJob)
63
+ writer.endObject()
64
+ }
65
+
66
+ companion object {
67
+ val FACTORY = Factory { type, annotations, moshi -> if (type == BiometricKycCaptureResult::class.java) BiometricKycCaptureResultAdapter() else null }
68
+ }
69
+ }
@@ -12,6 +12,10 @@ import kotlinx.collections.immutable.persistentMapOf
12
12
  import kotlinx.collections.immutable.toImmutableMap
13
13
  import kotlinx.collections.immutable.toPersistentMap
14
14
  import timber.log.Timber
15
+ import java.text.SimpleDateFormat
16
+ import java.util.Date
17
+ import java.util.Locale
18
+ import java.util.TimeZone
15
19
 
16
20
  fun ReadableMap.toMap(): Map<String, String> {
17
21
  val map = mutableMapOf<String, String>()
@@ -79,3 +83,15 @@ fun ReadableMap.getImmutableMapOrDefault(
79
83
  defaultValue
80
84
  }
81
85
  }
86
+
87
+ /**
88
+ * Converts current time to ISO8601 string with milliseconds in UTC
89
+ * Format: yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
90
+ */
91
+ internal fun getCurrentIsoTimestamp(): String {
92
+ val pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
93
+ val sdf = SimpleDateFormat(pattern, Locale.US)
94
+ sdf.timeZone = TimeZone.getTimeZone("UTC")
95
+ return sdf.format(Date())
96
+ }
97
+
@@ -33,10 +33,8 @@ class SelfieCaptureResultAdapter : JsonAdapter<SmartSelfieCaptureResult>() {
33
33
  reader.endArray()
34
34
  livenessFiles = files
35
35
  }
36
-
37
36
  "apiResponse" -> apiResponse =
38
37
  SmileID.moshi.adapter(SmartSelfieResponse::class.java).fromJson(reader)
39
-
40
38
  else -> reader.skipValue()
41
39
  }
42
40
  }
@@ -0,0 +1,130 @@
1
+ package com.smileidentity.react.viewmanagers
2
+
3
+ import android.view.Choreographer
4
+ import android.view.View
5
+ import android.view.View.MeasureSpec
6
+ import android.view.ViewGroup
7
+ import android.widget.FrameLayout
8
+ import androidx.fragment.app.FragmentManager
9
+ import com.facebook.react.ReactActivity
10
+ import com.facebook.react.bridge.ReactApplicationContext
11
+ import com.facebook.react.bridge.ReadableArray
12
+ import com.facebook.react.bridge.ReadableMap
13
+ import com.facebook.react.uimanager.SimpleViewManager
14
+ import com.facebook.react.uimanager.ThemedReactContext
15
+ import com.smileidentity.react.fragments.SmileCaptureFragment
16
+ import com.smileidentity.react.views.SmileIDView
17
+
18
+ abstract class BaseSmileIDViewManager<T : SmileIDView>(
19
+ private val reactApplicationContext: ReactApplicationContext
20
+ ) : SimpleViewManager<FrameLayout>() {
21
+ private var smileCaptureFragment: SmileCaptureFragment? = null
22
+ protected var smileIDView: T? = null
23
+
24
+ override fun getExportedCustomBubblingEventTypeConstants(): Map<String, Any> {
25
+ return mapOf(
26
+ "onSmileResult" to mapOf(
27
+ "phasedRegistrationNames" to mapOf(
28
+ "bubbled" to "onResult"
29
+ )
30
+ )
31
+ )
32
+ }
33
+
34
+ private fun createFragment(
35
+ root: FrameLayout,
36
+ reactNativeViewId: Int,
37
+ ) {
38
+ val parentView = root.findViewById<ViewGroup>(reactNativeViewId)
39
+ setupLayout(parentView)
40
+
41
+ // Clean up existing view and fragment
42
+ smileIDView?.let { existingView ->
43
+ (existingView.parent as? ViewGroup)?.removeView(existingView)
44
+ }
45
+ smileCaptureFragment?.let { existingFragment ->
46
+ val activity = reactApplicationContext.currentActivity as ReactActivity
47
+ val manager = activity.supportFragmentManager
48
+ manager.beginTransaction().remove(existingFragment).commit()
49
+ manager.executePendingTransactions()
50
+ }
51
+
52
+ // Create new instances
53
+ smileIDView = createSmileView()
54
+ smileCaptureFragment = SmileCaptureFragment()
55
+ smileCaptureFragment?.setReactContext(reactApplicationContext)
56
+ smileIDView?.let { view ->
57
+ (view.parent as? ViewGroup)?.removeView(view) // Ensure view is detached
58
+ smileCaptureFragment?.setSmileIDView(view)
59
+ }
60
+
61
+ // Add new fragment
62
+ smileCaptureFragment?.let {
63
+ val activity = reactApplicationContext.currentActivity as ReactActivity
64
+ val manager = activity.supportFragmentManager
65
+ manager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
66
+ manager.beginTransaction()
67
+ .replace(reactNativeViewId, it, reactNativeViewId.toString())
68
+ .commit()
69
+ }
70
+ }
71
+
72
+ abstract fun createSmileView(): T
73
+ abstract fun applyArgs(view: T, args: ReadableMap?)
74
+
75
+ private fun setupLayout(view: View) {
76
+ Choreographer.getInstance().postFrameCallback(object : Choreographer.FrameCallback {
77
+ override fun doFrame(frameTimeNanos: Long) {
78
+ manuallyLayoutChildren(view)
79
+ view.viewTreeObserver.dispatchOnGlobalLayout()
80
+ Choreographer.getInstance().postFrameCallback(this)
81
+ }
82
+ })
83
+ }
84
+
85
+ private fun manuallyLayoutChildren(view: View) {
86
+ val width = view.measuredWidth
87
+ val height = view.measuredHeight
88
+ view.measure(
89
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
90
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
91
+ )
92
+ view.layout(0, 0, width, height)
93
+ }
94
+
95
+ override fun createViewInstance(p0: ThemedReactContext): FrameLayout {
96
+ return FrameLayout(p0)
97
+ }
98
+
99
+ override fun getCommandsMap(): Map<String, Int> {
100
+ return mapOf("setParams" to COMMAND_SET_PARAMS, "create" to COMMAND_CREATE)
101
+ }
102
+
103
+ override fun receiveCommand(
104
+ view: FrameLayout,
105
+ commandId: String?,
106
+ args: ReadableArray?
107
+ ) {
108
+ super.receiveCommand(view, commandId, args)
109
+ when (commandId?.toInt()) {
110
+ COMMAND_CREATE -> {
111
+ val reactNativeViewId = requireNotNull(args).getInt(0)
112
+ createFragment(view, reactNativeViewId)
113
+ }
114
+
115
+ COMMAND_SET_PARAMS -> {
116
+ val params = args?.getMap(1)
117
+ smileIDView?.let { view ->
118
+ applyArgs(view, params)
119
+ // Update the fragment with new params
120
+ smileCaptureFragment?.updateViewWithParams(params)
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ companion object {
127
+ const val COMMAND_SET_PARAMS = 1
128
+ const val COMMAND_CREATE = 2
129
+ }
130
+ }