@soyio/soyio-rn-sdk 2.3.1 → 3.1.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 (137) hide show
  1. package/README.md +287 -132
  2. package/android/build.gradle +56 -0
  3. package/android/libs/facetec-sdk-9.7.96.aar +0 -0
  4. package/android/src/main/AndroidManifest.xml +8 -0
  5. package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkModule.kt +224 -0
  6. package/android/src/main/java/com/soyio/soyiorndk/AndroidFacetecSdkPackage.kt +16 -0
  7. package/android/src/main/java/com/soyio/soyiorndk/ApiDate.kt +5 -0
  8. package/android/src/main/java/com/soyio/soyiorndk/BaseFaceTecProcessor.kt +44 -0
  9. package/android/src/main/java/com/soyio/soyiorndk/FaceTecRequestService.kt +115 -0
  10. package/android/src/main/java/com/soyio/soyiorndk/FacetecConfig.kt +308 -0
  11. package/android/src/main/java/com/soyio/soyiorndk/SoyioIdOnlyProcessor.kt +81 -0
  12. package/android/src/main/java/com/soyio/soyiorndk/SoyioValidationProcessor.kt +134 -0
  13. package/android/src/main/res/values/strings.xml +134 -0
  14. package/assets/adaptive-icon.png +0 -0
  15. package/assets/favicon.png +0 -0
  16. package/assets/fonts/RobotoFlex.ttf +0 -0
  17. package/assets/icon.png +0 -0
  18. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/Contents.json +23 -0
  19. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@1x.png +0 -0
  20. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@2x.png +0 -0
  21. package/assets/images/SoyioRnSdk.xcassets/facetec-close.imageset/facetec-close@3x.png +0 -0
  22. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/Contents.json +23 -0
  23. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@1x.png +0 -0
  24. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@2x.png +0 -0
  25. package/assets/images/SoyioRnSdk.xcassets/facetec-id-front.imageset/facetec-id-front@3x.png +0 -0
  26. package/assets/splash.png +0 -0
  27. package/index.ts +14 -3
  28. package/ios/ApiDate.swift +5 -0
  29. package/ios/FacetecConfig.swift +217 -0
  30. package/ios/FacetecStrings.swift +139 -0
  31. package/ios/Frameworks/FaceTecSDK.framework/Assets.car +0 -0
  32. package/ios/Frameworks/FaceTecSDK.framework/FaceTecSDK +0 -0
  33. package/ios/Frameworks/FaceTecSDK.framework/GenericGuidanceContentLayout.nib +0 -0
  34. package/ios/Frameworks/FaceTecSDK.framework/Headers/FaceTecPublicApi.h +1935 -0
  35. package/ios/Frameworks/FaceTecSDK.framework/Headers/FaceTecPublicStringKeys.h +109 -0
  36. package/ios/Frameworks/FaceTecSDK.framework/Headers/FaceTecSDK.h +16 -0
  37. package/ios/Frameworks/FaceTecSDK.framework/Info.plist +0 -0
  38. package/ios/Frameworks/FaceTecSDK.framework/Modules/module.modulemap +6 -0
  39. package/ios/Frameworks/FaceTecSDK.framework/PrivacyInfo.xcprivacy +29 -0
  40. package/ios/Frameworks/FaceTecSDK.framework/ReadyScreenGuidanceContentLayout.nib +0 -0
  41. package/ios/Frameworks/FaceTecSDK.framework/RetryScreenGuidanceContentLayout.nib +0 -0
  42. package/ios/Frameworks/FaceTecSDK.framework/SharedGuidanceLayout.nib +0 -0
  43. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/9Uo-4b-JiE-view-Ae0-rb-UqS.nib +0 -0
  44. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/CJ6-MX-bJp-view-8JL-Rc-0g1.nib +0 -0
  45. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/FaceScanViewController.nib +0 -0
  46. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecAdditionalReviewViewController.nib +0 -0
  47. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecIDFeedbackViewController.nib +0 -0
  48. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/FaceTecOCRConfirmationViewController.nib +0 -0
  49. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/IDCaptureViewController.nib +0 -0
  50. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/IDSelectionViewController.nib +0 -0
  51. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/Info.plist +0 -0
  52. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/Pyw-6G-JSY-view-Zue-Eo-Q2U.nib +0 -0
  53. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/QWA-8Y-vUM-view-wJB-Z5-eD2.nib +0 -0
  54. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/alz-Ia-X3d-view-IKu-EI-Hug.nib +0 -0
  55. package/ios/Frameworks/FaceTecSDK.framework/Storyboard.storyboardc/l2Q-cc-kD8-view-UUy-6c-meu.nib +0 -0
  56. package/ios/Frameworks/FaceTecSDK.framework/attributions.txt +462 -0
  57. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/1f5b84f51ce0fcfbb76e904b7bcaa7560f601e1394a0b29367a09385312287eb +0 -0
  58. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/2b075ac1a6132b5b8a4c9ef0ba6b0cd84db7838aca9a000e50d907f40770a4ab +0 -0
  59. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/59cc2a9af81aaca2376702c2490650f4da2775fa673274db98aad41b7ef101c0 +0 -0
  60. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/5b63e98b991aedabb60665503384f30bffd939decf9433883b30b78011ee501a +0 -0
  61. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/66388dc76dc16bc6b76b682edd218a575bf45b9b +0 -0
  62. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/6b3133f0f39ff89a2a169d61176ee17cafacc5e288f334e2b64ee82892d11ccd +0 -0
  63. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/9077d16225f9314163ef1e7db6fc7d4088bb903d134bd95f23d5591ca4dfbfca +0 -0
  64. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/a74f2afb9d20f2375ccbd14e67c094b85c89ceb608f7cf8ae04f3f646a6c5672 +0 -0
  65. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/b501893e75f62ee1707643e35b21109927b07ed5b202321c961b424cbc2e4695 +0 -0
  66. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/dbd7a353f0130bb983d6ba05917e9be991d70e8f028df4b74e30bc6497ef7f71 +0 -0
  67. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/f2.xml +0 -0
  68. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/fd6d368a5658496536e2bfae170d1b823a3629b242cafc09784bfba4e56d8c80 +0 -0
  69. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/marker +0 -0
  70. package/ios/Frameworks/FaceTecSDK.framework/cache_uyertuazlkxcjrlwkejr/39bb748b334003e3fa/vu0ilin6we3lrzo5f83f7qs2jul4aq7v4aoynrmch8zfvpi8ezrfyafa4t0fx87l +0 -0
  71. package/ios/Frameworks/FaceTecSDK.framework/strip-unused-architectures-from-target.sh +62 -0
  72. package/ios/IOSFacetecSdk.m +22 -0
  73. package/ios/IOSFacetecSdk.swift +219 -0
  74. package/ios/ProcessorProtocol.swift +6 -0
  75. package/ios/SoyioIDOnlyProcessor.swift +168 -0
  76. package/ios/SoyioPhotoIDMatchProcessor.swift +262 -0
  77. package/package/index.d.ts +4 -2
  78. package/package/index.js +6 -3
  79. package/package/index.js.map +1 -0
  80. package/package/src/api/facetec.d.ts +3 -0
  81. package/package/src/api/facetec.js +109 -0
  82. package/package/src/api/facetec.js.map +1 -0
  83. package/package/src/bridges/facetec.d.ts +2 -0
  84. package/package/src/bridges/facetec.js +105 -0
  85. package/package/src/bridges/facetec.js.map +1 -0
  86. package/package/src/bridges/passkey.d.ts +17 -0
  87. package/package/src/bridges/passkey.js +103 -0
  88. package/package/src/bridges/passkey.js.map +1 -0
  89. package/package/src/constants.d.ts +3 -2
  90. package/package/src/constants.js +4 -3
  91. package/package/src/constants.js.map +1 -0
  92. package/package/src/core.d.ts +3 -5
  93. package/package/src/core.jsx +42 -111
  94. package/package/src/core.jsx.map +1 -0
  95. package/package/src/facetec-bridge.d.ts +10 -0
  96. package/package/src/facetec-bridge.js +125 -0
  97. package/package/src/facetec-bridge.js.map +1 -0
  98. package/package/src/inapp-browser.d.ts +21 -0
  99. package/package/src/inapp-browser.js +104 -0
  100. package/package/src/inapp-browser.js.map +1 -0
  101. package/package/src/passkey-bridge.d.ts +17 -0
  102. package/package/src/passkey-bridge.js +103 -0
  103. package/package/src/passkey-bridge.js.map +1 -0
  104. package/package/src/types.d.ts +27 -13
  105. package/package/src/types.js.map +1 -0
  106. package/package/src/utils/apiDate.d.ts +1 -0
  107. package/package/src/utils/apiDate.js +5 -0
  108. package/package/src/utils/apiDate.js.map +1 -0
  109. package/package/src/utils/color.d.ts +5 -0
  110. package/package/src/utils/color.js +35 -0
  111. package/package/src/utils/color.js.map +1 -0
  112. package/package/src/utils/date.d.ts +1 -0
  113. package/package/src/utils/date.js +6 -0
  114. package/package/src/utils/date.js.map +1 -0
  115. package/package/src/utils/index.d.ts +4 -0
  116. package/package/src/utils/index.js +12 -0
  117. package/package/src/utils/index.js.map +1 -0
  118. package/package/src/utils/message-handler.d.ts +3 -0
  119. package/package/src/utils/message-handler.js +76 -0
  120. package/package/src/utils/message-handler.js.map +1 -0
  121. package/package/src/utils/platform.d.ts +1 -0
  122. package/package/src/utils/platform.js +9 -0
  123. package/package/src/utils/platform.js.map +1 -0
  124. package/package/src/utils/type-guards.d.ts +4 -0
  125. package/package/src/utils/type-guards.js +15 -0
  126. package/package/src/utils/type-guards.js.map +1 -0
  127. package/package/src/utils/url-builder.d.ts +2 -0
  128. package/package/src/utils/url-builder.js +70 -0
  129. package/package/src/utils/url-builder.js.map +1 -0
  130. package/package/src/webview.d.ts +3 -0
  131. package/package/src/webview.jsx +65 -0
  132. package/package/src/webview.jsx.map +1 -0
  133. package/package.json +14 -12
  134. package/react-native.config.js +14 -0
  135. package/soyio_rn_sdk.podspec +49 -0
  136. package/package/src/utils.d.ts +0 -17
  137. package/package/src/utils.js +0 -157
