@smile_identity/react-native 10.0.0-beta01
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/LICENSE +20 -0
- package/README.md +78 -0
- package/android/build.gradle +155 -0
- package/android/gradle.properties +6 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/assets/smile_config.json +9 -0
- package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +97 -0
- package/android/src/main/java/com/smileidentity/react/SmileIdPackage.kt +50 -0
- package/android/src/main/java/com/smileidentity/react/utils/ReactUtils.kt +91 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBVNConsentViewManager.kt +42 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +42 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +42 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationViewManager.kt +42 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentViewManager.kt +42 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBVNConsentScreen.kt +54 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYC.kt +89 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerification.kt +59 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthentication.kt +47 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollment.kt +48 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +121 -0
- package/android/src/newarch/SmileIdSpec.kt +7 -0
- package/android/src/oldarch/SmileIdSpec.kt +13 -0
- package/ios/SmileId.h +12 -0
- package/ios/SmileId.mm +27 -0
- package/ios/SmileId.xcodeproj/project.pbxproj +274 -0
- package/ios/SmileId.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
- package/lib/commonjs/NativeSmileId.js +10 -0
- package/lib/commonjs/NativeSmileId.js.map +1 -0
- package/lib/commonjs/index.js +52 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/module/NativeSmileId.js +3 -0
- package/lib/module/NativeSmileId.js.map +1 -0
- package/lib/module/index.js +38 -0
- package/lib/module/index.js.map +1 -0
- package/lib/typescript/NativeSmileId.d.ts +9 -0
- package/lib/typescript/NativeSmileId.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +89 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/package.json +169 -0
- package/react-native-smile-id.podspec +42 -0
- package/src/NativeSmileId.ts +14 -0
- package/src/index.tsx +150 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package com.smileidentity.react.viewmanagers
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
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.facebook.react.uimanager.annotations.ReactProp
|
|
9
|
+
import com.smileidentity.react.views.SmileIDSmartSelfieAuthentication
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@ReactModule(name = SmileIDSmartSelfieAuthenticationViewManager.NAME)
|
|
13
|
+
class SmileIDSmartSelfieAuthenticationViewManager(private val reactApplicationContext: ReactApplicationContext) :
|
|
14
|
+
SimpleViewManager<SmileIDSmartSelfieAuthentication>() {
|
|
15
|
+
override fun getName(): String {
|
|
16
|
+
return NAME
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getExportedCustomBubblingEventTypeConstants(): Map<String, Any> {
|
|
20
|
+
return mapOf(
|
|
21
|
+
"onSmileResult" to mapOf(
|
|
22
|
+
"phasedRegistrationNames" to mapOf(
|
|
23
|
+
"bubbled" to "onResult"
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@ReactProp(name = "product")
|
|
30
|
+
fun setProduct(view: SmileIDSmartSelfieAuthentication, product: ReadableMap) {
|
|
31
|
+
view.product = product
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override fun createViewInstance(p0: ThemedReactContext): SmileIDSmartSelfieAuthentication {
|
|
35
|
+
return SmileIDSmartSelfieAuthentication(reactApplicationContext)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
companion object {
|
|
39
|
+
const val NAME = "SmileIDSmartSelfieAuthenticationView"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
package com.smileidentity.react.viewmanagers
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
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.facebook.react.uimanager.annotations.ReactProp
|
|
9
|
+
import com.smileidentity.react.views.SmileIDSmartSelfieEnrollment
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@ReactModule(name = SmileIDSmartSelfieEnrollmentViewManager.NAME)
|
|
13
|
+
class SmileIDSmartSelfieEnrollmentViewManager(private val reactApplicationContext: ReactApplicationContext) :
|
|
14
|
+
SimpleViewManager<SmileIDSmartSelfieEnrollment>() {
|
|
15
|
+
override fun getName(): String {
|
|
16
|
+
return NAME
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getExportedCustomBubblingEventTypeConstants(): Map<String, Any> {
|
|
20
|
+
return mapOf(
|
|
21
|
+
"onSmileResult" to mapOf(
|
|
22
|
+
"phasedRegistrationNames" to mapOf(
|
|
23
|
+
"bubbled" to "onResult"
|
|
24
|
+
)
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@ReactProp(name = "product")
|
|
30
|
+
fun setProduct(view: SmileIDSmartSelfieEnrollment, product: ReadableMap) {
|
|
31
|
+
view.product = product
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override fun createViewInstance(p0: ThemedReactContext): SmileIDSmartSelfieEnrollment {
|
|
35
|
+
return SmileIDSmartSelfieEnrollment(reactApplicationContext)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
companion object {
|
|
39
|
+
const val NAME = "SmileIDSmartSelfieEnrollmentView"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import android.webkit.URLUtil
|
|
4
|
+
import androidx.compose.ui.res.painterResource
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.smileidentity.SmileID
|
|
7
|
+
import com.smileidentity.compose.BvnConsentScreen
|
|
8
|
+
import com.smileidentity.react.utils.getStringOrDefault
|
|
9
|
+
import java.net.URL
|
|
10
|
+
|
|
11
|
+
class SmileIDBVNConsentScreen (context: ReactApplicationContext) : SmileIDView(context) {
|
|
12
|
+
|
|
13
|
+
override fun renderContent() {
|
|
14
|
+
product?.let {product->
|
|
15
|
+
val partnerName = product.getStringOrDefault("partnerName",null) ?: run {
|
|
16
|
+
emitFailure(IllegalArgumentException("partnerName is required for BiometricKYC"))
|
|
17
|
+
return
|
|
18
|
+
}
|
|
19
|
+
val partnerPrivacyPolicy = product.getStringOrDefault("partnerPrivacyPolicy",null) ?: run {
|
|
20
|
+
emitFailure(IllegalArgumentException("partnerPrivacyPolicy is required for BiometricKYC"))
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
if(!URLUtil.isValidUrl(partnerPrivacyPolicy)){
|
|
24
|
+
emitFailure(IllegalArgumentException("a valid url for partnerPrivacyPolicy is required for BiometricKYC"))
|
|
25
|
+
return
|
|
26
|
+
}
|
|
27
|
+
val logoResName = product.getStringOrDefault("partnerIcon",null) ?: run {
|
|
28
|
+
emitFailure(IllegalArgumentException("partnerPrivacyPolicy is required for BiometricKYC"))
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
val partnerIcon = context.resources.getIdentifier(
|
|
32
|
+
logoResName,
|
|
33
|
+
"drawable",
|
|
34
|
+
(context as? ReactApplicationContext)?.currentActivity?.packageName
|
|
35
|
+
)
|
|
36
|
+
composeView.apply {
|
|
37
|
+
setContent {
|
|
38
|
+
SmileID.BvnConsentScreen(
|
|
39
|
+
partnerIcon = painterResource(
|
|
40
|
+
id = partnerIcon
|
|
41
|
+
),
|
|
42
|
+
partnerName = partnerName,
|
|
43
|
+
partnerPrivacyPolicy = URL(partnerPrivacyPolicy),
|
|
44
|
+
onConsentDenied = {
|
|
45
|
+
emitSuccess("denied")
|
|
46
|
+
},
|
|
47
|
+
onConsentGranted = {
|
|
48
|
+
emitSuccess("accepted")
|
|
49
|
+
},
|
|
50
|
+
)
|
|
51
|
+
}}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import android.webkit.URLUtil
|
|
4
|
+
import androidx.compose.runtime.saveable.rememberSaveable
|
|
5
|
+
import androidx.compose.ui.res.painterResource
|
|
6
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
7
|
+
import com.smileidentity.SmileID
|
|
8
|
+
import com.smileidentity.compose.BiometricKYC
|
|
9
|
+
import com.smileidentity.react.utils.getStringOrDefault
|
|
10
|
+
import com.smileidentity.react.utils.idInfo
|
|
11
|
+
import com.smileidentity.results.BiometricKycResult
|
|
12
|
+
import com.smileidentity.results.SmileIDResult
|
|
13
|
+
import com.smileidentity.util.randomJobId
|
|
14
|
+
import com.smileidentity.util.randomUserId
|
|
15
|
+
import timber.log.Timber
|
|
16
|
+
import java.net.URL
|
|
17
|
+
|
|
18
|
+
class SmileIDBiometricKYC(context: ReactApplicationContext) : SmileIDView(context) {
|
|
19
|
+
override fun renderContent() {
|
|
20
|
+
product?.let { product ->
|
|
21
|
+
val idInfo = product.idInfo() ?: run {
|
|
22
|
+
emitFailure(IllegalArgumentException("idInfo is required for BiometricKYC"))
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
val partnerName = product.getStringOrDefault("partnerName", null) ?: run {
|
|
26
|
+
emitFailure(IllegalArgumentException("partnerName is required for BiometricKYC"))
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
val partnerPrivacyPolicy = product.getStringOrDefault("partnerPrivacyPolicy", null) ?: run {
|
|
31
|
+
emitFailure(IllegalArgumentException("partnerPrivacyPolicy is required for BiometricKYC"))
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
if (!URLUtil.isValidUrl(partnerPrivacyPolicy)) {
|
|
35
|
+
emitFailure(IllegalArgumentException("a valid url for partnerPrivacyPolicy is required for BiometricKYC"))
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
val logoResName = product.getString("partnerIcon") ?: run {
|
|
39
|
+
emitFailure(IllegalArgumentException("productName is required for BiometricKYC"))
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
val partnerIcon = context.resources.getIdentifier(
|
|
43
|
+
logoResName,
|
|
44
|
+
"drawable",
|
|
45
|
+
(context as? ReactApplicationContext)?.currentActivity?.packageName
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
val productName = product.getStringOrDefault("productName", null) ?: run {
|
|
49
|
+
emitFailure(IllegalArgumentException("productName is required for BiometricKYC"))
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
composeView.apply {
|
|
53
|
+
setContent {
|
|
54
|
+
SmileID.BiometricKYC(
|
|
55
|
+
idInfo = idInfo,
|
|
56
|
+
partnerIcon = painterResource(id = partnerIcon),
|
|
57
|
+
partnerName = partnerName,
|
|
58
|
+
productName = productName,
|
|
59
|
+
partnerPrivacyPolicy = URL(partnerPrivacyPolicy),
|
|
60
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
61
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
62
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
63
|
+
showAttribution = showInstructions ?: true,
|
|
64
|
+
) { result ->
|
|
65
|
+
when (result) {
|
|
66
|
+
is SmileIDResult.Success -> {
|
|
67
|
+
val json = try {
|
|
68
|
+
SmileID.moshi
|
|
69
|
+
.adapter(BiometricKycResult::class.java)
|
|
70
|
+
.toJson(result.data)
|
|
71
|
+
} catch (e: Exception) {
|
|
72
|
+
Timber.w(e)
|
|
73
|
+
"null"
|
|
74
|
+
}
|
|
75
|
+
emitSuccess(json)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
is SmileIDResult.Error -> {
|
|
79
|
+
result.throwable.printStackTrace()
|
|
80
|
+
emitFailure(result.throwable)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import androidx.compose.runtime.saveable.rememberSaveable
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.smileidentity.SmileID
|
|
6
|
+
import com.smileidentity.compose.DocumentVerification
|
|
7
|
+
import com.smileidentity.react.utils.getBoolOrDefault
|
|
8
|
+
import com.smileidentity.react.utils.getStringOrDefault
|
|
9
|
+
import com.smileidentity.results.DocumentVerificationResult
|
|
10
|
+
import com.smileidentity.results.SmileIDResult
|
|
11
|
+
import com.smileidentity.util.randomJobId
|
|
12
|
+
import com.smileidentity.util.randomUserId
|
|
13
|
+
import timber.log.Timber
|
|
14
|
+
|
|
15
|
+
class SmileIDDocumentVerification(context: ReactApplicationContext) : SmileIDView(context) {
|
|
16
|
+
|
|
17
|
+
override fun renderContent() {
|
|
18
|
+
product?.let{ product ->
|
|
19
|
+
val countryCode = product.getStringOrDefault("countryCode",null) ?: run {
|
|
20
|
+
emitFailure(IllegalArgumentException("countryCode is required for DocumentVerification"))
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
val allowGalleryUpload = product.getBoolOrDefault("allowGalleryUpload",false)
|
|
24
|
+
val captureBothSides = product.getBoolOrDefault("captureBothSides",false)
|
|
25
|
+
composeView.apply {
|
|
26
|
+
setContent {
|
|
27
|
+
SmileID.DocumentVerification(
|
|
28
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
29
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
30
|
+
countryCode = countryCode!!,
|
|
31
|
+
documentType = product.getString("documentType"),
|
|
32
|
+
showInstructions = showInstructions ?: true,
|
|
33
|
+
allowGalleryUpload = allowGalleryUpload,
|
|
34
|
+
captureBothSides = captureBothSides
|
|
35
|
+
) { result ->
|
|
36
|
+
when (result) {
|
|
37
|
+
is SmileIDResult.Success -> {
|
|
38
|
+
val json = try {
|
|
39
|
+
SmileID.moshi
|
|
40
|
+
.adapter(DocumentVerificationResult::class.java)
|
|
41
|
+
.toJson(result.data)
|
|
42
|
+
} catch (e: Exception) {
|
|
43
|
+
Timber.w(e)
|
|
44
|
+
"null"
|
|
45
|
+
}
|
|
46
|
+
emitSuccess(json)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
is SmileIDResult.Error -> {
|
|
50
|
+
result.throwable.printStackTrace()
|
|
51
|
+
emitFailure(result.throwable)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthentication.kt
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import androidx.compose.runtime.saveable.rememberSaveable
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.smileidentity.SmileID
|
|
6
|
+
import com.smileidentity.compose.SmartSelfieAuthentication
|
|
7
|
+
import com.smileidentity.results.SmartSelfieResult
|
|
8
|
+
import com.smileidentity.results.SmileIDResult
|
|
9
|
+
import com.smileidentity.util.randomJobId
|
|
10
|
+
import com.smileidentity.util.randomUserId
|
|
11
|
+
import timber.log.Timber
|
|
12
|
+
|
|
13
|
+
class SmileIDSmartSelfieAuthentication(context: ReactApplicationContext) : SmileIDView(context) {
|
|
14
|
+
|
|
15
|
+
override fun renderContent() {
|
|
16
|
+
product?.let {
|
|
17
|
+
composeView.apply {
|
|
18
|
+
setContent {
|
|
19
|
+
SmileID.SmartSelfieAuthentication(
|
|
20
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
21
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
22
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
23
|
+
) { result ->
|
|
24
|
+
when (result) {
|
|
25
|
+
is SmileIDResult.Success -> {
|
|
26
|
+
val json = try {
|
|
27
|
+
SmileID.moshi
|
|
28
|
+
.adapter(SmartSelfieResult::class.java)
|
|
29
|
+
.toJson(result.data)
|
|
30
|
+
} catch (e: Exception) {
|
|
31
|
+
Timber.w(e)
|
|
32
|
+
"null"
|
|
33
|
+
}
|
|
34
|
+
emitSuccess(json)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
is SmileIDResult.Error -> {
|
|
38
|
+
result.throwable.printStackTrace()
|
|
39
|
+
emitFailure(result.throwable)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import androidx.compose.runtime.saveable.rememberSaveable
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.smileidentity.SmileID
|
|
6
|
+
import com.smileidentity.compose.SmartSelfieEnrollment
|
|
7
|
+
import com.smileidentity.results.SmartSelfieResult
|
|
8
|
+
import com.smileidentity.results.SmileIDResult
|
|
9
|
+
import com.smileidentity.util.randomJobId
|
|
10
|
+
import com.smileidentity.util.randomUserId
|
|
11
|
+
import timber.log.Timber
|
|
12
|
+
|
|
13
|
+
class SmileIDSmartSelfieEnrollment (context: ReactApplicationContext) : SmileIDView(context) {
|
|
14
|
+
|
|
15
|
+
override fun renderContent() {
|
|
16
|
+
product?.let {
|
|
17
|
+
composeView.apply {
|
|
18
|
+
setContent {
|
|
19
|
+
SmileID.SmartSelfieEnrollment(
|
|
20
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
21
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
22
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
23
|
+
showInstructions = showInstructions ?: true
|
|
24
|
+
) { result ->
|
|
25
|
+
when (result) {
|
|
26
|
+
is SmileIDResult.Success -> {
|
|
27
|
+
val json = try {
|
|
28
|
+
SmileID.moshi
|
|
29
|
+
.adapter(SmartSelfieResult::class.java)
|
|
30
|
+
.toJson(result.data)
|
|
31
|
+
} catch (e: Exception) {
|
|
32
|
+
Timber.w(e)
|
|
33
|
+
"null"
|
|
34
|
+
}
|
|
35
|
+
emitSuccess(json)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
is SmileIDResult.Error -> {
|
|
39
|
+
result.throwable.printStackTrace()
|
|
40
|
+
emitFailure(result.throwable)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
package com.smileidentity.react.views
|
|
2
|
+
|
|
3
|
+
import android.view.Choreographer
|
|
4
|
+
import android.view.ViewGroup
|
|
5
|
+
import android.widget.LinearLayout
|
|
6
|
+
import androidx.compose.ui.platform.ComposeView
|
|
7
|
+
import com.facebook.react.bridge.Arguments
|
|
8
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
9
|
+
import com.facebook.react.bridge.ReactContext
|
|
10
|
+
import com.facebook.react.bridge.ReadableMap
|
|
11
|
+
import com.facebook.react.bridge.WritableMap
|
|
12
|
+
import com.facebook.react.uimanager.events.RCTEventEmitter
|
|
13
|
+
import com.smileidentity.models.JobType
|
|
14
|
+
import com.smileidentity.react.utils.getBoolOrDefault
|
|
15
|
+
import com.smileidentity.react.utils.getIntOrDefault
|
|
16
|
+
import timber.log.Timber
|
|
17
|
+
|
|
18
|
+
abstract class SmileIDView(context: ReactApplicationContext) : LinearLayout(context) {
|
|
19
|
+
val composeView: ComposeView = ComposeView(context.currentActivity!!)
|
|
20
|
+
var userId: String? = null
|
|
21
|
+
var jobId: String? = null
|
|
22
|
+
private var jobType: JobType? = null
|
|
23
|
+
var allowAgentMode: Boolean? = false
|
|
24
|
+
var showInstructions: Boolean? = true
|
|
25
|
+
private var eventEmitter: RCTEventEmitter
|
|
26
|
+
private var productThrowable: Throwable? = null
|
|
27
|
+
var product: ReadableMap? = null
|
|
28
|
+
set(value) {
|
|
29
|
+
field = value
|
|
30
|
+
render()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
init {
|
|
34
|
+
val layoutParams = ViewGroup.LayoutParams(
|
|
35
|
+
ViewGroup.LayoutParams.WRAP_CONTENT,
|
|
36
|
+
ViewGroup.LayoutParams.WRAP_CONTENT
|
|
37
|
+
)
|
|
38
|
+
eventEmitter = (context as ReactContext).getJSModule(RCTEventEmitter::class.java);
|
|
39
|
+
setLayoutParams(layoutParams)
|
|
40
|
+
orientation = VERTICAL
|
|
41
|
+
render()
|
|
42
|
+
|
|
43
|
+
composeView.layoutParams = ViewGroup.LayoutParams(
|
|
44
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
45
|
+
ViewGroup.LayoutParams.MATCH_PARENT
|
|
46
|
+
)
|
|
47
|
+
addView(composeView)
|
|
48
|
+
|
|
49
|
+
setupLayoutHack()
|
|
50
|
+
manuallyLayoutChildren()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private fun checkCommonArgs() {
|
|
54
|
+
if (product == null) {
|
|
55
|
+
productThrowable = IllegalArgumentException("Product is null")
|
|
56
|
+
emitFailure(productThrowable!!)
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
userId = product?.getString("userId")
|
|
60
|
+
jobId = product?.getString("userId")
|
|
61
|
+
|
|
62
|
+
allowAgentMode = product?.getBoolOrDefault("allowAgentMode", false)
|
|
63
|
+
showInstructions = product?.getBoolOrDefault("showInstructions", true)
|
|
64
|
+
val setJobType = product?.getIntOrDefault("jobType", null)
|
|
65
|
+
setJobType?.let { jobTypeValue ->
|
|
66
|
+
jobType = JobType.fromValue(jobTypeValue)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
abstract fun renderContent()
|
|
71
|
+
|
|
72
|
+
open fun render() {
|
|
73
|
+
checkCommonArgs();
|
|
74
|
+
checkCommonArgs();
|
|
75
|
+
renderContent()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
open fun emitSuccess(result: String) {
|
|
79
|
+
val map = Arguments.createMap().apply {
|
|
80
|
+
putString("result", result)
|
|
81
|
+
}
|
|
82
|
+
sendEvent(map)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
open fun sendEvent(map: WritableMap) {
|
|
86
|
+
val reactContext = context as ReactContext
|
|
87
|
+
reactContext.getJSModule(RCTEventEmitter::class.java)
|
|
88
|
+
.receiveEvent(id, "onSmileResult", map)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
open fun emitFailure(error: Throwable?) {
|
|
92
|
+
val map = Arguments.createMap()
|
|
93
|
+
map.putString("error", error?.message ?: "Unknown error")
|
|
94
|
+
sendEvent(map)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private fun setupLayoutHack() {
|
|
98
|
+
Choreographer.getInstance().postFrameCallback(object : Choreographer.FrameCallback {
|
|
99
|
+
override fun doFrame(frameTimeNanos: Long) {
|
|
100
|
+
manuallyLayoutChildren()
|
|
101
|
+
viewTreeObserver.dispatchOnGlobalLayout()
|
|
102
|
+
Choreographer.getInstance().postFrameCallback(this)
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private fun manuallyLayoutChildren() {
|
|
108
|
+
try {
|
|
109
|
+
for (i in 0 until childCount) {
|
|
110
|
+
val child = getChildAt(i)
|
|
111
|
+
child.measure(
|
|
112
|
+
MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY),
|
|
113
|
+
MeasureSpec.makeMeasureSpec(measuredHeight, MeasureSpec.EXACTLY)
|
|
114
|
+
)
|
|
115
|
+
child.layout(0, 0, child.measuredWidth, child.measuredHeight)
|
|
116
|
+
}
|
|
117
|
+
} catch (e: Exception) {
|
|
118
|
+
Timber.w(e)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package com.smileidentity
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Promise
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
|
+
import com.facebook.react.bridge.ReadableMap
|
|
7
|
+
|
|
8
|
+
abstract class SmileIdSpec internal constructor(context: ReactApplicationContext) :
|
|
9
|
+
ReactContextBaseJavaModule(context) {
|
|
10
|
+
|
|
11
|
+
abstract fun initialize(enableCrashReporting: Boolean,useSandBox: Boolean ,promise: Promise)
|
|
12
|
+
abstract fun doEnhancedKycAsync(request: ReadableMap, promise: Promise)
|
|
13
|
+
}
|
package/ios/SmileId.h
ADDED
package/ios/SmileId.mm
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#import "SmileId.h"
|
|
2
|
+
|
|
3
|
+
@implementation SmileId
|
|
4
|
+
RCT_EXPORT_MODULE()
|
|
5
|
+
|
|
6
|
+
// Example method
|
|
7
|
+
// See // https://reactnative.dev/docs/native-modules-ios
|
|
8
|
+
RCT_EXPORT_METHOD(multiply:(double)a
|
|
9
|
+
b:(double)b
|
|
10
|
+
resolve:(RCTPromiseResolveBlock)resolve
|
|
11
|
+
reject:(RCTPromiseRejectBlock)reject)
|
|
12
|
+
{
|
|
13
|
+
NSNumber *result = @(a * b);
|
|
14
|
+
|
|
15
|
+
resolve(result);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Don't compile this code when we build for the old architecture.
|
|
19
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
20
|
+
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
|
|
21
|
+
(const facebook::react::ObjCTurboModule::InitParams &)params
|
|
22
|
+
{
|
|
23
|
+
return std::make_shared<facebook::react::NativeSmileIdSpecJSI>(params);
|
|
24
|
+
}
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
@end
|