@smile_identity/react-native 10.1.11 → 10.2.0

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 (84) hide show
  1. package/android/build.gradle +4 -4
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/smileidentity/react/SmileIdPackage.kt +5 -0
  4. package/android/src/main/java/com/smileidentity/react/results/DocumentCaptureResult.kt +12 -0
  5. package/android/src/main/java/com/smileidentity/react/results/SmartSelfieCaptureResult.kt +11 -0
  6. package/android/src/main/java/com/smileidentity/react/utils/DocumentCaptureResultAdapter.kt +98 -0
  7. package/android/src/main/java/com/smileidentity/react/utils/SelfieCaptureResultAdapter.kt +78 -0
  8. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentCaptureViewManager.kt +65 -0
  9. package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieCaptureViewManager.kt +63 -0
  10. package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +26 -15
  11. package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentCaptureView.kt +102 -0
  12. package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +28 -15
  13. package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +28 -15
  14. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt +26 -16
  15. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieCaptureView.kt +209 -0
  16. package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt +26 -16
  17. package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +7 -2
  18. package/ios/RNSmileID.swift +1 -1
  19. package/ios/SmileId.xcodeproj/xcuserdata/japhetndhlovu.xcuserdatad/xcschemes/SmileId.xcscheme +23 -0
  20. package/ios/SmileId.xcodeproj/xcuserdata/japhetndhlovu.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  21. package/ios/Utils/FileUtils.swift +24 -0
  22. package/ios/View/SmileIDBiometricKYCView.swift +54 -51
  23. package/ios/View/SmileIDDocumentCaptureView.swift +82 -0
  24. package/ios/View/SmileIDDocumentVerificationView.swift +50 -47
  25. package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +49 -47
  26. package/ios/View/SmileIDSmartSelfieAuthView.swift +35 -33
  27. package/ios/View/SmileIDSmartSelfieCaptureView.swift +71 -0
  28. package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +35 -33
  29. package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.m +7 -0
  30. package/ios/ViewManagers/SmileIDDocumentCaptureViewManager.swift +29 -0
  31. package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.m +7 -0
  32. package/ios/ViewManagers/SmileIDSmartSelfieCaptureViewManager.swift +36 -0
  33. package/ios/ViewModels/SmileIDProductModel.swift +2 -0
  34. package/lib/commonjs/SmileIDDocumentCaptureView.js +40 -0
  35. package/lib/commonjs/SmileIDDocumentCaptureView.js.map +1 -0
  36. package/lib/commonjs/SmileIDSmartSelfieCaptureView.js +40 -0
  37. package/lib/commonjs/SmileIDSmartSelfieCaptureView.js.map +1 -0
  38. package/lib/commonjs/index.js +14 -0
  39. package/lib/commonjs/index.js.map +1 -1
  40. package/lib/commonjs/types.js.map +1 -1
  41. package/lib/module/SmileIDDocumentCaptureView.js +30 -0
  42. package/lib/module/SmileIDDocumentCaptureView.js.map +1 -0
  43. package/lib/module/SmileIDSmartSelfieCaptureView.js +30 -0
  44. package/lib/module/SmileIDSmartSelfieCaptureView.js.map +1 -0
  45. package/lib/module/index.js +3 -1
  46. package/lib/module/index.js.map +1 -1
  47. package/lib/module/types.js.map +1 -1
  48. package/lib/typescript/NativeSmileId.d.ts.map +1 -0
  49. package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +1 -0
  50. package/lib/typescript/SmileIDConsentView.d.ts.map +1 -0
  51. package/lib/typescript/SmileIDDocumentCaptureView.d.ts +8 -0
  52. package/lib/typescript/SmileIDDocumentCaptureView.d.ts.map +1 -0
  53. package/lib/typescript/SmileIDDocumentVerificationView.d.ts.map +1 -0
  54. package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -0
  55. package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts.map +1 -0
  56. package/lib/typescript/SmileIDSmartSelfieCaptureView.d.ts +8 -0
  57. package/lib/typescript/SmileIDSmartSelfieCaptureView.d.ts.map +1 -0
  58. package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts.map +1 -0
  59. package/lib/typescript/{src/index.d.ts → index.d.ts} +3 -1
  60. package/lib/typescript/index.d.ts.map +1 -0
  61. package/lib/typescript/{src/types.d.ts → types.d.ts} +13 -2
  62. package/lib/typescript/types.d.ts.map +1 -0
  63. package/package.json +1 -1
  64. package/react-native-smile-id.podspec +1 -1
  65. package/src/SmileIDDocumentCaptureView.tsx +44 -0
  66. package/src/SmileIDSmartSelfieCaptureView.tsx +44 -0
  67. package/src/index.tsx +4 -0
  68. package/src/types.ts +21 -2
  69. package/lib/typescript/src/NativeSmileId.d.ts.map +0 -1
  70. package/lib/typescript/src/SmileIDBiometricKYCView.d.ts.map +0 -1
  71. package/lib/typescript/src/SmileIDConsentView.d.ts.map +0 -1
  72. package/lib/typescript/src/SmileIDDocumentVerificationView.d.ts.map +0 -1
  73. package/lib/typescript/src/SmileIDEnhancedDocumentVerificationView.d.ts.map +0 -1
  74. package/lib/typescript/src/SmileIDSmartSelfieAuthenticationView.d.ts.map +0 -1
  75. package/lib/typescript/src/SmileIDSmartSelfieEnrollmentView.d.ts.map +0 -1
  76. package/lib/typescript/src/index.d.ts.map +0 -1
  77. package/lib/typescript/src/types.d.ts.map +0 -1
  78. /package/lib/typescript/{src/NativeSmileId.d.ts → NativeSmileId.d.ts} +0 -0
  79. /package/lib/typescript/{src/SmileIDBiometricKYCView.d.ts → SmileIDBiometricKYCView.d.ts} +0 -0
  80. /package/lib/typescript/{src/SmileIDConsentView.d.ts → SmileIDConsentView.d.ts} +0 -0
  81. /package/lib/typescript/{src/SmileIDDocumentVerificationView.d.ts → SmileIDDocumentVerificationView.d.ts} +0 -0
  82. /package/lib/typescript/{src/SmileIDEnhancedDocumentVerificationView.d.ts → SmileIDEnhancedDocumentVerificationView.d.ts} +0 -0
  83. /package/lib/typescript/{src/SmileIDSmartSelfieAuthenticationView.d.ts → SmileIDSmartSelfieAuthenticationView.d.ts} +0 -0
  84. /package/lib/typescript/{src/SmileIDSmartSelfieEnrollmentView.d.ts → SmileIDSmartSelfieEnrollmentView.d.ts} +0 -0
