@smile_identity/react-native 10.0.0-beta01 → 10.0.0-beta02
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/android/gradle.properties +1 -1
- package/android/src/main/java/com/smileidentity/react/SmileIdModule.kt +59 -9
- package/android/src/main/java/com/smileidentity/react/SmileIdPackage.kt +4 -2
- package/android/src/main/java/com/smileidentity/react/utils/ReactUtils.kt +16 -10
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBiometricKYCViewManager.kt +38 -9
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDConsentViewManager.kt +77 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDDocumentVerificationViewManager.kt +43 -9
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDEnhancedDocumentVerificationViewManager.kt +75 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieAuthenticationViewManager.kt +35 -9
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDSmartSelfieEnrollmentViewManager.kt +35 -9
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYCView.kt +54 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDConsentView.kt +60 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt +69 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDEnhancedDocumentVerificationView.kt +63 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt +50 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt +49 -0
- package/android/src/main/java/com/smileidentity/react/views/SmileIDView.kt +2 -27
- package/android/src/oldarch/SmileIdSpec.kt +4 -1
- package/ios/RNDelegates/SmileIDUIViewDelegate.swift +4 -0
- package/ios/RNDelegates/SmileIDViewDelegate.swift +5 -0
- package/ios/RNSmileID.mm +7 -0
- package/ios/RNSmileID.swift +147 -0
- package/ios/SmileId.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/SmileId.xcodeproj/project.xcworkspace/xcuserdata/japhetndhlovu.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/SmileId.xcodeproj/xcuserdata/japhetndhlovu.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/Utils/SmileIDDictExt.swift +50 -0
- package/ios/Utils/SmileIDUtils.swift +10 -0
- package/ios/View/BaseSmileIDView.swift +35 -0
- package/ios/View/SmileIDBiometricKYCView.swift +44 -0
- package/ios/View/SmileIDConsentView.swift +35 -0
- package/ios/View/SmileIDDocumentVerificationView.swift +53 -0
- package/ios/View/SmileIDEnhancedDocumentVerificationView.swift +53 -0
- package/ios/View/SmileIDSmartSelfieAuthView.swift +39 -0
- package/ios/View/SmileIDSmartSelfieEnrollmentView.swift +39 -0
- package/ios/ViewManagers/SmileIDBaseViewManager.swift +17 -0
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDBiometricKYCViewManager.swift +33 -0
- package/ios/ViewManagers/SmileIDConsentViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDConsentViewManager.swift +47 -0
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDDocumentVerificationViewManager.swift +48 -0
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDEnhancedDocumentVerificationViewManager.swift +48 -0
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDSmartSelfieAuthenticationViewManager.swift +26 -0
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.m +6 -0
- package/ios/ViewManagers/SmileIDSmartSelfieEnrollmentViewManager.swift +26 -0
- package/ios/ViewModels/SmileIDProductModel.swift +29 -0
- package/ios/react-native-smile-id-Bridging-Header.h +8 -0
- package/lib/commonjs/NativeSmileId.js +1 -1
- package/lib/commonjs/NativeSmileId.js.map +1 -1
- package/lib/commonjs/SmileIDBiometricKYCView.js +40 -0
- package/lib/commonjs/SmileIDBiometricKYCView.js.map +1 -0
- package/lib/commonjs/SmileIDConsentView.js +40 -0
- package/lib/commonjs/SmileIDConsentView.js.map +1 -0
- package/lib/commonjs/SmileIDDocumentVerificationView.js +40 -0
- package/lib/commonjs/SmileIDDocumentVerificationView.js.map +1 -0
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js +40 -0
- package/lib/commonjs/SmileIDEnhancedDocumentVerificationView.js.map +1 -0
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js +40 -0
- package/lib/commonjs/SmileIDSmartSelfieAuthenticationView.js.map +1 -0
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js +40 -0
- package/lib/commonjs/SmileIDSmartSelfieEnrollmentView.js.map +1 -0
- package/lib/commonjs/index.js +98 -27
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/NativeSmileId.js +1 -1
- package/lib/module/NativeSmileId.js.map +1 -1
- package/lib/module/SmileIDBiometricKYCView.js +30 -0
- package/lib/module/SmileIDBiometricKYCView.js.map +1 -0
- package/lib/module/SmileIDConsentView.js +30 -0
- package/lib/module/SmileIDConsentView.js.map +1 -0
- package/lib/module/SmileIDDocumentVerificationView.js +30 -0
- package/lib/module/SmileIDDocumentVerificationView.js.map +1 -0
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js +30 -0
- package/lib/module/SmileIDEnhancedDocumentVerificationView.js.map +1 -0
- package/lib/module/SmileIDSmartSelfieAuthenticationView.js +30 -0
- package/lib/module/SmileIDSmartSelfieAuthenticationView.js.map +1 -0
- package/lib/module/SmileIDSmartSelfieEnrollmentView.js +30 -0
- package/lib/module/SmileIDSmartSelfieEnrollmentView.js.map +1 -0
- package/lib/module/index.js +33 -21
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/NativeSmileId.d.ts +16 -1
- package/lib/typescript/NativeSmileId.d.ts.map +1 -1
- package/lib/typescript/SmileIDBiometricKYCView.d.ts +8 -0
- package/lib/typescript/SmileIDBiometricKYCView.d.ts.map +1 -0
- package/lib/typescript/SmileIDConsentView.d.ts +8 -0
- package/lib/typescript/SmileIDConsentView.d.ts.map +1 -0
- package/lib/typescript/SmileIDDocumentVerificationView.d.ts +8 -0
- package/lib/typescript/SmileIDDocumentVerificationView.d.ts.map +1 -0
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts +8 -0
- package/lib/typescript/SmileIDEnhancedDocumentVerificationView.d.ts.map +1 -0
- package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts +8 -0
- package/lib/typescript/SmileIDSmartSelfieAuthenticationView.d.ts.map +1 -0
- package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts +8 -0
- package/lib/typescript/SmileIDSmartSelfieEnrollmentView.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +24 -86
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +182 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +1 -2
- package/react-native-smile-id.podspec +2 -2
- package/src/NativeSmileId.ts +17 -5
- package/src/SmileIDBiometricKYCView.tsx +45 -0
- package/src/SmileIDConsentView.tsx +44 -0
- package/src/SmileIDDocumentVerificationView.tsx +51 -0
- package/src/SmileIDEnhancedDocumentVerificationView.tsx +51 -0
- package/src/SmileIDSmartSelfieAuthenticationView.tsx +51 -0
- package/src/SmileIDSmartSelfieEnrollmentView.tsx +51 -0
- package/src/index.tsx +54 -122
- package/src/types.ts +189 -0
- package/android/src/main/java/com/smileidentity/react/viewmanagers/SmileIDBVNConsentViewManager.kt +0 -42
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBVNConsentScreen.kt +0 -54
- package/android/src/main/java/com/smileidentity/react/views/SmileIDBiometricKYC.kt +0 -89
- package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerification.kt +0 -59
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthentication.kt +0 -47
- package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollment.kt +0 -48
- package/ios/SmileId.h +0 -12
- package/ios/SmileId.mm +0 -27
|
@@ -0,0 +1,54 @@
|
|
|
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.BiometricKYC
|
|
7
|
+
import com.smileidentity.models.IdInfo
|
|
8
|
+
import com.smileidentity.results.BiometricKycResult
|
|
9
|
+
import com.smileidentity.results.SmileIDResult
|
|
10
|
+
import com.smileidentity.util.randomJobId
|
|
11
|
+
import com.smileidentity.util.randomUserId
|
|
12
|
+
import timber.log.Timber
|
|
13
|
+
|
|
14
|
+
class SmileIDBiometricKYCView(context: ReactApplicationContext) : SmileIDView(context) {
|
|
15
|
+
var idInfo: IdInfo? = null
|
|
16
|
+
override fun renderContent() {
|
|
17
|
+
idInfo ?: run {
|
|
18
|
+
emitFailure(IllegalArgumentException("idInfo is required for BiometricKYC"))
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
composeView.apply {
|
|
23
|
+
setContent {
|
|
24
|
+
SmileID.BiometricKYC(
|
|
25
|
+
idInfo = idInfo!!,
|
|
26
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
27
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
28
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
29
|
+
showAttribution = showInstructions ?: true,
|
|
30
|
+
) { result ->
|
|
31
|
+
when (result) {
|
|
32
|
+
is SmileIDResult.Success -> {
|
|
33
|
+
val json = try {
|
|
34
|
+
SmileID.moshi
|
|
35
|
+
.adapter(BiometricKycResult::class.java)
|
|
36
|
+
.toJson(result.data)
|
|
37
|
+
} catch (e: Exception) {
|
|
38
|
+
Timber.w(e)
|
|
39
|
+
"null"
|
|
40
|
+
}
|
|
41
|
+
emitSuccess(json)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
is SmileIDResult.Error -> {
|
|
45
|
+
result.throwable.printStackTrace()
|
|
46
|
+
emitFailure(result.throwable)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
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.ConsentScreen
|
|
8
|
+
import java.net.URL
|
|
9
|
+
|
|
10
|
+
class SmileIDConsentView(context: ReactApplicationContext) : SmileIDView(context) {
|
|
11
|
+
var partnerName : String? = null
|
|
12
|
+
var partnerPrivacyPolicy : String? = null
|
|
13
|
+
var logoResName : String? = null
|
|
14
|
+
var productName : String? = null
|
|
15
|
+
override fun renderContent() {
|
|
16
|
+
partnerName ?: run {
|
|
17
|
+
emitFailure(IllegalArgumentException("partnerName is required for BiometricKYC"))
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
partnerPrivacyPolicy?: run {
|
|
21
|
+
emitFailure(IllegalArgumentException("partnerPrivacyPolicy is required for BiometricKYC"))
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
if (!URLUtil.isValidUrl(partnerPrivacyPolicy)) {
|
|
25
|
+
emitFailure(IllegalArgumentException("a valid url for partnerPrivacyPolicy is required for BiometricKYC"))
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
logoResName ?: run {
|
|
29
|
+
emitFailure(IllegalArgumentException("partnerIcon is required for BiometricKYC"))
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
productName ?: run {
|
|
33
|
+
emitFailure(IllegalArgumentException("productName is required for BiometricKYC"))
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
val partnerIcon = context.resources.getIdentifier(
|
|
37
|
+
logoResName,
|
|
38
|
+
"drawable",
|
|
39
|
+
(context as? ReactApplicationContext)?.currentActivity?.packageName
|
|
40
|
+
)
|
|
41
|
+
composeView.apply {
|
|
42
|
+
setContent {
|
|
43
|
+
SmileID.ConsentScreen(
|
|
44
|
+
partnerIcon = painterResource(
|
|
45
|
+
id = partnerIcon
|
|
46
|
+
),
|
|
47
|
+
partnerName = partnerName!!,
|
|
48
|
+
productName = productName!!,
|
|
49
|
+
partnerPrivacyPolicy = URL(partnerPrivacyPolicy),
|
|
50
|
+
onConsentDenied = {
|
|
51
|
+
emitSuccess("denied")
|
|
52
|
+
},
|
|
53
|
+
onConsentGranted = {
|
|
54
|
+
emitSuccess("accepted")
|
|
55
|
+
},
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
package/android/src/main/java/com/smileidentity/react/views/SmileIDDocumentVerificationView.kt
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
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.results.DocumentVerificationResult
|
|
8
|
+
import com.smileidentity.results.SmileIDResult
|
|
9
|
+
import com.smileidentity.util.randomJobId
|
|
10
|
+
import com.smileidentity.util.randomUserId
|
|
11
|
+
import kotlinx.collections.immutable.toImmutableMap
|
|
12
|
+
import timber.log.Timber
|
|
13
|
+
import java.io.File
|
|
14
|
+
|
|
15
|
+
class SmileIDDocumentVerificationView(context: ReactApplicationContext) : SmileIDView(context) {
|
|
16
|
+
var countryCode: String? = null
|
|
17
|
+
var allowGalleryUpload: Boolean = false
|
|
18
|
+
var captureBothSides: Boolean = true
|
|
19
|
+
var bypassSelfieCaptureWithFilePath: String? = null
|
|
20
|
+
var documentType: String? = null
|
|
21
|
+
var idAspectRatio: Float? = null
|
|
22
|
+
|
|
23
|
+
override fun renderContent() {
|
|
24
|
+
countryCode ?: run {
|
|
25
|
+
emitFailure(IllegalArgumentException("countryCode is required for DocumentVerification"))
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
var bypassSelfieCaptureWithFile: File? = null
|
|
29
|
+
bypassSelfieCaptureWithFilePath?.let {
|
|
30
|
+
bypassSelfieCaptureWithFile = File(it)
|
|
31
|
+
}
|
|
32
|
+
composeView.apply {
|
|
33
|
+
setContent {
|
|
34
|
+
SmileID.DocumentVerification(
|
|
35
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
36
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
37
|
+
countryCode = countryCode!!,
|
|
38
|
+
documentType = documentType,
|
|
39
|
+
idAspectRatio = idAspectRatio,
|
|
40
|
+
showAttribution = showAttribution ?: true,
|
|
41
|
+
showInstructions = showInstructions ?: true,
|
|
42
|
+
allowGalleryUpload = allowGalleryUpload,
|
|
43
|
+
captureBothSides = captureBothSides,
|
|
44
|
+
bypassSelfieCaptureWithFile = bypassSelfieCaptureWithFile,
|
|
45
|
+
extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
|
|
46
|
+
) { result ->
|
|
47
|
+
when (result) {
|
|
48
|
+
is SmileIDResult.Success -> {
|
|
49
|
+
val json = try {
|
|
50
|
+
SmileID.moshi
|
|
51
|
+
.adapter(DocumentVerificationResult::class.java)
|
|
52
|
+
.toJson(result.data)
|
|
53
|
+
} catch (e: Exception) {
|
|
54
|
+
Timber.w(e)
|
|
55
|
+
"null"
|
|
56
|
+
}
|
|
57
|
+
emitSuccess(json)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
is SmileIDResult.Error -> {
|
|
61
|
+
result.throwable.printStackTrace()
|
|
62
|
+
emitFailure(result.throwable)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
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.EnhancedDocumentVerificationScreen
|
|
7
|
+
import com.smileidentity.results.EnhancedDocumentVerificationResult
|
|
8
|
+
import com.smileidentity.results.SmileIDResult
|
|
9
|
+
import com.smileidentity.util.randomJobId
|
|
10
|
+
import com.smileidentity.util.randomUserId
|
|
11
|
+
import kotlinx.collections.immutable.toImmutableMap
|
|
12
|
+
import timber.log.Timber
|
|
13
|
+
|
|
14
|
+
class SmileIDEnhancedDocumentVerificationView(context: ReactApplicationContext) :
|
|
15
|
+
SmileIDView(context) {
|
|
16
|
+
var countryCode: String? = null
|
|
17
|
+
var allowGalleryUpload: Boolean = false
|
|
18
|
+
var captureBothSides: Boolean = true
|
|
19
|
+
var documentType: String? = null
|
|
20
|
+
var idAspectRatio: Float? = null
|
|
21
|
+
|
|
22
|
+
override fun renderContent() {
|
|
23
|
+
countryCode ?: run {
|
|
24
|
+
emitFailure(IllegalArgumentException("countryCode is required for DocumentVerification"))
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
composeView.apply {
|
|
28
|
+
setContent {
|
|
29
|
+
SmileID.EnhancedDocumentVerificationScreen(
|
|
30
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
31
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
32
|
+
countryCode = countryCode!!,
|
|
33
|
+
documentType = documentType,
|
|
34
|
+
idAspectRatio = idAspectRatio,
|
|
35
|
+
showAttribution = showAttribution ?: true,
|
|
36
|
+
showInstructions = showInstructions ?: true,
|
|
37
|
+
allowGalleryUpload = allowGalleryUpload,
|
|
38
|
+
captureBothSides = captureBothSides,
|
|
39
|
+
extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
|
|
40
|
+
) { result ->
|
|
41
|
+
when (result) {
|
|
42
|
+
is SmileIDResult.Success -> {
|
|
43
|
+
val json = try {
|
|
44
|
+
SmileID.moshi
|
|
45
|
+
.adapter(EnhancedDocumentVerificationResult::class.java)
|
|
46
|
+
.toJson(result.data)
|
|
47
|
+
} catch (e: Exception) {
|
|
48
|
+
Timber.w(e)
|
|
49
|
+
"null"
|
|
50
|
+
}
|
|
51
|
+
emitSuccess(json)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
is SmileIDResult.Error -> {
|
|
55
|
+
result.throwable.printStackTrace()
|
|
56
|
+
emitFailure(result.throwable)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieAuthenticationView.kt
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
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 kotlinx.collections.immutable.toImmutableMap
|
|
12
|
+
import timber.log.Timber
|
|
13
|
+
|
|
14
|
+
class SmileIDSmartSelfieAuthenticationView(context: ReactApplicationContext) :
|
|
15
|
+
SmileIDView(context) {
|
|
16
|
+
|
|
17
|
+
override fun renderContent() {
|
|
18
|
+
composeView.apply {
|
|
19
|
+
setContent {
|
|
20
|
+
SmileID.SmartSelfieAuthentication(
|
|
21
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
22
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
23
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
24
|
+
showAttribution = showAttribution ?: true,
|
|
25
|
+
showInstructions = showInstructions ?: true,
|
|
26
|
+
extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
|
|
27
|
+
) { result ->
|
|
28
|
+
when (result) {
|
|
29
|
+
is SmileIDResult.Success -> {
|
|
30
|
+
val json = try {
|
|
31
|
+
SmileID.moshi
|
|
32
|
+
.adapter(SmartSelfieResult::class.java)
|
|
33
|
+
.toJson(result.data)
|
|
34
|
+
} catch (e: Exception) {
|
|
35
|
+
Timber.w(e)
|
|
36
|
+
"null"
|
|
37
|
+
}
|
|
38
|
+
emitSuccess(json)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
is SmileIDResult.Error -> {
|
|
42
|
+
result.throwable.printStackTrace()
|
|
43
|
+
emitFailure(result.throwable)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
package/android/src/main/java/com/smileidentity/react/views/SmileIDSmartSelfieEnrollmentView.kt
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
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 kotlinx.collections.immutable.toImmutableMap
|
|
12
|
+
import timber.log.Timber
|
|
13
|
+
|
|
14
|
+
class SmileIDSmartSelfieEnrollmentView(context: ReactApplicationContext) : SmileIDView(context) {
|
|
15
|
+
|
|
16
|
+
override fun renderContent() {
|
|
17
|
+
composeView.apply {
|
|
18
|
+
setContent {
|
|
19
|
+
SmileID.SmartSelfieEnrollment(
|
|
20
|
+
userId = userId ?: rememberSaveable { randomUserId() },
|
|
21
|
+
jobId = jobId ?: rememberSaveable { randomJobId() },
|
|
22
|
+
allowAgentMode = allowAgentMode ?: false,
|
|
23
|
+
showAttribution = showAttribution ?: true,
|
|
24
|
+
showInstructions = showInstructions ?: true,
|
|
25
|
+
extraPartnerParams = (extraPartnerParams ?: mapOf()).toImmutableMap(),
|
|
26
|
+
) { result ->
|
|
27
|
+
when (result) {
|
|
28
|
+
is SmileIDResult.Success -> {
|
|
29
|
+
val json = try {
|
|
30
|
+
SmileID.moshi
|
|
31
|
+
.adapter(SmartSelfieResult::class.java)
|
|
32
|
+
.toJson(result.data)
|
|
33
|
+
} catch (e: Exception) {
|
|
34
|
+
Timber.w(e)
|
|
35
|
+
"null"
|
|
36
|
+
}
|
|
37
|
+
emitSuccess(json)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
is SmileIDResult.Error -> {
|
|
41
|
+
result.throwable.printStackTrace()
|
|
42
|
+
emitFailure(result.throwable)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -7,12 +7,9 @@ import androidx.compose.ui.platform.ComposeView
|
|
|
7
7
|
import com.facebook.react.bridge.Arguments
|
|
8
8
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
9
9
|
import com.facebook.react.bridge.ReactContext
|
|
10
|
-
import com.facebook.react.bridge.ReadableMap
|
|
11
10
|
import com.facebook.react.bridge.WritableMap
|
|
12
11
|
import com.facebook.react.uimanager.events.RCTEventEmitter
|
|
13
12
|
import com.smileidentity.models.JobType
|
|
14
|
-
import com.smileidentity.react.utils.getBoolOrDefault
|
|
15
|
-
import com.smileidentity.react.utils.getIntOrDefault
|
|
16
13
|
import timber.log.Timber
|
|
17
14
|
|
|
18
15
|
abstract class SmileIDView(context: ReactApplicationContext) : LinearLayout(context) {
|
|
@@ -22,13 +19,10 @@ abstract class SmileIDView(context: ReactApplicationContext) : LinearLayout(cont
|
|
|
22
19
|
private var jobType: JobType? = null
|
|
23
20
|
var allowAgentMode: Boolean? = false
|
|
24
21
|
var showInstructions: Boolean? = true
|
|
22
|
+
var showAttribution: Boolean? = true
|
|
23
|
+
var extraPartnerParams: Map<String, String>? = null
|
|
25
24
|
private var eventEmitter: RCTEventEmitter
|
|
26
25
|
private var productThrowable: Throwable? = null
|
|
27
|
-
var product: ReadableMap? = null
|
|
28
|
-
set(value) {
|
|
29
|
-
field = value
|
|
30
|
-
render()
|
|
31
|
-
}
|
|
32
26
|
|
|
33
27
|
init {
|
|
34
28
|
val layoutParams = ViewGroup.LayoutParams(
|
|
@@ -50,28 +44,9 @@ abstract class SmileIDView(context: ReactApplicationContext) : LinearLayout(cont
|
|
|
50
44
|
manuallyLayoutChildren()
|
|
51
45
|
}
|
|
52
46
|
|
|
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
47
|
abstract fun renderContent()
|
|
71
48
|
|
|
72
49
|
open fun render() {
|
|
73
|
-
checkCommonArgs();
|
|
74
|
-
checkCommonArgs();
|
|
75
50
|
renderContent()
|
|
76
51
|
}
|
|
77
52
|
|
|
@@ -8,6 +8,9 @@ import com.facebook.react.bridge.ReadableMap
|
|
|
8
8
|
abstract class SmileIdSpec internal constructor(context: ReactApplicationContext) :
|
|
9
9
|
ReactContextBaseJavaModule(context) {
|
|
10
10
|
|
|
11
|
-
abstract fun initialize(
|
|
11
|
+
abstract fun initialize(useSandBox: Boolean ,promise: Promise)
|
|
12
|
+
|
|
13
|
+
abstract fun disableCrashReporting(promise: Promise)
|
|
12
14
|
abstract fun doEnhancedKycAsync(request: ReadableMap, promise: Promise)
|
|
15
|
+
abstract fun doEnhancedKyc(request: ReadableMap, promise: Promise)
|
|
13
16
|
}
|
package/ios/RNSmileID.mm
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
|
|
3
|
+
@interface RCT_EXTERN_MODULE(RNSmileID, NSObject)
|
|
4
|
+
RCT_EXTERN_METHOD(initialize:(BOOL)useSandBox withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
|
|
5
|
+
RCT_EXTERN_METHOD(doEnhancedKyc:(NSDictionary *)request withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
|
|
6
|
+
RCT_EXTERN_METHOD(doEnhancedKycAsync:(NSDictionary *)request withResolver:(RCTPromiseResolveBlock)resolve withRejecter:(RCTPromiseRejectBlock)reject)
|
|
7
|
+
@end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import Combine
|
|
2
|
+
import SmileID
|
|
3
|
+
|
|
4
|
+
@objc(RNSmileID)
|
|
5
|
+
class RNSmileID: NSObject {
|
|
6
|
+
private var cancellables = Set<AnyCancellable>()
|
|
7
|
+
|
|
8
|
+
@objc(initialize:withResolver:withRejecter:)
|
|
9
|
+
func initialize(useSandBox: Bool, resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
10
|
+
SmileID.initialize(useSandbox: useSandBox)
|
|
11
|
+
resolve(nil)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@objc(doEnhancedKyc:withResolver:withRejecter:)
|
|
15
|
+
func doEnhancedKyc(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
16
|
+
guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
|
|
17
|
+
reject("doEnhancedKyc", "partnerParams is required", nil)
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
21
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
22
|
+
return
|
|
23
|
+
}
|
|
24
|
+
guard let country = request["country"] as? String else {
|
|
25
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
26
|
+
return
|
|
27
|
+
}
|
|
28
|
+
guard let idType = request["idType"] as? String else {
|
|
29
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
33
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
37
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
guard let signature = request["signature"] as? String else {
|
|
41
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let request = EnhancedKycRequest(
|
|
46
|
+
country: country,
|
|
47
|
+
idType: idType,
|
|
48
|
+
idNumber: idNumber,
|
|
49
|
+
firstName: request["firstName"] as? String,
|
|
50
|
+
middleName: request["middleName"] as? String,
|
|
51
|
+
lastName: request["lastName"] as? String,
|
|
52
|
+
dob: request["dob"] as? String,
|
|
53
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
54
|
+
bankCode: request["bankCode"] as? String,
|
|
55
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
56
|
+
partnerParams: partnerParams,
|
|
57
|
+
sourceSdk: "ios (react-native)",
|
|
58
|
+
timestamp: timestamp,
|
|
59
|
+
signature: signature
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
SmileID.api.doEnhancedKyc(request: request)
|
|
63
|
+
.sink(receiveCompletion: { completion in
|
|
64
|
+
switch completion {
|
|
65
|
+
case let .failure(error):
|
|
66
|
+
reject("Error", error.localizedDescription, error)
|
|
67
|
+
case .finished:
|
|
68
|
+
break
|
|
69
|
+
}
|
|
70
|
+
}, receiveValue: { response in
|
|
71
|
+
let encoder = JSONEncoder()
|
|
72
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
73
|
+
reject("Error", "doEnhancedKyc encoding error ",
|
|
74
|
+
SmileIDError.unknown("doEnhancedKyc encoding error "))
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
resolve(["result": String(data: jsonData, encoding: .utf8)!]) // Assuming you have a method to convert response to a dictionary
|
|
78
|
+
}).store(in: &cancellables)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@objc(doEnhancedKycAsync:withResolver:withRejecter:)
|
|
82
|
+
func doEnhancedKycAsync(request: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
83
|
+
guard let partnerParamsDict = request["partnerParams"] as? NSDictionary else {
|
|
84
|
+
reject("doEnhancedKyc", "partnerParams is required", nil)
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
guard let partnerParams = partnerParamsDict.toPartnerParams() else {
|
|
88
|
+
reject("doEnhancedKyc", "partnerParams is missing required data", nil)
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
guard let country = request["country"] as? String else {
|
|
92
|
+
reject("doEnhancedKyc", "country is required", nil)
|
|
93
|
+
return
|
|
94
|
+
}
|
|
95
|
+
guard let idType = request["idType"] as? String else {
|
|
96
|
+
reject("doEnhancedKyc", "idType is required", nil)
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
guard let idNumber = request["idNumber"] as? String else {
|
|
100
|
+
reject("doEnhancedKyc", "idNumber is required", nil)
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
guard let timestamp = request["timestamp"] as? String else {
|
|
104
|
+
reject("doEnhancedKyc", "timestamp is required", nil)
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
guard let signature = request["signature"] as? String else {
|
|
108
|
+
reject("doEnhancedKyc", "signature is required", nil)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let request = EnhancedKycRequest(
|
|
113
|
+
country: country,
|
|
114
|
+
idType: idType,
|
|
115
|
+
idNumber: idNumber,
|
|
116
|
+
firstName: request["firstName"] as? String,
|
|
117
|
+
middleName: request["middleName"] as? String,
|
|
118
|
+
lastName: request["lastName"] as? String,
|
|
119
|
+
dob: request["dob"] as? String,
|
|
120
|
+
phoneNumber: request["phoneNumber"] as? String,
|
|
121
|
+
bankCode: request["bankCode"] as? String,
|
|
122
|
+
callbackUrl: request["callbackUrl"] as? String,
|
|
123
|
+
partnerParams: partnerParams,
|
|
124
|
+
sourceSdk: "ios (react-native)",
|
|
125
|
+
timestamp: timestamp,
|
|
126
|
+
signature: signature
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
SmileID.api.doEnhancedKycAsync(request: request)
|
|
130
|
+
.sink(receiveCompletion: { completion in
|
|
131
|
+
switch completion {
|
|
132
|
+
case let .failure(error):
|
|
133
|
+
reject("Error", error.localizedDescription, error)
|
|
134
|
+
case .finished:
|
|
135
|
+
break
|
|
136
|
+
}
|
|
137
|
+
}, receiveValue: { response in
|
|
138
|
+
let encoder = JSONEncoder()
|
|
139
|
+
guard let jsonData = try? encoder.encode(response) else {
|
|
140
|
+
reject("Error", "doEnhancedKyc encoding error ",
|
|
141
|
+
SmileIDError.unknown("doEnhancedKyc encoding error "))
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
resolve(["result": String(data: jsonData, encoding: .utf8)!]) // Assuming you have a method to convert response to a dictionary
|
|
145
|
+
}).store(in: &cancellables)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>SchemeUserState</key>
|
|
6
|
+
<dict>
|
|
7
|
+
<key>SmileId.xcscheme_^#shared#^_</key>
|
|
8
|
+
<dict>
|
|
9
|
+
<key>orderHint</key>
|
|
10
|
+
<integer>0</integer>
|
|
11
|
+
</dict>
|
|
12
|
+
</dict>
|
|
13
|
+
</dict>
|
|
14
|
+
</plist>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import SmileID
|
|
3
|
+
|
|
4
|
+
extension NSDictionary {
|
|
5
|
+
func toIdInfo() -> IdInfo? {
|
|
6
|
+
guard let country = self["country"] as? String else {
|
|
7
|
+
return nil
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let idType = self["id_type"] as? String
|
|
11
|
+
let idNumber = self["id_number"] as? String
|
|
12
|
+
let firstName = self["first_name"] as? String
|
|
13
|
+
let middleName = self["middle_name"] as? String
|
|
14
|
+
let lastName = self["last_name"] as? String
|
|
15
|
+
let dob = self["dob"] as? String
|
|
16
|
+
let bankCode = self["bank_code"] as? String
|
|
17
|
+
let entered = self["entered"] as? Bool
|
|
18
|
+
|
|
19
|
+
return IdInfo(
|
|
20
|
+
country: country,
|
|
21
|
+
idType: idType,
|
|
22
|
+
idNumber: idNumber,
|
|
23
|
+
firstName: firstName,
|
|
24
|
+
middleName: middleName,
|
|
25
|
+
lastName: lastName,
|
|
26
|
+
dob: dob,
|
|
27
|
+
bankCode: bankCode,
|
|
28
|
+
entered: entered
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
func toPartnerParams() -> PartnerParams? {
|
|
33
|
+
guard let country = self["country"] as? String else {
|
|
34
|
+
return nil
|
|
35
|
+
}
|
|
36
|
+
var jobType: JobType?
|
|
37
|
+
let jobId = self["jobId"] as? String
|
|
38
|
+
let userId = self["userId"] as? String
|
|
39
|
+
if let jobTypeValue = self["jobType"] as? Int {
|
|
40
|
+
jobType = JobType(rawValue: jobTypeValue)
|
|
41
|
+
}
|
|
42
|
+
let extras = self["extras"] as? [String: String] ?? [:]
|
|
43
|
+
return PartnerParams(
|
|
44
|
+
jobId: jobId ?? generateJobId(),
|
|
45
|
+
userId: userId ?? generateUserId(),
|
|
46
|
+
jobType: jobType,
|
|
47
|
+
extras: extras
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
}
|