@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.
- package/README.md +4 -28
- package/android/build.gradle +4 -1
- package/android/gradle.properties +3 -3
- package/android/src/main/java/com/smileidentity/react/Mapper.kt +21 -5
- package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +37 -39
- package/android/src/main/java/com/smileidentity/react/SmileIdPackage.kt +4 -0
- package/android/src/main/java/com/smileidentity/react/fragments/SmileCaptureFragment.kt +56 -0
- package/android/src/main/java/com/smileidentity/react/results/BiometricKycCaptureResult.kt +9 -0
- package/android/src/main/java/com/smileidentity/react/results/SmartSelfieCaptureResult.kt +3 -2
- package/android/src/main/java/com/smileidentity/react/utils/BiometricKycCaptureResultAdapter.kt +69 -0
- package/android/src/main/java/com/smileidentity/react/utils/ReactUtils.kt +16 -0
- package/android/src/main/java/com/smileidentity/react/utils/SelfieCaptureResultAdapter.kt +0 -2
- package/android/src/main/java/com/smileidentity/react/viewmanagers/BaseSmileIDViewManager.kt +130 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +22 -46
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDConsentViewManager.kt +27 -52
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentCaptureViewManager.kt +15 -40
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +23 -49
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +28 -47
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.kt +39 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationViewManager.kt +16 -40
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieCaptureViewManager.kt +15 -38
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.kt +39 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentViewManager.kt +15 -44
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +14 -7
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentCaptureView.kt +9 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +2 -4
- package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +11 -5
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationEnhancedView.kt +61 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt +0 -2
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +38 -25
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentEnhancedView.kt +68 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt +35 -30
- package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +11 -10
- package/android/src/main/res/values/colors.xml +14 -0
- package/android/src/main/res/values/strings.xml +91 -0
- package/android/src/oldarch/SmileIdSpec.kt +3 -12
- package/ios/RNSmileID.mm +6 -3
- package/ios/RNSmileID.swift +470 -477
- package/ios/View/SmileIDSmartSelfieAuthEnhancedView.swift +44 -0
- package/ios/View/SmileIDSmartSelfieAuthView.swift +2 -3
- package/ios/View/SmileIDSmartSelfieCaptureView.swift +2 -2
- package/ios/View/SmileIDSmartSelfieEnrollmentEnhancedView.swift +44 -0
- package/ios/ViewManagers/SmileIDBaseViewManager.swift +24 -20
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +24 -24
- package/ios/ViewManagers/SmileIDConsentViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDConsentViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.m +10 -0
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationEnhancedViewManager.swift +25 -0
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +1 -1
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.m +10 -0
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentEnhancedViewManager.swift +25 -0
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.m +4 -1
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +1 -1
- package/lib/commonjs/NativeSmileId.js.map +1 -1
- package/lib/commonjs/SmileIDBiometricKYCView.js +18 -29
- package/lib/commonjs/SmileIDBiometricKYCView.js.map +1 -1
- package/lib/commonjs/SmileIDConsentView.js +9 -29
- package/lib/commonjs/SmileIDConsentView.js.map +1 -1
- package/lib/commonjs/SmileIDDocumentCaptureView.js +9 -29
- package/lib/commonjs/SmileIDDocumentCaptureView.js.map +1 -1
- package/lib/commonjs/SmileIDDocumentVerificationView.js +9 -29
- package/lib/commonjs/SmileIDDocumentVerificationView.js.map +1 -1
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js +17 -28
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationEnhancedView.js +20 -0
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationEnhancedView.js.map +1 -0
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js +9 -29
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js.map +1 -1
- package/lib/commonjs/SmileIDSmartSelfieCaptureView.js +9 -29
- package/lib/commonjs/SmileIDSmartSelfieCaptureView.js.map +1 -1
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentEnhancedView.js +20 -0
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentEnhancedView.js.map +1 -0
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js +9 -29
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js.map +1 -1
- package/lib/commonjs/index.js +26 -2
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/useSmileIDView.js +55 -0
- package/lib/commonjs/useSmileIDView.js.map +1 -0
- package/lib/module/NativeSmileId.js.map +1 -1
- package/lib/module/SmileIDBiometricKYCView.js +18 -26
- package/lib/module/SmileIDBiometricKYCView.js.map +1 -1
- package/lib/module/SmileIDConsentView.js +9 -26
- package/lib/module/SmileIDConsentView.js.map +1 -1
- package/lib/module/SmileIDDocumentCaptureView.js +9 -26
- package/lib/module/SmileIDDocumentCaptureView.js.map +1 -1
- package/lib/module/SmileIDDocumentVerificationView.js +9 -26
- package/lib/module/SmileIDDocumentVerificationView.js.map +1 -1
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js +17 -25
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js.map +1 -1
- package/lib/module/SmileIDSmartSelfieAuthenticationEnhancedView.js +13 -0
- package/lib/module/SmileIDSmartSelfieAuthenticationEnhancedView.js.map +1 -0
- package/lib/module/SmileIDSmartSelfieAuthenticationView.js +9 -26
- package/lib/module/SmileIDSmartSelfieAuthenticationView.js.map +1 -1
- package/lib/module/SmileIDSmartSelfieCaptureView.js +9 -26
- package/lib/module/SmileIDSmartSelfieCaptureView.js.map +1 -1
- package/lib/module/SmileIDSmartSelfieEnrollmentEnhancedView.js +13 -0
- package/lib/module/SmileIDSmartSelfieEnrollmentEnhancedView.js.map +1 -0
- package/lib/module/SmileIDSmartSelfieEnrollmentView.js +9 -26
- package/lib/module/SmileIDSmartSelfieEnrollmentView.js.map +1 -1
- package/lib/module/index.js +10 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/lib/module/useSmileIDView.js +48 -0
- package/lib/module/useSmileIDView.js.map +1 -0
- package/lib/typescript/NativeSmileId.d.ts +6 -4
- package/lib/typescript/NativeSmileId.d.ts.map +1 -1
- package/lib/typescript/SmileIDBiometricKYCView.d.ts +3 -6
- package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +1 -1
- package/lib/typescript/SmileIDConsentView.d.ts +3 -6
- package/lib/typescript/SmileIDConsentView.d.ts.map +1 -1
- package/lib/typescript/SmileIDDocumentCaptureView.d.ts +4 -7
- package/lib/typescript/SmileIDDocumentCaptureView.d.ts.map +1 -1
- package/lib/typescript/SmileIDDocumentVerificationView.d.ts +3 -6
- package/lib/typescript/SmileIDDocumentVerificationView.d.ts.map +1 -1
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts +3 -6
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -1
- package/lib/typescript/SmileIDSmartSelfieAuthenticationEnhancedView.d.ts +5 -0
- package/lib/typescript/SmileIDSmartSelfieAuthenticationEnhancedView.d.ts.map +1 -0
- package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts +3 -6
- package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts.map +1 -1
- package/lib/typescript/SmileIDSmartSelfieCaptureView.d.ts +3 -6
- package/lib/typescript/SmileIDSmartSelfieCaptureView.d.ts.map +1 -1
- package/lib/typescript/SmileIDSmartSelfieEnrollmentEnhancedView.d.ts +5 -0
- package/lib/typescript/SmileIDSmartSelfieEnrollmentEnhancedView.d.ts.map +1 -0
- package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts +3 -6
- package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +12 -6
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +2 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/useSmileIDView.d.ts +12 -0
- package/lib/typescript/useSmileIDView.d.ts.map +1 -0
- package/package.json +1 -1
- package/react-native-smile-id.podspec +1 -1
- package/src/NativeSmileId.ts +10 -14
- package/src/SmileIDBiometricKYCView.tsx +14 -30
- package/src/SmileIDConsentView.tsx +7 -30
- package/src/SmileIDDocumentCaptureView.tsx +12 -36
- package/src/SmileIDDocumentVerificationView.tsx +9 -36
- package/src/SmileIDEnhancedDocumentVerificationView.tsx +23 -35
- package/src/SmileIDSmartSelfieAuthenticationEnhancedView.tsx +28 -0
- package/src/SmileIDSmartSelfieAuthenticationView.tsx +10 -37
- package/src/SmileIDSmartSelfieCaptureView.tsx +9 -33
- package/src/SmileIDSmartSelfieEnrollmentEnhancedView.tsx +25 -0
- package/src/SmileIDSmartSelfieEnrollmentView.tsx +10 -37
- package/src/index.tsx +21 -2
- package/src/types.ts +8 -0
- 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
|
-
|
|
48
|
+
### 2. Initialization
|
|
50
49
|
|
|
51
|
-
|
|
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
|
|
package/android/build.gradle
CHANGED
|
@@ -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=
|
|
4
|
-
SmileId_compileSdkVersion=
|
|
3
|
+
SmileId_targetSdkVersion=35
|
|
4
|
+
SmileId_compileSdkVersion=35
|
|
5
5
|
SmileId_ndkversion=21.4.7075529
|
|
6
|
-
SmileId_androidVersion=10.
|
|
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.
|
|
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
|
|
29
|
+
return Config(
|
|
28
30
|
partnerId = getStringOrDefault("partnerId") ?: run {
|
|
29
31
|
throw IllegalArgumentException("partnerId is required")
|
|
30
32
|
},
|
|
31
|
-
authToken = getStringOrDefault("authToken")
|
|
33
|
+
authToken = getStringOrDefault("authToken") ?: run {
|
|
32
34
|
throw IllegalArgumentException("authToken is required")
|
|
33
35
|
},
|
|
34
|
-
|
|
36
|
+
prodLambdaUrl = getStringOrDefault("prodLambdaUrl") ?: run {
|
|
35
37
|
throw IllegalArgumentException("prodBaseUrl is required")
|
|
36
38
|
},
|
|
37
|
-
|
|
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
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
+
}
|
|
@@ -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
|
)
|
package/android/src/main/java/com/smileidentity/react/utils/BiometricKycCaptureResultAdapter.kt
ADDED
|
@@ -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
|
+
}
|