@@ -116,17 +116,17 @@ dependencies {
116
116
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
117
117
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core"
118
118
  implementation "com.smileidentity:android-sdk:$smile_id_sdk_version"
119
+ implementation "com.google.mlkit:object-detection:17.0.2"
119
120
  implementation "com.jakewharton.timber:timber"
120
121
  implementation 'androidx.appcompat:appcompat:1.7.0'
121
- implementation("androidx.navigation:navigation-compose:2.7.7")
122
+ implementation("androidx.navigation:navigation-compose:2.8.1")
123
+ implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.6")
122
124
 
123
125
  testImplementation 'junit:junit:4.13.2'
124
126
 
125
127
  androidTestImplementation 'androidx.test.ext:junit:1.2.1'
126
128
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
127
- androidTestImplementation platform('androidx.compose:compose-bom:2024.06.00')
128
- androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
129
- androidTestImplementation platform('androidx.compose:compose-bom:2024.06.00')
129
+ androidTestImplementation platform('androidx.compose:compose-bom:2024.09.02')
130
130
  androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
131
131
 
132
132
  debugImplementation 'androidx.compose.ui:ui-tooling'
@@ -3,4 +3,4 @@ SmileId_minSdkVersion=21
3
3
  SmileId_targetSdkVersion=34
4
4
  SmileId_compileSdkVersion=34
5
5
  SmileId_ndkversion=21.4.7075529
6
- SmileId_androidVersion=10.2.5
6
+ SmileId_androidVersion=10.3.1
@@ -8,15 +8,20 @@ import com.facebook.react.module.model.ReactModuleInfoProvider
8
8
  import com.facebook.react.uimanager.ViewManager
9
9
  import com.smileidentity.react.viewmanagers.SmileIDBiometricKYCViewManager
10
10
  import com.smileidentity.react.viewmanagers.SmileIDConsentViewManager
11
+ import com.smileidentity.react.viewmanagers.SmileIDDocumentCaptureViewManager
11
12
  import com.smileidentity.react.viewmanagers.SmileIDDocumentVerificationViewManager
12
13
  import com.smileidentity.react.viewmanagers.SmileIDEnhancedDocumentVerificationViewManager
13
14
  import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieAuthenticationViewManager
15
+ import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieCaptureViewManager
14
16
  import com.smileidentity.react.viewmanagers.SmileIDSmartSelfieEnrollmentViewManager
17
+ import com.smileidentity.react.views.SmileIDDocumentCaptureView
15
18
 
16
19
  class SmileIdPackage : TurboReactPackage() {
17
20
 
18
21
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
19
22
  listOf(
23
+ SmileIDSmartSelfieCaptureViewManager(reactContext),
24
+ SmileIDDocumentCaptureViewManager(reactContext),
20
25
  SmileIDSmartSelfieEnrollmentViewManager(reactContext),
21
26
  SmileIDSmartSelfieAuthenticationViewManager(reactContext),
22
27
  SmileIDDocumentVerificationViewManager(reactContext),
@@ -0,0 +1,12 @@
1
+ package com.smileidentity.react.results
2
+
3
+ import java.io.File
4
+
5
+ data class DocumentCaptureResult(
6
+ val selfieFile: File? = null,
7
+ val documentFrontFile: File? = null,
8
+ val livenessFiles: List<File>? = null,
9
+ val documentBackFile: File? = null,
10
+ val didSubmitDocumentVerificationJob: Boolean? = null,
11
+ val didSubmitEnhancedDocVJob: Boolean? = null
12
+ )
@@ -0,0 +1,11 @@
1
+ package com.smileidentity.react.results
2
+
3
+ import com.smileidentity.models.v2.SmartSelfieResponse
4
+ import java.io.File
5
+
6
+ data class SmartSelfieCaptureResult(
7
+ val selfieFile: File? = null,
8
+ val livenessFiles: List<File>? = null,
9
+ val apiResponse: SmartSelfieResponse? = null,
10
+ val didSubmitBiometricKycJob: Boolean? = null
11
+ )
@@ -0,0 +1,98 @@
1
+ package com.smileidentity.react.utils
2
+
3
+ import com.smileidentity.react.results.DocumentCaptureResult
4
+ import com.squareup.moshi.FromJson
5
+ import com.squareup.moshi.JsonAdapter
6
+ import com.squareup.moshi.JsonReader
7
+ import com.squareup.moshi.JsonWriter
8
+ import com.squareup.moshi.Moshi
9
+ import com.squareup.moshi.ToJson
10
+ import java.io.File
11
+ import java.lang.reflect.Type
12
+
13
+ class DocumentCaptureResultAdapter : JsonAdapter<DocumentCaptureResult>() {
14
+
15
+ @FromJson
16
+ override fun fromJson(reader: JsonReader): DocumentCaptureResult {
17
+ reader.beginObject()
18
+ var selfieFile: File? = null
19
+ var frontFile: File? = null
20
+ var backFile: File? = null
21
+ var livenessFiles: MutableList<File>? = null
22
+ var didSubmitDocumentVerificationJob: Boolean? = null
23
+ var didSubmitEnhancedDocVJob: Boolean? = null
24
+
25
+ while (reader.hasNext()) {
26
+ when (reader.nextName()) {
27
+ "selfieFile" -> selfieFile = reader.nextString()?.let { File(it) }
28
+ "documentFrontFile" -> frontFile = reader.nextString()?.let { File(it) }
29
+ "documentBackFile" -> backFile = reader.nextString()?.let { File(it) }
30
+ "livenessFiles" -> {
31
+ livenessFiles = mutableListOf()
32
+ reader.beginArray()
33
+ while (reader.hasNext()) {
34
+ reader.nextString()?.let { livenessFiles.add(File(it)) }
35
+ }
36
+ reader.endArray()
37
+ }
38
+
39
+ "didSubmitDocumentVerificationJob" -> didSubmitDocumentVerificationJob =
40
+ reader.nextBoolean()
41
+
42
+ "didSubmitEnhancedDocVJob" -> didSubmitEnhancedDocVJob = reader.nextBoolean()
43
+ else -> reader.skipValue()
44
+ }
45
+ }
46
+ reader.endObject()
47
+
48
+ return DocumentCaptureResult(
49
+ selfieFile = selfieFile,
50
+ documentFrontFile = frontFile,
51
+ documentBackFile = backFile,
52
+ livenessFiles = livenessFiles,
53
+ didSubmitDocumentVerificationJob = didSubmitDocumentVerificationJob,
54
+ didSubmitEnhancedDocVJob = didSubmitEnhancedDocVJob
55
+ )
56
+ }
57
+
58
+ @ToJson
59
+ override fun toJson(writer: JsonWriter, value: DocumentCaptureResult?) {
60
+ if (value == null) {
61
+ writer.nullValue()
62
+ return
63
+ }
64
+
65
+ writer.beginObject()
66
+ writer.name("selfieFile").value(value.selfieFile?.absolutePath)
67
+ writer.name("documentFrontFile").value(value.documentFrontFile?.absolutePath)
68
+ writer.name("documentBackFile").value(value.documentBackFile?.absolutePath)
69
+
70
+ writer.name("livenessFiles")
71
+ if (value.livenessFiles == null) {
72
+ writer.nullValue()
73
+ } else {
74
+ writer.beginArray()
75
+ for (file in value.livenessFiles) {
76
+ writer.value(file.absolutePath)
77
+ }
78
+ writer.endArray()
79
+ }
80
+
81
+ writer.name("didSubmitDocumentVerificationJob").value(value.didSubmitDocumentVerificationJob)
82
+ writer.name("didSubmitEnhancedDocVJob").value(value.didSubmitEnhancedDocVJob)
83
+
84
+ writer.endObject()
85
+ }
86
+
87
+ companion object {
88
+ val FACTORY = object : Factory {
89
+ override fun create(
90
+ type: Type,
91
+ annotations: Set<Annotation>,
92
+ moshi: Moshi
93
+ ): JsonAdapter<*>? {
94
+ return if (type == DocumentCaptureResult::class.java) DocumentCaptureResultAdapter() else null
95
+ }
96
+ }
97
+ }
98
+ }
@@ -0,0 +1,78 @@
1
+ package com.smileidentity.react.utils
2
+
3
+ import com.smileidentity.SmileID
4
+ import com.smileidentity.models.v2.SmartSelfieResponse
5
+ import com.smileidentity.react.results.SmartSelfieCaptureResult
6
+ import com.squareup.moshi.FromJson
7
+ import com.squareup.moshi.JsonAdapter
8
+ import com.squareup.moshi.JsonAdapter.Factory
9
+ import com.squareup.moshi.JsonReader
10
+ import com.squareup.moshi.JsonWriter
11
+ import com.squareup.moshi.ToJson
12
+ import java.io.File
13
+
14
+ class SelfieCaptureResultAdapter : JsonAdapter<SmartSelfieCaptureResult>() {
15
+
16
+ @FromJson
17
+ override fun fromJson(reader: JsonReader): SmartSelfieCaptureResult {
18
+ reader.beginObject()
19
+ var selfieFile: File? = null
20
+ var livenessFiles: List<File>? = null
21
+ var apiResponse: SmartSelfieResponse? = null
22
+
23
+ while (reader.hasNext()) {
24
+ when (reader.nextName()) {
25
+ "selfieFile" -> selfieFile = reader.nextString()?.let { File(it) }
26
+ "livenessFiles" -> {
27
+ // Assuming livenessFiles is an array of file paths in the JSON
28
+ val files = mutableListOf<File>()
29
+ reader.beginArray()
30
+ while (reader.hasNext()) {
31
+ reader.nextString()?.let { files.add(File(it)) }
32
+ }
33
+ reader.endArray()
34
+ livenessFiles = files
35
+ }
36
+
37
+ "apiResponse" -> apiResponse =
38
+ SmileID.moshi.adapter(SmartSelfieResponse::class.java).fromJson(reader)
39
+
40
+ else -> reader.skipValue()
41
+ }
42
+ }
43
+
44
+ reader.endObject()
45
+ return SmartSelfieCaptureResult(
46
+ selfieFile = selfieFile,
47
+ livenessFiles = livenessFiles,
48
+ apiResponse = apiResponse
49
+ )
50
+ }
51
+
52
+ @ToJson
53
+ override fun toJson(writer: JsonWriter, value: SmartSelfieCaptureResult?) {
54
+ if (value == null) {
55
+ writer.nullValue()
56
+ return
57
+ }
58
+ writer.beginObject()
59
+ writer.name("selfieFile").value(value.selfieFile?.absolutePath)
60
+
61
+ writer.name("livenessFiles")
62
+ writer.beginArray()
63
+ value.livenessFiles?.forEach { writer.value(it.absolutePath) }
64
+ writer.endArray()
65
+
66
+ writer.name("apiResponse")
67
+ if (value.apiResponse != null) {
68
+ SmileID.moshi.adapter(SmartSelfieResponse::class.java).toJson(writer, value.apiResponse)
69
+ } else {
70
+ writer.nullValue()
71
+ }
72
+ writer.endObject()
73
+ }
74
+
75
+ companion object {
76
+ val FACTORY = Factory { type, annotations, moshi -> if (type == SmartSelfieCaptureResult::class.java) SelfieCaptureResultAdapter() else null }
77
+ }
78
+ }
@@ -0,0 +1,65 @@
1
+ package com.smileidentity.react.viewmanagers
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.facebook.react.bridge.ReadableArray
5
+ import com.facebook.react.module.annotations.ReactModule
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.smileidentity.react.utils.getBoolOrDefault
9
+ import com.smileidentity.react.utils.getStringOrDefault
10
+ import com.smileidentity.react.views.SmileIDDocumentCaptureView
11
+
12
+ @ReactModule(name = SmileIDDocumentCaptureViewManager.NAME)
13
+ class SmileIDDocumentCaptureViewManager(
14
+ private val reactApplicationContext: ReactApplicationContext
15
+ ) : SimpleViewManager<SmileIDDocumentCaptureView>() {
16
+ override fun getName(): String = NAME
17
+
18
+ override fun getExportedCustomBubblingEventTypeConstants(): Map<String, Any> {
19
+ return mapOf(
20
+ "onSmileResult" to mapOf(
21
+ "phasedRegistrationNames" to mapOf(
22
+ "bubbled" to "onResult"
23
+ )
24
+ )
25
+ )
26
+ }
27
+
28
+ override fun getCommandsMap(): Map<String, Int> {
29
+ return mapOf("setParams" to COMMAND_SET_PARAMS)
30
+ }
31
+
32
+ override fun receiveCommand(
33
+ view: SmileIDDocumentCaptureView,
34
+ commandId: String?,
35
+ args: ReadableArray?
36
+ ) {
37
+ super.receiveCommand(view, commandId, args)
38
+ when (commandId?.toInt()) {
39
+ COMMAND_SET_PARAMS -> {
40
+ // Extract params from args and apply to view
41
+ val params = args?.getMap(0)
42
+ params?.let {
43
+ view.userId = params.getStringOrDefault("userId")
44
+ view.jobId = params.getStringOrDefault("jobId")
45
+ view.allowAgentMode = params.getBoolOrDefault("allowAgentMode", true)
46
+ view.showAttribution = params.getBoolOrDefault("showAttribution", true)
47
+ view.showInstructions = params.getBoolOrDefault("showInstructions", true)
48
+ view.showConfirmation = params.getBoolOrDefault("showConfirmation", true)
49
+ view.allowGalleryUpload = params.getBoolOrDefault("allowGalleryUpload", false)
50
+ view.front = params.getBoolOrDefault("isDocumentFrontSide", true)
51
+ view.renderContent()
52
+ }
53
+ }
54
+ }
55
+ }
56
+
57
+ override fun createViewInstance(p0: ThemedReactContext): SmileIDDocumentCaptureView {
58
+ return SmileIDDocumentCaptureView(reactApplicationContext)
59
+ }
60
+
61
+ companion object {
62
+ const val NAME = "SmileIDDocumentCaptureView"
63
+ const val COMMAND_SET_PARAMS = 1
64
+ }
65
+ }
@@ -0,0 +1,63 @@
1
+ package com.smileidentity.react.viewmanagers
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.facebook.react.bridge.ReadableArray
5
+ import com.facebook.react.module.annotations.ReactModule
6
+ import com.facebook.react.uimanager.SimpleViewManager
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.smileidentity.react.utils.getBoolOrDefault
9
+ import com.smileidentity.react.utils.getStringOrDefault
10
+ import com.smileidentity.react.views.SmileIDSmartSelfieCaptureView
11
+
12
+ @ReactModule(name = SmileIDSmartSelfieCaptureViewManager.NAME)
13
+ class SmileIDSmartSelfieCaptureViewManager(
14
+ private val reactApplicationContext: ReactApplicationContext
15
+ ) : SimpleViewManager<SmileIDSmartSelfieCaptureView>() {
16
+ override fun getName(): String = NAME
17
+
18
+ override fun getExportedCustomBubblingEventTypeConstants(): Map<String, Any> {
19
+ return mapOf(
20
+ "onSmileResult" to mapOf(
21
+ "phasedRegistrationNames" to mapOf(
22
+ "bubbled" to "onResult"
23
+ )
24
+ )
25
+ )
26
+ }
27
+
28
+ override fun getCommandsMap(): Map<String, Int> {
29
+ return mapOf("setParams" to COMMAND_SET_PARAMS)
30
+ }
31
+
32
+ override fun receiveCommand(
33
+ view: SmileIDSmartSelfieCaptureView,
34
+ commandId: String?,
35
+ args: ReadableArray?
36
+ ) {
37
+ super.receiveCommand(view, commandId, args)
38
+ when (commandId?.toInt()) {
39
+ COMMAND_SET_PARAMS -> {
40
+ // Extract params from args and apply to view
41
+ val params = args?.getMap(0)
42
+ params?.let {
43
+ view.userId = params.getStringOrDefault("userId")
44
+ view.jobId = params.getStringOrDefault("jobId")
45
+ view.allowAgentMode = params.getBoolOrDefault("allowAgentMode", false)
46
+ view.showAttribution = params.getBoolOrDefault("showAttribution", true)
47
+ view.showInstructions = params.getBoolOrDefault("showInstructions", true)
48
+ view.showConfirmation = params.getBoolOrDefault("showConfirmation", true)
49
+ view.renderContent()
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ override fun createViewInstance(p0: ThemedReactContext): SmileIDSmartSelfieCaptureView {
56
+ return SmileIDSmartSelfieCaptureView(reactApplicationContext)
57
+ }
58
+
59
+ companion object {
60
+ const val NAME = "SmileIDSmartSelfieCaptureView"
61
+ const val COMMAND_SET_PARAMS = 1
62
+ }
63
+ }
@@ -7,12 +7,12 @@ import com.facebook.react.bridge.ReactApplicationContext
7
7
  import com.smileidentity.SmileID
8
8
  import com.smileidentity.compose.BiometricKYC
9
9
  import com.smileidentity.models.IdInfo
10
- import com.smileidentity.results.BiometricKycResult
10
+ import com.smileidentity.react.results.SmartSelfieCaptureResult
11
+ import com.smileidentity.react.utils.SelfieCaptureResultAdapter
11
12
  import com.smileidentity.results.SmileIDResult
12
13
  import com.smileidentity.util.randomJobId
13
14
  import com.smileidentity.util.randomUserId
14
15
  import kotlinx.collections.immutable.toImmutableMap
15
- import timber.log.Timber
16
16
 
17
17
  class SmileIDBiometricKYCView(context: ReactApplicationContext) : SmileIDView(context) {
18
18
  var idInfo: IdInfo? = null
@@ -35,24 +35,35 @@ class SmileIDBiometricKYCView(context: ReactApplicationContext) : SmileIDView(co
35
35
  showAttribution = showAttribution ?: true,
36
36
  showInstructions = showInstructions ?: true,
37
37
  extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
38
- ) { result ->
39
- when (result) {
38
+ ) { res ->
39
+ when (res) {
40
40
  is SmileIDResult.Success -> {
41
- val json = try {
41
+ val result =
42
+ SmartSelfieCaptureResult(
43
+ selfieFile = res.data.selfieFile,
44
+ livenessFiles = res.data.livenessFiles,
45
+ didSubmitBiometricKycJob = res.data.didSubmitBiometricKycJob,
46
+ )
47
+ val newMoshi =
42
48
  SmileID.moshi
43
- .adapter(BiometricKycResult::class.java)
44
- .toJson(result.data)
45
- } catch (e: Exception) {
46
- Timber.w(e)
47
- "null"
49
+ .newBuilder()
50
+ .add(SelfieCaptureResultAdapter.FACTORY)
51
+ .build()
52
+ val json =
53
+ try {
54
+ newMoshi
55
+ .adapter(SmartSelfieCaptureResult::class.java)
56
+ .toJson(result)
57
+ } catch (e: Exception) {
58
+ emitFailure(e)
59
+ return@BiometricKYC
60
+ }
61
+ json?.let { js ->
62
+ emitSuccess(js)
48
63
  }
49
- emitSuccess(json)
50
64
  }
51
65
 
52
- is SmileIDResult.Error -> {
53
- result.throwable.printStackTrace()
54
- emitFailure(result.throwable)
55
- }
66
+ is SmileIDResult.Error -> emitFailure(res.throwable)
56
67
  }
57
68
  }
58
69
  }
@@ -0,0 +1,102 @@
1
+ package com.smileidentity.react.views
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.layout.Box
5
+ import androidx.compose.foundation.layout.WindowInsets
6
+ import androidx.compose.foundation.layout.consumeWindowInsets
7
+ import androidx.compose.foundation.layout.fillMaxSize
8
+ import androidx.compose.foundation.layout.statusBars
9
+ import androidx.compose.foundation.layout.windowInsetsPadding
10
+ import androidx.compose.runtime.Composable
11
+ import androidx.compose.runtime.CompositionLocalProvider
12
+ import androidx.compose.runtime.saveable.rememberSaveable
13
+ import androidx.compose.ui.Modifier
14
+ import androidx.compose.ui.graphics.Color
15
+ import androidx.compose.ui.res.stringResource
16
+ import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
17
+ import com.facebook.react.bridge.ReactApplicationContext
18
+ import com.smileidentity.R
19
+ import com.smileidentity.SmileID
20
+ import com.smileidentity.compose.document.DocumentCaptureScreen
21
+ import com.smileidentity.compose.document.DocumentCaptureSide
22
+ import com.smileidentity.compose.theme.colorScheme
23
+ import com.smileidentity.react.results.DocumentCaptureResult
24
+ import com.smileidentity.react.utils.DocumentCaptureResultAdapter
25
+ import com.smileidentity.util.randomJobId
26
+ import timber.log.Timber
27
+ import java.io.File
28
+
29
+ class SmileIDDocumentCaptureView(context: ReactApplicationContext) : SmileIDView(context) {
30
+ var showConfirmation: Boolean = true
31
+ var front: Boolean = true
32
+ var allowGalleryUpload: Boolean = false
33
+ var idAspectRatio: Float? = null
34
+
35
+ override fun renderContent() {
36
+ composeView.apply {
37
+ val customViewModelStoreOwner = CustomViewModelStoreOwner()
38
+ setContent {
39
+ CompositionLocalProvider(LocalViewModelStoreOwner provides customViewModelStoreOwner) {
40
+ val colorScheme = SmileID.colorScheme.copy(background = Color.White)
41
+ Box(
42
+ modifier = Modifier
43
+ .background(color = colorScheme.background)
44
+ .windowInsetsPadding(WindowInsets.statusBars)
45
+ .consumeWindowInsets(WindowInsets.statusBars)
46
+ .fillMaxSize()
47
+ ) {
48
+ RenderDocumentCaptureScreen()
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ @Composable
56
+ private fun RenderDocumentCaptureScreen() {
57
+ val jobId = jobId ?: rememberSaveable { randomJobId() }
58
+ val hero = if (front) R.drawable.si_doc_v_front_hero else R.drawable.si_doc_v_back_hero
59
+ val instructionTitle = if (front) R.string.si_doc_v_instruction_title else
60
+ R.string.si_doc_v_instruction_back_title
61
+ val instructionSubTitle = if (front) R.string.si_verify_identity_instruction_subtitle else
62
+ R.string.si_doc_v_instruction_back_subtitle
63
+ val captureTitleText = if (front) R.string.si_doc_v_capture_instructions_front_title else
64
+ R.string.si_doc_v_capture_instructions_back_title
65
+ DocumentCaptureScreen(
66
+ jobId = jobId,
67
+ side = if (front) DocumentCaptureSide.Front else DocumentCaptureSide.Back,
68
+ showInstructions = showInstructions,
69
+ showAttribution = showAttribution,
70
+ allowGallerySelection = allowGalleryUpload,
71
+ showConfirmation = showConfirmation,
72
+ showSkipButton = false,
73
+ instructionsHeroImage = hero,
74
+ instructionsTitleText = stringResource(instructionTitle),
75
+ instructionsSubtitleText = stringResource(instructionSubTitle),
76
+ captureTitleText = stringResource(captureTitleText),
77
+ knownIdAspectRatio = idAspectRatio,
78
+ onConfirm = { file -> handleConfirmation(file) },
79
+ onError = { throwable -> emitFailure(throwable) },
80
+ onSkip = { }
81
+ )
82
+ }
83
+
84
+ private fun handleConfirmation(file: File) {
85
+ val newMoshi = SmileID.moshi.newBuilder()
86
+ .add(DocumentCaptureResultAdapter.FACTORY)
87
+ .build()
88
+ val result = DocumentCaptureResult(
89
+ documentFrontFile = if (front) file else null,
90
+ documentBackFile = if (!front) file else null,
91
+ )
92
+ val json = try {
93
+ newMoshi
94
+ .adapter(DocumentCaptureResult::class.java)
95
+ .toJson(result)
96
+ } catch (e: Exception) {
97
+ Timber.w(e)
98
+ "null"
99
+ }
100
+ emitSuccess(json)
101
+ }
102
+ }
@@ -6,12 +6,12 @@ import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
6
6
  import com.facebook.react.bridge.ReactApplicationContext
7
7
  import com.smileidentity.SmileID
8
8
  import com.smileidentity.compose.DocumentVerification
9
- import com.smileidentity.results.DocumentVerificationResult
9
+ import com.smileidentity.react.results.DocumentCaptureResult
10
+ import com.smileidentity.react.utils.DocumentCaptureResultAdapter
10
11
  import com.smileidentity.results.SmileIDResult
11
12
  import com.smileidentity.util.randomJobId
12
13
  import com.smileidentity.util.randomUserId
13
14
  import kotlinx.collections.immutable.toImmutableMap
14
- import timber.log.Timber
15
15
  import java.io.File
16
16
 
17
17
  class SmileIDDocumentVerificationView(context: ReactApplicationContext) : SmileIDView(context) {
@@ -49,24 +49,37 @@ class SmileIDDocumentVerificationView(context: ReactApplicationContext) : SmileI
49
49
  allowNewEnroll = allowNewEnroll ?: false,
50
50
  bypassSelfieCaptureWithFile = bypassSelfieCaptureWithFile,
51
51
  extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
52
- ) { result ->
53
- when (result) {
52
+ ) { res ->
53
+ when (res) {
54
54
  is SmileIDResult.Success -> {
55
- val json = try {
55
+ val result =
56
+ DocumentCaptureResult(
57
+ selfieFile = res.data.selfieFile,
58
+ documentFrontFile = res.data.documentFrontFile,
59
+ livenessFiles = res.data.livenessFiles,
60
+ documentBackFile = res.data.documentBackFile,
61
+ didSubmitDocumentVerificationJob = res.data.didSubmitDocumentVerificationJob,
62
+ )
63
+ val newMoshi =
56
64
  SmileID.moshi
57
- .adapter(DocumentVerificationResult::class.java)
58
- .toJson(result.data)
59
- } catch (e: Exception) {
60
- Timber.w(e)
61
- "null"
65
+ .newBuilder()
66
+ .add(DocumentCaptureResultAdapter.FACTORY)
67
+ .build()
68
+ val json =
69
+ try {
70
+ newMoshi
71
+ .adapter(DocumentCaptureResult::class.java)
72
+ .toJson(result)
73
+ } catch (e: Exception) {
74
+ emitFailure(e)
75
+ return@DocumentVerification
76
+ }
77
+ json?.let { js ->
78
+ emitSuccess(js)
62
79
  }
63
- emitSuccess(json)
64
80
  }
65
81
 
66
- is SmileIDResult.Error -> {
67
- result.throwable.printStackTrace()
68
- emitFailure(result.throwable)
69
- }
82
+ is SmileIDResult.Error -> emitFailure(res.throwable)
70
83
  }
71
84
  }
72
85
  }