@@ -0,0 +1,308 @@
1
+ package com.soyio.soyiorndk
2
+
3
+ import android.graphics.Color
4
+ import android.graphics.Typeface
5
+ import com.facebook.react.bridge.ReadableMap
6
+ import com.facebook.react.bridge.ReactApplicationContext
7
+ import com.facetec.sdk.FaceTecCancelButtonCustomization
8
+ import com.facetec.sdk.FaceTecCustomization
9
+ import com.facetec.sdk.FaceTecSDK
10
+ import com.facetec.sdk.FaceTecSecurityWatermarkImage
11
+
12
+ internal object FacetecConfig {
13
+ fun apply(reactContext: ReactApplicationContext, theme: ReadableMap?) {
14
+ val colors = resolveThemeColors(theme)
15
+ val customization = FaceTecCustomization()
16
+ val regularFont = typeface(reactContext, Typeface.NORMAL)
17
+ val mediumFont = typeface(reactContext, Typeface.NORMAL, "sans-serif-medium")
18
+ val semiBoldFont = typeface(reactContext, Typeface.BOLD, "sans-serif-medium")
19
+ val boldFont = typeface(reactContext, Typeface.BOLD)
20
+
21
+ customization.frameCustomization.apply {
22
+ cornerRadius = 20
23
+ backgroundColor = colors.white
24
+ borderColor = colors.white
25
+ }
26
+
27
+ customization.overlayCustomization.apply {
28
+ showBrandingImage = false
29
+ backgroundColor = colors.white
30
+ }
31
+
32
+ customization.guidanceCustomization.apply {
33
+ backgroundColors = colors.white
34
+ foregroundColor = colors.black
35
+ buttonBackgroundNormalColor = colors.main
36
+ buttonBackgroundDisabledColor = colors.disabled
37
+ buttonBackgroundHighlightColor = colors.highlight
38
+ buttonCornerRadius = 8
39
+ buttonTextNormalColor = colors.white
40
+ buttonTextDisabledColor = colors.white
41
+ buttonTextHighlightColor = colors.white
42
+ retryScreenImageBorderColor = colors.white
43
+ retryScreenOvalStrokeColor = colors.white
44
+ headerFont = semiBoldFont
45
+ subtextFont = regularFont
46
+ buttonFont = boldFont
47
+ readyScreenHeaderFont = semiBoldFont
48
+ readyScreenSubtextFont = regularFont
49
+ retryScreenHeaderFont = semiBoldFont
50
+ retryScreenSubtextFont = regularFont
51
+ }
52
+
53
+ customization.ovalCustomization.apply {
54
+ strokeColor = colors.main
55
+ progressColor1 = colors.main
56
+ progressColor2 = colors.main
57
+ }
58
+
59
+ customization.feedbackCustomization.apply {
60
+ backgroundColors = colors.black
61
+ textColor = colors.white
62
+ textFont = mediumFont
63
+ }
64
+
65
+ customization.cancelButtonCustomization.apply {
66
+ location = FaceTecCancelButtonCustomization.ButtonLocation.TOP_LEFT
67
+ }
68
+
69
+ customization.resultScreenCustomization.apply {
70
+ backgroundColors = colors.white
71
+ foregroundColor = colors.black
72
+ activityIndicatorColor = colors.main
73
+ resultAnimationBackgroundColor = colors.main
74
+ resultAnimationForegroundColor = colors.white
75
+ uploadProgressFillColor = colors.main
76
+ messageFont = regularFont
77
+ }
78
+
79
+ customization.securityWatermarkImage = FaceTecSecurityWatermarkImage.FACETEC
80
+
81
+ customization.idScanCustomization.apply {
82
+ selectionScreenForegroundColor = colors.black
83
+ reviewScreenBackgroundColors = colors.white
84
+ reviewScreenForegroundColor = colors.white
85
+ reviewScreenTextBackgroundColor = colors.main
86
+ captureScreenForegroundColor = colors.white
87
+ captureScreenTextBackgroundColor = colors.black
88
+ buttonBackgroundNormalColor = colors.main
89
+ buttonBackgroundDisabledColor = colors.disabled
90
+ buttonBackgroundHighlightColor = colors.highlight
91
+ buttonTextNormalColor = colors.white
92
+ buttonTextDisabledColor = colors.white
93
+ buttonTextHighlightColor = colors.white
94
+ captureScreenBackgroundColor = colors.white
95
+ captureFrameStrokeColor = colors.white
96
+ buttonCornerRadius = 8
97
+ headerFont = semiBoldFont
98
+ subtextFont = regularFont
99
+ buttonFont = boldFont
100
+ }
101
+
102
+ customization.ocrConfirmationCustomization.apply {
103
+ mainHeaderFont = boldFont
104
+ sectionHeaderFont = semiBoldFont
105
+ fieldLabelFont = regularFont
106
+ fieldValueFont = regularFont
107
+ inputFieldFont = regularFont
108
+ inputFieldPlaceholderFont = regularFont
109
+ buttonFont = boldFont
110
+ }
111
+ customization.initialLoadingAnimationCustomization.messageFont = regularFont
112
+
113
+ FaceTecSDK.setCustomization(customization)
114
+ FaceTecSDK.setLowLightCustomization(customization)
115
+ FaceTecSDK.setDynamicDimmingCustomization(customization)
116
+ applySpanishLocalization(reactContext)
117
+ }
118
+
119
+ private fun resolveThemeColors(theme: ReadableMap?): ThemeColors {
120
+ val main = theme?.getOptionalColor("mainColor") ?: Color.parseColor(DEFAULT_MAIN_COLOR)
121
+ val highlight = theme?.getOptionalColor("highlightColor") ?: Color.parseColor(DEFAULT_HIGHLIGHT_COLOR)
122
+ val disabled = theme?.getOptionalColor("disabledColor") ?: Color.parseColor(DEFAULT_DISABLED_COLOR)
123
+ return ThemeColors(main = main, highlight = highlight, disabled = disabled)
124
+ }
125
+
126
+ private fun ReadableMap.getOptionalColor(key: String): Int? {
127
+ if (!hasKey(key) || isNull(key)) return null
128
+ val value = getString(key) ?: return null
129
+ return try {
130
+ Color.parseColor(value)
131
+ } catch (_: IllegalArgumentException) {
132
+ null
133
+ }
134
+ }
135
+
136
+ private fun typeface(reactContext: ReactApplicationContext, style: Int, fallbackFamily: String = "sans-serif"): Typeface {
137
+ val base = try {
138
+ Typeface.createFromAsset(reactContext.assets, ROBOTO_FLEX_PATH)
139
+ } catch (_: Exception) {
140
+ null
141
+ } ?: Typeface.create(fallbackFamily, Typeface.NORMAL)
142
+
143
+ return Typeface.create(base, style)
144
+ }
145
+
146
+ private fun applySpanishLocalization(reactContext: ReactApplicationContext) {
147
+ try {
148
+ val resources = reactContext.resources
149
+ // FaceTec resources merge into the host app package, so resolve ids from the host package.
150
+ val hostPackage = reactContext.packageName
151
+ val overrides = HashMap<Int, String>()
152
+
153
+ FACETEC_STRING_KEYS.forEach { keyName ->
154
+ val valueResId = resources.getIdentifier(
155
+ "soyio_facetec_${keyName.removePrefix("FaceTec_")}",
156
+ "string",
157
+ hostPackage,
158
+ )
159
+ val faceTecResId = resources.getIdentifier(keyName, "string", hostPackage)
160
+ if (valueResId != 0 && faceTecResId != 0) {
161
+ overrides[faceTecResId] = resources.getString(valueResId)
162
+ }
163
+ }
164
+
165
+ if (overrides.isNotEmpty()) {
166
+ FaceTecSDK.setDynamicStrings(overrides)
167
+ }
168
+ } catch (_: Exception) {
169
+ // Silently ignore; FaceTec will fall back to its bundled defaults.
170
+ }
171
+ }
172
+
173
+ private data class ThemeColors(
174
+ val main: Int,
175
+ val highlight: Int,
176
+ val disabled: Int,
177
+ val black: Int = Color.parseColor("#000000"),
178
+ val white: Int = Color.parseColor("#FFFFFF"),
179
+ )
180
+
181
+ private const val ROBOTO_FLEX_PATH = "fonts/RobotoFlex.ttf"
182
+ private const val DEFAULT_MAIN_COLOR = "#3340CF"
183
+ private const val DEFAULT_HIGHLIGHT_COLOR = "#2A35B0"
184
+ private const val DEFAULT_DISABLED_COLOR = "#9BA3D8"
185
+ private val FACETEC_STRING_KEYS = listOf(
186
+ // Actions
187
+ "FaceTec_action_ok",
188
+ "FaceTec_action_im_ready",
189
+ "FaceTec_action_try_again",
190
+ "FaceTec_action_continue",
191
+ "FaceTec_action_take_photo",
192
+ "FaceTec_action_accept_photo",
193
+ "FaceTec_action_retake_photo",
194
+ "FaceTec_action_confirm",
195
+ "FaceTec_action_scan_nfc",
196
+ "FaceTec_action_scan_nfc_card",
197
+ "FaceTec_action_skip_nfc",
198
+ // Accessibility
199
+ "FaceTec_accessibility_cancel_button",
200
+ "FaceTec_accessibility_torch_button",
201
+ "FaceTec_accessibility_tap_guidance",
202
+ "FaceTec_accessibility_feedback_move_phone_away",
203
+ "FaceTec_accessibility_feedback_move_phone_closer",
204
+ "FaceTec_accessibility_feedback_face_too_far_left",
205
+ "FaceTec_accessibility_feedback_face_too_far_right",
206
+ "FaceTec_accessibility_feedback_face_too_low",
207
+ "FaceTec_accessibility_feedback_face_too_high",
208
+ "FaceTec_accessibility_feedback_face_rotated_too_far_left",
209
+ "FaceTec_accessibility_feedback_face_rotated_too_far_right",
210
+ "FaceTec_accessibility_feedback_face_pointing_too_far_left",
211
+ "FaceTec_accessibility_feedback_face_pointing_too_far_right",
212
+ "FaceTec_accessibility_feedback_face_not_on_camera",
213
+ "FaceTec_accessibility_feedback_hold_device_to_eye_level",
214
+ // Presession
215
+ "FaceTec_presession_frame_your_face",
216
+ "FaceTec_presession_position_face_straight_in_oval",
217
+ "FaceTec_presession_hold_steady_3",
218
+ "FaceTec_presession_hold_steady_2",
219
+ "FaceTec_presession_hold_steady_1",
220
+ "FaceTec_presession_remove_dark_glasses",
221
+ "FaceTec_presession_neutral_expression",
222
+ "FaceTec_presession_conditions_too_bright",
223
+ "FaceTec_presession_brighten_your_environment",
224
+ // Feedback
225
+ "FaceTec_feedback_center_face",
226
+ "FaceTec_feedback_face_not_found",
227
+ "FaceTec_feedback_move_phone_away",
228
+ "FaceTec_feedback_move_phone_closer",
229
+ "FaceTec_feedback_move_phone_to_eye_level",
230
+ "FaceTec_feedback_face_not_looking_straight_ahead",
231
+ "FaceTec_feedback_face_not_upright",
232
+ "FaceTec_feedback_hold_steady",
233
+ "FaceTec_feedback_use_even_lighting",
234
+ // Instructions
235
+ "FaceTec_instructions_header_ready_1",
236
+ "FaceTec_instructions_header_ready_2",
237
+ "FaceTec_instructions_message_ready_1",
238
+ "FaceTec_instructions_message_ready_2",
239
+ // Retry
240
+ "FaceTec_retry_header",
241
+ "FaceTec_retry_subheader_message",
242
+ "FaceTec_retry_your_image_label",
243
+ "FaceTec_retry_ideal_image_label",
244
+ "FaceTec_retry_instruction_message_1",
245
+ "FaceTec_retry_instruction_message_2",
246
+ "FaceTec_retry_instruction_message_3",
247
+ // Camera Permission
248
+ "FaceTec_camera_permission_header",
249
+ "FaceTec_camera_permission_message_enroll",
250
+ "FaceTec_camera_permission_message_auth",
251
+ "FaceTec_camera_permission_enable_camera",
252
+ "FaceTec_camera_permission_launch_settings",
253
+ // Initializing
254
+ "FaceTec_initializing_camera",
255
+ // ID Scan
256
+ "FaceTec_idscan_type_selection_header",
257
+ "FaceTec_idscan_capture_id_front_instruction_message",
258
+ "FaceTec_idscan_capture_id_back_instruction_message",
259
+ "FaceTec_idscan_review_id_front_instruction_message",
260
+ "FaceTec_idscan_review_id_back_instruction_message",
261
+ "FaceTec_idscan_additional_review_message",
262
+ "FaceTec_idscan_ocr_confirmation_main_header",
263
+ "FaceTec_idscan_ocr_confirmation_scroll_message",
264
+ "FaceTec_idscan_feedback_flip_id_to_back_message",
265
+ "FaceTec_idscan_capture_screen_focus_message",
266
+ "FaceTec_idscan_capture_tap_to_focus_message",
267
+ "FaceTec_idscan_capture_hold_steady_message",
268
+ // ID Scan - NFC
269
+ "FaceTec_idscan_nfc_status_disabled_message",
270
+ "FaceTec_idscan_nfc_status_ready_message",
271
+ "FaceTec_idscan_nfc_card_status_ready_message",
272
+ "FaceTec_idscan_nfc_status_starting_message",
273
+ "FaceTec_idscan_nfc_card_status_starting_message",
274
+ "FaceTec_idscan_nfc_status_scanning_message",
275
+ "FaceTec_idscan_nfc_status_weak_connection_message",
276
+ "FaceTec_idscan_nfc_status_finished_with_success_message",
277
+ "FaceTec_idscan_nfc_status_finished_with_error_message",
278
+ "FaceTec_idscan_nfc_card_status_finished_with_error_message",
279
+ "FaceTec_idscan_nfc_status_skipped_message",
280
+ // Result Messages
281
+ "FaceTec_result_success_message",
282
+ "FaceTec_result_facescan_upload_message",
283
+ "FaceTec_result_idscan_upload_message",
284
+ "FaceTec_result_nfc_upload_message",
285
+ "FaceTec_result_idscan_unsuccess_message",
286
+ "FaceTec_result_idscan_success_front_side_message",
287
+ "FaceTec_result_idscan_success_front_side_back_next_message",
288
+ "FaceTec_result_idscan_success_front_side_nfc_next_message",
289
+ "FaceTec_result_idscan_success_back_side_message",
290
+ "FaceTec_result_idscan_success_back_side_nfc_next_message",
291
+ "FaceTec_result_idscan_success_passport_message",
292
+ "FaceTec_result_idscan_success_passport_nfc_next_message",
293
+ "FaceTec_result_idscan_success_user_confirmation_message",
294
+ "FaceTec_result_idscan_success_nfc_message",
295
+ "FaceTec_result_idscan_success_additional_review_message",
296
+ "FaceTec_result_idscan_skip_or_error_nfc_message",
297
+ "FaceTec_result_idscan_retry_face_did_not_match_message",
298
+ "FaceTec_result_idscan_retry_id_not_fully_visible_message",
299
+ "FaceTec_result_idscan_retry_ocr_results_not_good_enough_message",
300
+ "FaceTec_result_idscan_retry_id_type_not_supported_message",
301
+ "FaceTec_result_idscan_retry_barcode_not_read_message",
302
+ // Retry - Official ID Photo
303
+ "FaceTec_retry_official_id_photo_subheader_message",
304
+ "FaceTec_retry_official_id_photo_instruction_message",
305
+ "FaceTec_retry_official_id_photo_your_image_label",
306
+ "FaceTec_retry_official_id_photo_ideal_image_label",
307
+ )
308
+ }
@@ -0,0 +1,81 @@
1
+ package com.soyio.soyiorndk
2
+
3
+ import android.app.Activity
4
+ import com.facebook.react.bridge.Promise
5
+ import com.facetec.sdk.FaceTecIDScanProcessor
6
+ import com.facetec.sdk.FaceTecIDScanResult
7
+ import com.facetec.sdk.FaceTecIDScanResultCallback
8
+ import com.facetec.sdk.FaceTecIDScanStatus
9
+ import com.facetec.sdk.FaceTecSessionActivity
10
+ import org.json.JSONObject
11
+
12
+ class SoyioIdOnlyProcessor(
13
+ activity: Activity,
14
+ sessionToken: String,
15
+ baseUrl: String,
16
+ resourcePath: String,
17
+ requestableToken: String,
18
+ authToken: String,
19
+ promise: Promise,
20
+ ) : BaseFaceTecProcessor(promise, FACETEC_ID_ERROR), FaceTecIDScanProcessor {
21
+
22
+ private val requestService = FaceTecRequestService(
23
+ baseUrl = baseUrl,
24
+ resourcePath = resourcePath,
25
+ requestableToken = requestableToken,
26
+ authToken = authToken,
27
+ )
28
+
29
+ init {
30
+ FaceTecSessionActivity.createAndLaunchSession(activity, this, sessionToken)
31
+ }
32
+
33
+ override fun processIDScanWhileFaceTecSDKWaits(
34
+ idScanResult: FaceTecIDScanResult,
35
+ idScanResultCallback: FaceTecIDScanResultCallback,
36
+ ) {
37
+ if (idScanResult.status != FaceTecIDScanStatus.SUCCESS) {
38
+ idScanResultCallback.cancel()
39
+ resolveFailure(flowCancelledError)
40
+ return
41
+ }
42
+
43
+ val payload = JSONObject().apply {
44
+ put("id_scan", idScanResult.idScanBase64)
45
+ put("session_id", idScanResult.sessionId ?: "")
46
+ put("id_scan_front_image", idScanResult.frontImagesCompressedBase64?.getOrNull(0) ?: "")
47
+ put("id_scan_back_image", idScanResult.backImagesCompressedBase64?.getOrNull(0) ?: "")
48
+ }
49
+
50
+ requestService.post(
51
+ endpoint = "id_check",
52
+ payload = payload,
53
+ sessionId = idScanResult.sessionId,
54
+ progress = { progress -> idScanResultCallback.uploadProgress(progress) },
55
+ networkErrorMessage = "Network error while uploading FaceTec ID scan.",
56
+ onSuccess = { json ->
57
+ val error = json.optBoolean("error")
58
+ val wasProcessed = json.optBoolean("wasProcessed")
59
+ val scanResultBlob = json.optString("scanResultBlob")
60
+ val errorMessage = json.optString("errorMessage")
61
+
62
+ if (error || !wasProcessed || scanResultBlob.isNullOrBlank()) {
63
+ idScanResultCallback.cancel()
64
+ resolveFailure(errorMessage.takeIf { it.isNotBlank() } ?: defaultError)
65
+ return@post
66
+ }
67
+
68
+ idScanResultCallback.proceedToNextStep(scanResultBlob)
69
+ resolveSuccess()
70
+ },
71
+ onFailure = {
72
+ idScanResultCallback.cancel()
73
+ resolveFailure(it.ifBlank { defaultError })
74
+ },
75
+ )
76
+ }
77
+
78
+ companion object {
79
+ private const val FACETEC_ID_ERROR = "FACETEC_ID_ERROR"
80
+ }
81
+ }
@@ -0,0 +1,134 @@
1
+ package com.soyio.soyiorndk
2
+
3
+ import android.app.Activity
4
+ import com.facebook.react.bridge.Promise
5
+ import com.facetec.sdk.FaceTecFaceScanProcessor
6
+ import com.facetec.sdk.FaceTecFaceScanResultCallback
7
+ import com.facetec.sdk.FaceTecIDScanProcessor
8
+ import com.facetec.sdk.FaceTecIDScanResult
9
+ import com.facetec.sdk.FaceTecIDScanResultCallback
10
+ import com.facetec.sdk.FaceTecIDScanStatus
11
+ import com.facetec.sdk.FaceTecSessionActivity
12
+ import com.facetec.sdk.FaceTecSessionResult
13
+ import com.facetec.sdk.FaceTecSessionStatus
14
+ import org.json.JSONObject
15
+
16
+ class SoyioValidationProcessor(
17
+ activity: Activity,
18
+ sessionToken: String,
19
+ baseUrl: String,
20
+ resourcePath: String,
21
+ requestableToken: String,
22
+ authToken: String,
23
+ promise: Promise,
24
+ private val onLivenessSuccess: (() -> Unit)? = null,
25
+ ) : BaseFaceTecProcessor(promise, FACETEC_VALIDATION_ERROR), FaceTecFaceScanProcessor, FaceTecIDScanProcessor {
26
+
27
+ private val requestService = FaceTecRequestService(
28
+ baseUrl = baseUrl,
29
+ resourcePath = resourcePath,
30
+ requestableToken = requestableToken,
31
+ authToken = authToken,
32
+ )
33
+
34
+ init {
35
+ FaceTecSessionActivity.createAndLaunchSession(
36
+ activity,
37
+ this,
38
+ this,
39
+ sessionToken,
40
+ )
41
+ }
42
+
43
+ override fun processSessionWhileFaceTecSDKWaits(
44
+ sessionResult: FaceTecSessionResult,
45
+ faceScanResultCallback: FaceTecFaceScanResultCallback,
46
+ ) {
47
+ if (sessionResult.status != FaceTecSessionStatus.SESSION_COMPLETED_SUCCESSFULLY) {
48
+ faceScanResultCallback.cancel()
49
+ resolveFailure(flowCancelledError)
50
+ return
51
+ }
52
+
53
+ val payload = JSONObject().apply {
54
+ put("face_scan", sessionResult.faceScanBase64)
55
+ put("audit_trail_image", sessionResult.auditTrailCompressedBase64?.getOrNull(0) ?: "")
56
+ put("low_quality_audit_trail_image", sessionResult.lowQualityAuditTrailCompressedBase64?.getOrNull(0) ?: "")
57
+ put("session_id", sessionResult.sessionId ?: "")
58
+ }
59
+
60
+ requestService.post(
61
+ endpoint = "liveness_check",
62
+ payload = payload,
63
+ sessionId = sessionResult.sessionId,
64
+ progress = { progress -> faceScanResultCallback.uploadProgress(progress) },
65
+ onSuccess = { json ->
66
+ val error = json.optBoolean("error")
67
+ val wasProcessed = json.optBoolean("wasProcessed")
68
+ val errorMessage = json.optString("errorMessage")
69
+ val scanResultBlob = json.optString("scanResultBlob")
70
+
71
+ if (error || !wasProcessed || scanResultBlob.isNullOrBlank()) {
72
+ faceScanResultCallback.cancel()
73
+ resolveFailure(errorMessage.takeIf { it.isNotBlank() } ?: defaultError)
74
+ return@post
75
+ }
76
+
77
+ faceScanResultCallback.proceedToNextStep(scanResultBlob)
78
+ onLivenessSuccess?.invoke()
79
+ },
80
+ onFailure = {
81
+ faceScanResultCallback.cancel()
82
+ resolveFailure(it.ifBlank { defaultError })
83
+ },
84
+ )
85
+ }
86
+
87
+ override fun processIDScanWhileFaceTecSDKWaits(
88
+ idScanResult: FaceTecIDScanResult,
89
+ idScanResultCallback: FaceTecIDScanResultCallback,
90
+ ) {
91
+ if (idScanResult.status != FaceTecIDScanStatus.SUCCESS) {
92
+ idScanResultCallback.cancel()
93
+ resolveFailure(flowCancelledError)
94
+ return
95
+ }
96
+
97
+ val payload = JSONObject().apply {
98
+ put("id_scan", idScanResult.idScanBase64)
99
+ put("session_id", idScanResult.sessionId ?: "")
100
+ put("id_scan_front_image", idScanResult.frontImagesCompressedBase64?.getOrNull(0) ?: "")
101
+ put("id_scan_back_image", idScanResult.backImagesCompressedBase64?.getOrNull(0) ?: "")
102
+ }
103
+
104
+ requestService.post(
105
+ endpoint = "id_check",
106
+ payload = payload,
107
+ sessionId = idScanResult.sessionId,
108
+ progress = { progress -> idScanResultCallback.uploadProgress(progress) },
109
+ onSuccess = { json ->
110
+ val error = json.optBoolean("error")
111
+ val wasProcessed = json.optBoolean("wasProcessed")
112
+ val errorMessage = json.optString("errorMessage")
113
+ val scanResultBlob = json.optString("scanResultBlob")
114
+
115
+ if (error || !wasProcessed || scanResultBlob.isNullOrBlank()) {
116
+ idScanResultCallback.cancel()
117
+ resolveFailure(errorMessage.takeIf { it.isNotBlank() } ?: defaultError)
118
+ return@post
119
+ }
120
+
121
+ idScanResultCallback.proceedToNextStep(scanResultBlob)
122
+ resolveSuccess()
123
+ },
124
+ onFailure = {
125
+ idScanResultCallback.cancel()
126
+ resolveFailure(it.ifBlank { defaultError })
127
+ },
128
+ )
129
+ }
130
+
131
+ companion object {
132
+ private const val FACETEC_VALIDATION_ERROR = "FACETEC_VALIDATION_ERROR"
133
+ }
134
+ }
@@ -0,0 +1,134 @@
1
+ <resources xmlns:tools="http://schemas.android.com/tools">
2
+ <!-- Actions -->
3
+ <string name="soyio_facetec_action_ok">Aceptar</string>
4
+ <string name="soyio_facetec_action_im_ready">Comenzar validación</string>
5
+ <string name="soyio_facetec_action_try_again">Volver a intentarlo</string>
6
+ <string name="soyio_facetec_action_continue">Continuar</string>
7
+ <string name="soyio_facetec_action_take_photo">Tomar foto</string>
8
+ <string name="soyio_facetec_action_accept_photo">Aceptar</string>
9
+ <string name="soyio_facetec_action_retake_photo">Volver</string>
10
+ <string name="soyio_facetec_action_confirm">Confirmar información</string>
11
+ <string name="soyio_facetec_action_scan_nfc">Escanear NFC</string>
12
+ <string name="soyio_facetec_action_scan_nfc_card">Escanear chip</string>
13
+ <string name="soyio_facetec_action_skip_nfc">Omitir este paso</string>
14
+
15
+ <!-- Accessibility -->
16
+ <string name="soyio_facetec_accessibility_cancel_button">Cancelar</string>
17
+ <string name="soyio_facetec_accessibility_torch_button">Interruptor de iluminación</string>
18
+ <string name="soyio_facetec_accessibility_tap_guidance">Toca dos veces cualquier parte de la pantalla para ver indicaciones sobre cómo alinear tu rostro.</string>
19
+ <string name="soyio_facetec_accessibility_feedback_move_phone_away">Tu rostro está demasiado cerca</string>
20
+ <string name="soyio_facetec_accessibility_feedback_move_phone_closer">Tu rostro está demasiado lejos</string>
21
+ <string name="soyio_facetec_accessibility_feedback_face_too_far_left">Tu rostro está demasiado a la izquierda</string>
22
+ <string name="soyio_facetec_accessibility_feedback_face_too_far_right">Tu rostro está demasiado a la derecha</string>
23
+ <string name="soyio_facetec_accessibility_feedback_face_too_low">Tu rostro está demasiado abajo</string>
24
+ <string name="soyio_facetec_accessibility_feedback_face_too_high">Tu rostro está demasiado arriba</string>
25
+ <string name="soyio_facetec_accessibility_feedback_face_rotated_too_far_left">Tu rostro gira demasiado a la izquierda</string>
26
+ <string name="soyio_facetec_accessibility_feedback_face_rotated_too_far_right">Tu rostro gira demasiado a la derecha</string>
27
+ <string name="soyio_facetec_accessibility_feedback_face_pointing_too_far_left">Tu rostro está demasiado inclinado hacia la izquierda</string>
28
+ <string name="soyio_facetec_accessibility_feedback_face_pointing_too_far_right">Tu rostro está demasiado inclinado hacia la derecha</string>
29
+ <string name="soyio_facetec_accessibility_feedback_face_not_on_camera">El rostro no se ve en la cámara o está demasiado lejos</string>
30
+ <string name="soyio_facetec_accessibility_feedback_hold_device_to_eye_level">Mantén el dispositivo a la altura de los ojos</string>
31
+
32
+ <!-- Presession -->
33
+ <string name="soyio_facetec_presession_frame_your_face">Encuadra tu rostro en el óvalo</string>
34
+ <string name="soyio_facetec_presession_position_face_straight_in_oval">Mira hacia el frente</string>
35
+ <string name="soyio_facetec_presession_hold_steady_3">Mantente quieto durante: 3</string>
36
+ <string name="soyio_facetec_presession_hold_steady_2">Mantente quieto durante: 2</string>
37
+ <string name="soyio_facetec_presession_hold_steady_1">Mantente quieto durante: 1</string>
38
+ <string name="soyio_facetec_presession_remove_dark_glasses">Quítate los lentes oscuros</string>
39
+ <string name="soyio_facetec_presession_neutral_expression">Expresión neutra, sin sonreír</string>
40
+ <string name="soyio_facetec_presession_conditions_too_bright">Demasiada luz</string>
41
+ <string name="soyio_facetec_presession_brighten_your_environment">Ilumina tu entorno</string>
42
+
43
+ <!-- Feedback -->
44
+ <string name="soyio_facetec_feedback_center_face">Centra tu rostro</string>
45
+ <string name="soyio_facetec_feedback_face_not_found">Encuadra tu rostro</string>
46
+ <string name="soyio_facetec_feedback_move_phone_away">Aléjate</string>
47
+ <string name="soyio_facetec_feedback_move_phone_closer">Acércate</string>
48
+ <string name="soyio_facetec_feedback_move_phone_to_eye_level">Coloca la cámara a la altura de los ojos</string>
49
+ <string name="soyio_facetec_feedback_face_not_looking_straight_ahead">Mira hacia el frente</string>
50
+ <string name="soyio_facetec_feedback_face_not_upright">Mantén la cabeza recta</string>
51
+ <string name="soyio_facetec_feedback_hold_steady">Quédate quieto</string>
52
+ <string name="soyio_facetec_feedback_use_even_lighting">Ilumina el rostro de forma más uniforme</string>
53
+
54
+ <!-- Instructions -->
55
+ <string name="soyio_facetec_instructions_header_ready_1"></string>
56
+ <string name="soyio_facetec_instructions_header_ready_2">Prepárate para la selfie</string>
57
+ <string name="soyio_facetec_instructions_message_ready_1">Alinea tu rostro dentro del óvalo</string>
58
+ <string name="soyio_facetec_instructions_message_ready_2"></string>
59
+
60
+ <!-- Retry -->
61
+ <string name="soyio_facetec_retry_header">Intentémoslo otra vez</string>
62
+ <string name="soyio_facetec_retry_subheader_message">Necesitamos una selfie más nítida</string>
63
+ <string name="soyio_facetec_retry_your_image_label">Tu selfie</string>
64
+ <string name="soyio_facetec_retry_ideal_image_label">Pose ideal</string>
65
+ <string name="soyio_facetec_retry_instruction_message_1">Usa una pose y iluminación ideal</string>
66
+ <string name="soyio_facetec_retry_instruction_message_2">Expresión neutra, sin sonreír</string>
67
+ <string name="soyio_facetec_retry_instruction_message_3">Demasiado borrosa, limpie la cámara</string>
68
+
69
+ <!-- Camera Permission -->
70
+ <string name="soyio_facetec_camera_permission_header">Habilita la cámara</string>
71
+ <string name="soyio_facetec_camera_permission_message_enroll">Permisos de cámara deshabilitados.\nVerifique la configuración de tu sistema operativo</string>
72
+ <string name="soyio_facetec_camera_permission_message_auth">Permisos de cámara deshabilitados.\nVerifique la configuración de tu sistema operativo</string>
73
+ <string name="soyio_facetec_camera_permission_enable_camera">Habilitar la cámara</string>
74
+ <string name="soyio_facetec_camera_permission_launch_settings">Abrir la configuración</string>
75
+
76
+ <!-- Initializing -->
77
+ <string name="soyio_facetec_initializing_camera">Estamos protegiendo la conexión ...</string>
78
+
79
+ <!-- ID Scan -->
80
+ <string name="soyio_facetec_idscan_type_selection_header">Ahora, prepárate para\nescanear tu cédula</string>
81
+ <string name="soyio_facetec_idscan_capture_id_front_instruction_message">Frente de tu cédula</string>
82
+ <string name="soyio_facetec_idscan_capture_id_back_instruction_message">Reverso de tu cédula</string>
83
+ <string name="soyio_facetec_idscan_review_id_front_instruction_message">Verifica que sea nítida y legible</string>
84
+ <string name="soyio_facetec_idscan_review_id_back_instruction_message">Verifica que sea nítida y legible</string>
85
+ <string name="soyio_facetec_idscan_additional_review_message">Se requiere\nuna verificación adicional</string>
86
+ <string name="soyio_facetec_idscan_ocr_confirmation_main_header">Revisar y confirmar</string>
87
+ <string name="soyio_facetec_idscan_ocr_confirmation_scroll_message">Desplácese hacia abajo</string>
88
+ <string name="soyio_facetec_idscan_feedback_flip_id_to_back_message">Sigamos con el reverso de tu cédula</string>
89
+ <string name="soyio_facetec_idscan_capture_screen_focus_message">Presiona para enfocar</string>
90
+ <string name="soyio_facetec_idscan_capture_tap_to_focus_message">Toca la pantalla para enfocar</string>
91
+ <string name="soyio_facetec_idscan_capture_hold_steady_message">Mantente quieto</string>
92
+
93
+ <!-- ID Scan - NFC -->
94
+ <string name="soyio_facetec_idscan_nfc_status_disabled_message">Habilita el NFC\nen la configuración de tu dispositivo\npara continuar</string>
95
+ <string name="soyio_facetec_idscan_nfc_status_ready_message">Prepárate para escanear\nel chip de tu pasaporte electrónico</string>
96
+ <string name="soyio_facetec_idscan_nfc_card_status_ready_message">Prepárate para escanear\nel chip de tu cédula</string>
97
+ <string name="soyio_facetec_idscan_nfc_status_starting_message">Acerca el teléfono a la parte\nposterior del ePasaporte\npara escanear el chip NFC</string>
98
+ <string name="soyio_facetec_idscan_nfc_card_status_starting_message">Acerca el teléfono a tu cédula\npara escanear el chip NFC</string>
99
+ <string name="soyio_facetec_idscan_nfc_status_scanning_message">Manténlo quieto,\nescaneando el chip NFC</string>
100
+ <string name="soyio_facetec_idscan_nfc_status_weak_connection_message">Intentemos\notro escaneo</string>
101
+ <string name="soyio_facetec_idscan_nfc_status_finished_with_success_message">Escaneo de documentos\ncompletado</string>
102
+ <string name="soyio_facetec_idscan_nfc_status_finished_with_error_message">No se puede leer\nel chip del pasaporte electrónico</string>
103
+ <string name="soyio_facetec_idscan_nfc_card_status_finished_with_error_message">No se puede leer\nel chip de la cédula</string>
104
+ <string name="soyio_facetec_idscan_nfc_status_skipped_message">Escaneo NFC\nomitido</string>
105
+
106
+ <!-- Result Messages -->
107
+ <string name="soyio_facetec_result_success_message">Validación de identidad completa</string>
108
+ <string name="soyio_facetec_result_facescan_upload_message">Analizando tu selfie</string>
109
+ <string name="soyio_facetec_result_idscan_upload_message">Analizando la imagen de la\ncédula</string>
110
+ <string name="soyio_facetec_result_nfc_upload_message">Analizando la información NFC</string>
111
+ <string name="soyio_facetec_result_idscan_unsuccess_message">La foto de la cédula\nno coincide con el rostro del usuario</string>
112
+ <string name="soyio_facetec_result_idscan_success_front_side_message">Escaneo de cédula completado</string>
113
+ <string name="soyio_facetec_result_idscan_success_front_side_back_next_message">Lado frontal de la cédula\nescaneado</string>
114
+ <string name="soyio_facetec_result_idscan_success_front_side_nfc_next_message">Frente de la cédula\nescaneado</string>
115
+ <string name="soyio_facetec_result_idscan_success_back_side_message">Escaneo de cédula completado</string>
116
+ <string name="soyio_facetec_result_idscan_success_back_side_nfc_next_message">Reverso de la cédula\nescaneado</string>
117
+ <string name="soyio_facetec_result_idscan_success_passport_message">Escaneo de pasaporte completado</string>
118
+ <string name="soyio_facetec_result_idscan_success_passport_nfc_next_message">Pasaporte escaneado</string>
119
+ <string name="soyio_facetec_result_idscan_success_user_confirmation_message">Escaneo de la cédula con fotografía\ncompletado</string>
120
+ <string name="soyio_facetec_result_idscan_success_nfc_message">Escaneo de cédula completado</string>
121
+ <string name="soyio_facetec_result_idscan_success_additional_review_message">Captura de la fotografía de la cédula\ncompletada</string>
122
+ <string name="soyio_facetec_result_idscan_skip_or_error_nfc_message">Información de la cédula\nsubida</string>
123
+ <string name="soyio_facetec_result_idscan_retry_face_did_not_match_message">El rostro no coincide\nlo suficiente</string>
124
+ <string name="soyio_facetec_result_idscan_retry_id_not_fully_visible_message">La cédula\nno es totalmente visible</string>
125
+ <string name="soyio_facetec_result_idscan_retry_ocr_results_not_good_enough_message">El texto de la cédula no es legible</string>
126
+ <string name="soyio_facetec_result_idscan_retry_id_type_not_supported_message">No se admite este tipo de identificación\nUtiliza una identificación diferente</string>
127
+ <string name="soyio_facetec_result_idscan_retry_barcode_not_read_message">No se pudo escanear el código de barras\nInténtalo de nuevo</string>
128
+
129
+ <!-- Retry - Official ID Photo -->
130
+ <string name="soyio_facetec_retry_official_id_photo_subheader_message">La foto debe tener más calidad</string>
131
+ <string name="soyio_facetec_retry_official_id_photo_instruction_message">Usa luz interior,\nsin sonreír, lentes con reflejos o sombrero</string>
132
+ <string name="soyio_facetec_retry_official_id_photo_your_image_label">Tu imagen</string>
133
+ <string name="soyio_facetec_retry_official_id_photo_ideal_image_label">Cara conforme</string>
134
+ </resources>
Binary file
Binary file
Binary file
Binary file