@trustchex/react-native-sdk 1.355.1 → 1.357.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 (254) hide show
  1. package/README.md +2 -9
  2. package/TrustchexSDK.podspec +5 -4
  3. package/android/build.gradle +6 -4
  4. package/android/src/main/AndroidManifest.xml +1 -1
  5. package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKPackage.kt +45 -25
  6. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraManager.kt +168 -0
  7. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +871 -0
  8. package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +245 -0
  9. package/android/src/main/java/com/trustchex/reactnativesdk/mrz/MRZValidationModule.kt +785 -0
  10. package/android/src/main/java/com/trustchex/reactnativesdk/mrz/MRZValidator.kt +419 -0
  11. package/android/src/main/java/com/trustchex/reactnativesdk/opencv/OpenCVModule.kt +818 -0
  12. package/ios/Camera/TrustchexCameraManager.m +37 -0
  13. package/ios/Camera/TrustchexCameraManager.swift +125 -0
  14. package/ios/Camera/TrustchexCameraView.swift +1176 -0
  15. package/ios/MLKit/MLKitModule.m +23 -0
  16. package/ios/MLKit/MLKitModule.swift +250 -0
  17. package/ios/MRZValidation.m +39 -0
  18. package/ios/MRZValidation.swift +802 -0
  19. package/ios/MRZValidator.swift +466 -0
  20. package/ios/OpenCV/OpenCVModule.h +4 -0
  21. package/ios/OpenCV/OpenCVModule.mm +810 -0
  22. package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +2 -3
  23. package/lib/module/Screens/Dynamic/IdentityDocumentScanningScreen.js +1 -2
  24. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +418 -193
  25. package/lib/module/Screens/Static/OTPVerificationScreen.js +11 -11
  26. package/lib/module/Screens/Static/QrCodeScanningScreen.js +5 -1
  27. package/lib/module/Screens/Static/ResultScreen.js +25 -2
  28. package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +25 -7
  29. package/lib/module/Shared/Components/DebugNavigationPanel.js +234 -24
  30. package/lib/module/Shared/Components/EIDScanner.js +99 -9
  31. package/lib/module/Shared/Components/FaceCamera.js +170 -179
  32. package/lib/module/Shared/Components/IdentityDocumentCamera.js +2151 -771
  33. package/lib/module/Shared/Components/QrCodeScannerCamera.js +109 -107
  34. package/lib/module/Shared/Components/TrustchexCamera.js +122 -0
  35. package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +91 -0
  36. package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +2 -124
  37. package/lib/module/Shared/EIDReader/tlv/tlvInputStream.js +4 -4
  38. package/lib/module/Shared/EIDReader/tlv/tlvOutputState.js +4 -4
  39. package/lib/module/Shared/EIDReader/tlv/tlvOutputStream.js +4 -4
  40. package/lib/module/Shared/Libs/analytics.utils.js +2 -2
  41. package/lib/module/Shared/Libs/debug.utils.js +132 -0
  42. package/lib/module/Shared/Libs/deeplink.utils.js +6 -5
  43. package/lib/module/Shared/Libs/demo.utils.js +13 -3
  44. package/lib/module/Shared/Libs/mrz.utils.js +1 -175
  45. package/lib/module/Shared/Libs/native-device-info.utils.js +12 -6
  46. package/lib/module/Shared/Libs/tts.utils.js +40 -6
  47. package/lib/module/Shared/Services/AnalyticsService.js +9 -8
  48. package/lib/module/Shared/Types/mrzFields.js +1 -0
  49. package/lib/module/Translation/Resources/en.js +87 -88
  50. package/lib/module/Translation/Resources/tr.js +84 -85
  51. package/lib/module/Trustchex.js +9 -2
  52. package/lib/module/index.js +1 -0
  53. package/lib/module/version.js +1 -1
  54. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
  55. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentScanningScreen.d.ts.map +1 -1
  56. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  57. package/lib/typescript/src/Screens/Static/OTPVerificationScreen.d.ts.map +1 -1
  58. package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
  59. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  60. package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
  61. package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
  62. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts +2 -2
  63. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  64. package/lib/typescript/src/Shared/Components/FaceCamera.d.ts +18 -4
  65. package/lib/typescript/src/Shared/Components/FaceCamera.d.ts.map +1 -1
  66. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts +3 -4
  67. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  68. package/lib/typescript/src/Shared/Components/QrCodeScannerCamera.d.ts +2 -1
  69. package/lib/typescript/src/Shared/Components/QrCodeScannerCamera.d.ts.map +1 -1
  70. package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts +124 -0
  71. package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts.map +1 -0
  72. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.helpers.d.ts +11 -0
  73. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.helpers.d.ts.map +1 -0
  74. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts +2 -39
  75. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
  76. package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
  77. package/lib/typescript/src/Shared/Libs/debug.utils.d.ts +42 -0
  78. package/lib/typescript/src/Shared/Libs/debug.utils.d.ts.map +1 -0
  79. package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
  80. package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
  81. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  82. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts +0 -4
  83. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  84. package/lib/typescript/src/Shared/Libs/native-device-info.utils.d.ts.map +1 -1
  85. package/lib/typescript/src/Shared/Libs/tts.utils.d.ts +4 -3
  86. package/lib/typescript/src/Shared/Libs/tts.utils.d.ts.map +1 -1
  87. package/lib/typescript/src/Shared/Services/AnalyticsService.d.ts.map +1 -1
  88. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +2 -2
  89. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
  90. package/lib/typescript/src/Shared/Types/mrzFields.d.ts +11 -0
  91. package/lib/typescript/src/Shared/Types/mrzFields.d.ts.map +1 -0
  92. package/lib/typescript/src/Translation/Resources/en.d.ts +4 -5
  93. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  94. package/lib/typescript/src/Translation/Resources/tr.d.ts +4 -5
  95. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  96. package/lib/typescript/src/Trustchex.d.ts +2 -0
  97. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  98. package/lib/typescript/src/index.d.ts +1 -0
  99. package/lib/typescript/src/index.d.ts.map +1 -1
  100. package/lib/typescript/src/version.d.ts +1 -1
  101. package/package.json +4 -35
  102. package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +1 -1
  103. package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +7 -5
  104. package/src/Screens/Dynamic/IdentityDocumentScanningScreen.tsx +2 -3
  105. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +498 -216
  106. package/src/Screens/Static/OTPVerificationScreen.tsx +37 -31
  107. package/src/Screens/Static/QrCodeScanningScreen.tsx +8 -1
  108. package/src/Screens/Static/ResultScreen.tsx +136 -88
  109. package/src/Screens/Static/VerificationSessionCheckScreen.tsx +46 -13
  110. package/src/Shared/Components/DebugNavigationPanel.tsx +290 -34
  111. package/src/Shared/Components/EIDScanner.tsx +94 -16
  112. package/src/Shared/Components/FaceCamera.tsx +236 -203
  113. package/src/Shared/Components/IdentityDocumentCamera.tsx +3073 -1030
  114. package/src/Shared/Components/QrCodeScannerCamera.tsx +133 -127
  115. package/src/Shared/Components/TrustchexCamera.tsx +289 -0
  116. package/src/Shared/Config/camera-enhancement.config.ts +2 -2
  117. package/src/Shared/EIDReader/tlv/tlv.helpers.ts +96 -0
  118. package/src/Shared/EIDReader/tlv/tlv.utils.ts +2 -125
  119. package/src/Shared/EIDReader/tlv/tlvInputStream.ts +4 -4
  120. package/src/Shared/EIDReader/tlv/tlvOutputState.ts +4 -4
  121. package/src/Shared/EIDReader/tlv/tlvOutputStream.ts +4 -4
  122. package/src/Shared/Libs/analytics.utils.ts +48 -20
  123. package/src/Shared/Libs/debug.utils.ts +149 -0
  124. package/src/Shared/Libs/deeplink.utils.ts +7 -5
  125. package/src/Shared/Libs/demo.utils.ts +4 -0
  126. package/src/Shared/Libs/http-client.ts +12 -8
  127. package/src/Shared/Libs/mrz.utils.ts +1 -163
  128. package/src/Shared/Libs/native-device-info.utils.ts +12 -6
  129. package/src/Shared/Libs/tts.utils.ts +48 -6
  130. package/src/Shared/Services/AnalyticsService.ts +69 -24
  131. package/src/Shared/Types/identificationInfo.ts +2 -2
  132. package/src/Shared/Types/mrzFields.ts +29 -0
  133. package/src/Translation/Resources/en.ts +90 -100
  134. package/src/Translation/Resources/tr.ts +89 -97
  135. package/src/Translation/index.ts +1 -1
  136. package/src/Trustchex.tsx +21 -4
  137. package/src/index.tsx +14 -0
  138. package/src/version.ts +1 -1
  139. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/barcodescanner/BarcodeScannerFrameProcessorPlugin.kt +0 -301
  140. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/cropper/BitmapUtils.kt +0 -205
  141. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/cropper/CropperPlugin.kt +0 -72
  142. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/cropper/FrameMetadata.kt +0 -4
  143. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/facedetector/FaceDetectorFrameProcessorPlugin.kt +0 -303
  144. package/android/src/main/java/com/trustchex/reactnativesdk/visioncameraplugins/textrecognition/TextRecognitionFrameProcessorPlugin.kt +0 -115
  145. package/ios/VisionCameraPlugins/BarcodeScanner/BarcodeScannerFrameProcessorPlugin-Bridging-Header.h +0 -9
  146. package/ios/VisionCameraPlugins/BarcodeScanner/BarcodeScannerFrameProcessorPlugin.mm +0 -22
  147. package/ios/VisionCameraPlugins/BarcodeScanner/BarcodeScannerFrameProcessorPlugin.swift +0 -188
  148. package/ios/VisionCameraPlugins/Cropper/Cropper-Bridging-Header.h +0 -13
  149. package/ios/VisionCameraPlugins/Cropper/Cropper.h +0 -20
  150. package/ios/VisionCameraPlugins/Cropper/Cropper.mm +0 -22
  151. package/ios/VisionCameraPlugins/Cropper/Cropper.swift +0 -145
  152. package/ios/VisionCameraPlugins/Cropper/CropperUtils.swift +0 -49
  153. package/ios/VisionCameraPlugins/FaceDetector/FaceDetectorFrameProcessorPlugin-Bridging-Header.h +0 -4
  154. package/ios/VisionCameraPlugins/FaceDetector/FaceDetectorFrameProcessorPlugin.mm +0 -22
  155. package/ios/VisionCameraPlugins/FaceDetector/FaceDetectorFrameProcessorPlugin.swift +0 -320
  156. package/ios/VisionCameraPlugins/TextRecognition/TextRecognitionFrameProcessorPlugin-Bridging-Header.h +0 -4
  157. package/ios/VisionCameraPlugins/TextRecognition/TextRecognitionFrameProcessorPlugin.mm +0 -27
  158. package/ios/VisionCameraPlugins/TextRecognition/TextRecognitionFrameProcessorPlugin.swift +0 -144
  159. package/lib/module/Shared/Libs/camera.utils.js +0 -308
  160. package/lib/module/Shared/Libs/frame-enhancement.utils.js +0 -133
  161. package/lib/module/Shared/Libs/opencv.utils.js +0 -21
  162. package/lib/module/Shared/Libs/worklet.utils.js +0 -68
  163. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useBarcodeScanner.js +0 -46
  164. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useCameraPermissions.js +0 -35
  165. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/index.js +0 -19
  166. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/scanCodes.js +0 -26
  167. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/types.js +0 -3
  168. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/utils/convert.js +0 -197
  169. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/utils/geometry.js +0 -101
  170. package/lib/module/Shared/VisionCameraPlugins/BarcodeScanner/utils/highlights.js +0 -60
  171. package/lib/module/Shared/VisionCameraPlugins/Cropper/index.js +0 -47
  172. package/lib/module/Shared/VisionCameraPlugins/FaceDetector/Camera.js +0 -42
  173. package/lib/module/Shared/VisionCameraPlugins/FaceDetector/detectFaces.js +0 -35
  174. package/lib/module/Shared/VisionCameraPlugins/FaceDetector/index.js +0 -4
  175. package/lib/module/Shared/VisionCameraPlugins/FaceDetector/types.js +0 -3
  176. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/Camera.js +0 -56
  177. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/PhotoRecognizer.js +0 -20
  178. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/RemoveLanguageModel.js +0 -9
  179. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/index.js +0 -6
  180. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/scanText.js +0 -20
  181. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/translateText.js +0 -19
  182. package/lib/module/Shared/VisionCameraPlugins/TextRecognition/types.js +0 -3
  183. package/lib/typescript/src/Shared/Libs/camera.utils.d.ts +0 -87
  184. package/lib/typescript/src/Shared/Libs/camera.utils.d.ts.map +0 -1
  185. package/lib/typescript/src/Shared/Libs/frame-enhancement.utils.d.ts +0 -25
  186. package/lib/typescript/src/Shared/Libs/frame-enhancement.utils.d.ts.map +0 -1
  187. package/lib/typescript/src/Shared/Libs/opencv.utils.d.ts +0 -3
  188. package/lib/typescript/src/Shared/Libs/opencv.utils.d.ts.map +0 -1
  189. package/lib/typescript/src/Shared/Libs/worklet.utils.d.ts +0 -9
  190. package/lib/typescript/src/Shared/Libs/worklet.utils.d.ts.map +0 -1
  191. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useBarcodeScanner.d.ts +0 -13
  192. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useBarcodeScanner.d.ts.map +0 -1
  193. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useCameraPermissions.d.ts +0 -6
  194. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useCameraPermissions.d.ts.map +0 -1
  195. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/index.d.ts +0 -12
  196. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/index.d.ts.map +0 -1
  197. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/scanCodes.d.ts +0 -3
  198. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/scanCodes.d.ts.map +0 -1
  199. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/types.d.ts +0 -52
  200. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/types.d.ts.map +0 -1
  201. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/convert.d.ts +0 -62
  202. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/convert.d.ts.map +0 -1
  203. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/geometry.d.ts +0 -34
  204. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/geometry.d.ts.map +0 -1
  205. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/highlights.d.ts +0 -32
  206. package/lib/typescript/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/highlights.d.ts.map +0 -1
  207. package/lib/typescript/src/Shared/VisionCameraPlugins/Cropper/index.d.ts +0 -23
  208. package/lib/typescript/src/Shared/VisionCameraPlugins/Cropper/index.d.ts.map +0 -1
  209. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/Camera.d.ts +0 -9
  210. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/Camera.d.ts.map +0 -1
  211. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/detectFaces.d.ts +0 -3
  212. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/detectFaces.d.ts.map +0 -1
  213. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/index.d.ts +0 -3
  214. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/index.d.ts.map +0 -1
  215. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/types.d.ts +0 -79
  216. package/lib/typescript/src/Shared/VisionCameraPlugins/FaceDetector/types.d.ts.map +0 -1
  217. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/Camera.d.ts +0 -6
  218. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/Camera.d.ts.map +0 -1
  219. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/PhotoRecognizer.d.ts +0 -3
  220. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/PhotoRecognizer.d.ts.map +0 -1
  221. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/RemoveLanguageModel.d.ts +0 -3
  222. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/RemoveLanguageModel.d.ts.map +0 -1
  223. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/index.d.ts +0 -5
  224. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/index.d.ts.map +0 -1
  225. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/scanText.d.ts +0 -3
  226. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/scanText.d.ts.map +0 -1
  227. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/translateText.d.ts +0 -3
  228. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/translateText.d.ts.map +0 -1
  229. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/types.d.ts +0 -67
  230. package/lib/typescript/src/Shared/VisionCameraPlugins/TextRecognition/types.d.ts.map +0 -1
  231. package/src/Shared/Libs/camera.utils.ts +0 -345
  232. package/src/Shared/Libs/frame-enhancement.utils.ts +0 -217
  233. package/src/Shared/Libs/opencv.utils.ts +0 -40
  234. package/src/Shared/Libs/worklet.utils.ts +0 -72
  235. package/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useBarcodeScanner.ts +0 -79
  236. package/src/Shared/VisionCameraPlugins/BarcodeScanner/hooks/useCameraPermissions.ts +0 -46
  237. package/src/Shared/VisionCameraPlugins/BarcodeScanner/index.ts +0 -60
  238. package/src/Shared/VisionCameraPlugins/BarcodeScanner/scanCodes.ts +0 -32
  239. package/src/Shared/VisionCameraPlugins/BarcodeScanner/types.ts +0 -82
  240. package/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/convert.ts +0 -195
  241. package/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/geometry.ts +0 -135
  242. package/src/Shared/VisionCameraPlugins/BarcodeScanner/utils/highlights.ts +0 -84
  243. package/src/Shared/VisionCameraPlugins/Cropper/index.ts +0 -78
  244. package/src/Shared/VisionCameraPlugins/FaceDetector/Camera.tsx +0 -63
  245. package/src/Shared/VisionCameraPlugins/FaceDetector/detectFaces.ts +0 -44
  246. package/src/Shared/VisionCameraPlugins/FaceDetector/index.ts +0 -3
  247. package/src/Shared/VisionCameraPlugins/FaceDetector/types.ts +0 -99
  248. package/src/Shared/VisionCameraPlugins/TextRecognition/Camera.tsx +0 -76
  249. package/src/Shared/VisionCameraPlugins/TextRecognition/PhotoRecognizer.ts +0 -18
  250. package/src/Shared/VisionCameraPlugins/TextRecognition/RemoveLanguageModel.ts +0 -7
  251. package/src/Shared/VisionCameraPlugins/TextRecognition/index.ts +0 -7
  252. package/src/Shared/VisionCameraPlugins/TextRecognition/scanText.ts +0 -27
  253. package/src/Shared/VisionCameraPlugins/TextRecognition/translateText.ts +0 -21
  254. package/src/Shared/VisionCameraPlugins/TextRecognition/types.ts +0 -141
@@ -5,6 +5,7 @@ import {
5
5
  TouchableOpacity,
6
6
  StyleSheet,
7
7
  Platform,
8
+ Switch,
8
9
  } from 'react-native';
9
10
  import { useNavigation } from '@react-navigation/native';
10
11
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
@@ -16,38 +17,92 @@ type ScreenOption = {
16
17
  screen: string;
17
18
  label: string;
18
19
  icon: string;
20
+ hasOptions?: boolean;
21
+ hasDocumentTypeOption?: boolean;
19
22
  setupDemo?: () => void;
20
23
  params?: Record<string, unknown>;
21
24
  };
22
25
 
23
26
  // Icon mapping matching Flutter SDK Material Icons
24
27
  const ICONS = {
25
- LOGIN: '🔑', // Icons.login
26
- HANDSHAKE: '🤝', // Icons.handshake
27
- CREDIT_CARD: '💳', // Icons.credit_card
28
- NFC: '📡', // Icons.nfc
29
- FACE: '👤', // Icons.face
30
- CHECK_CIRCLE: '', // Icons.check_circle
31
- BUG_REPORT: '🔧', // Icons.bug_report (using wrench for debug)
32
- PHONE: '📱', // Icons.phone
28
+ LOGIN: '', // Icons.login - Locked with key for session security
29
+ HANDSHAKE: '📝', // Icons.handshake - Document for contract signing
30
+ CREDIT_CARD: '🪪', // Icons.credit_card - ID card for document scan
31
+ NFC: '💳', // Icons.nfc - Contactless card for eID
32
+ FACE: '📸', // Icons.face - Camera for face detection
33
+ CHECK_CIRCLE: '📋', // Icons.check_circle - Clipboard for results
34
+ BUG_REPORT: '🔧', // Icons.bug_report - Wrench for debugging
35
+ PHONE: '💬', // Icons.phone - Message for OTP code
33
36
  } as const;
34
37
 
35
38
  const DebugNavigationPanel = () => {
36
39
  const [isExpanded, setIsExpanded] = useState(false);
40
+ const [selectedScreen, setSelectedScreen] = useState<ScreenOption | null>(
41
+ null
42
+ );
43
+ const [voiceGuidanceEnabled, setVoiceGuidanceEnabled] = useState(true);
44
+ const [allowIdCard, setAllowIdCard] = useState(true);
45
+ const [allowPassport, setAllowPassport] = useState(true);
37
46
  const navigation = useNavigation();
38
47
  const appContext = useContext(AppContext);
39
48
  const insets = useSafeAreaInsets();
40
49
 
41
- const setupDemoSession = useCallback((setDebugFlag: boolean = false) => {
42
- appContext.setIsDemoSession?.(true);
43
- appContext.identificationInfo.sessionId = 'demo-verification-id';
44
- appContext.identificationInfo.identificationId = 'demo-identification-id';
45
- appContext.isDebugNavigated = setDebugFlag;
50
+ const setupDemoSession = useCallback(
51
+ (setDebugFlag: boolean = false) => {
52
+ appContext.setIsDemoSession?.(true);
53
+ appContext.identificationInfo.sessionId = 'demo-verification-id';
54
+ appContext.identificationInfo.identificationId = 'demo-identification-id';
55
+ appContext.isDebugNavigated = setDebugFlag;
56
+
57
+ // Populate workflow steps with demo data (including contract URLs)
58
+ const demoSession = getSimulatedDemoData<VerificationSession, never>(
59
+ 'GET_SESSION'
60
+ );
61
+ appContext.workflowSteps = demoSession.workflowSteps;
62
+ },
63
+ [appContext]
64
+ );
65
+
66
+ const applyVoiceGuidance = useCallback(
67
+ (enabled: boolean) => {
68
+ if (!appContext.workflowSteps) return;
69
+ appContext.workflowSteps = appContext.workflowSteps.map((step) => ({
70
+ ...step,
71
+ data: {
72
+ ...step.data,
73
+ voiceGuidanceActive: enabled,
74
+ },
75
+ }));
76
+ if (appContext.currentWorkflowStep) {
77
+ appContext.currentWorkflowStep = {
78
+ ...appContext.currentWorkflowStep,
79
+ data: {
80
+ ...appContext.currentWorkflowStep.data,
81
+ voiceGuidanceActive: enabled,
82
+ },
83
+ };
84
+ }
85
+ },
86
+ [appContext]
87
+ );
88
+
89
+ const applyDocumentTypes = useCallback(
90
+ (allowId: boolean, allowPass: boolean) => {
91
+ if (!appContext.currentWorkflowStep) return;
92
+ const allowedTypes: ('I' | 'P')[] = [];
93
+ if (allowId) allowedTypes.push('I');
94
+ if (allowPass) allowedTypes.push('P');
46
95
 
47
- // Populate workflow steps with demo data (including contract URLs)
48
- const demoSession = getSimulatedDemoData<VerificationSession, never>('GET_SESSION');
49
- appContext.workflowSteps = demoSession.workflowSteps;
50
- }, [appContext]);
96
+ appContext.currentWorkflowStep = {
97
+ ...appContext.currentWorkflowStep,
98
+ data: {
99
+ ...appContext.currentWorkflowStep.data,
100
+ allowedDocumentTypes: allowedTypes.length === 2 ? null : allowedTypes,
101
+ },
102
+ };
103
+ },
104
+ [appContext]
105
+ );
51
106
 
52
107
  const screens: ScreenOption[] = [
53
108
  {
@@ -68,6 +123,7 @@ const DebugNavigationPanel = () => {
68
123
  screen: 'ContractAcceptanceScreen',
69
124
  label: 'Consent',
70
125
  icon: ICONS.HANDSHAKE,
126
+ hasOptions: true,
71
127
  setupDemo: () => {
72
128
  setupDemoSession(true);
73
129
  // Set current workflow step to contract acceptance so demo contract URLs are loaded
@@ -83,24 +139,47 @@ const DebugNavigationPanel = () => {
83
139
  screen: 'IdentityDocumentScanningScreen',
84
140
  label: 'ID Scan',
85
141
  icon: ICONS.CREDIT_CARD,
142
+ hasOptions: true,
143
+ hasDocumentTypeOption: true,
86
144
  setupDemo: () => {
87
145
  setupDemoSession(true);
146
+ const step = appContext.workflowSteps?.find(
147
+ (s) => s.type === 'IDENTITY_DOCUMENT_SCAN'
148
+ );
149
+ if (step) {
150
+ appContext.currentWorkflowStep = step;
151
+ }
88
152
  },
89
153
  },
90
154
  {
91
155
  screen: 'IdentityDocumentEIDScanningScreen',
92
156
  label: 'eID Scan',
93
157
  icon: ICONS.NFC,
158
+ hasOptions: true,
159
+ hasDocumentTypeOption: true,
94
160
  setupDemo: () => {
95
161
  setupDemoSession(true);
162
+ const step = appContext.workflowSteps?.find(
163
+ (s) => s.type === 'IDENTITY_DOCUMENT_EID_SCAN'
164
+ );
165
+ if (step) {
166
+ appContext.currentWorkflowStep = step;
167
+ }
96
168
  },
97
169
  },
98
170
  {
99
171
  screen: 'LivenessDetectionScreen',
100
172
  label: 'Liveness',
101
173
  icon: ICONS.FACE,
174
+ hasOptions: true,
102
175
  setupDemo: () => {
103
176
  setupDemoSession(true);
177
+ const step = appContext.workflowSteps?.find(
178
+ (s) => s.type === 'LIVENESS_CHECK'
179
+ );
180
+ if (step) {
181
+ appContext.currentWorkflowStep = step;
182
+ }
104
183
  },
105
184
  },
106
185
  {
@@ -113,17 +192,62 @@ const DebugNavigationPanel = () => {
113
192
  },
114
193
  ];
115
194
 
116
- const jumpToScreen = useCallback(
195
+ const selectScreen = useCallback(
117
196
  (screen: ScreenOption) => {
118
- if (screen.setupDemo) {
119
- screen.setupDemo();
197
+ if (!screen.hasOptions) {
198
+ if (screen.setupDemo) {
199
+ screen.setupDemo();
200
+ }
201
+ (navigation as any).navigate(screen.screen, screen.params);
202
+ setIsExpanded(false);
203
+ return;
120
204
  }
121
- (navigation as any).navigate(screen.screen, screen.params);
122
- setIsExpanded(false);
205
+ setSelectedScreen(screen);
206
+ setVoiceGuidanceEnabled(true);
207
+ setAllowIdCard(true);
208
+ setAllowPassport(true);
123
209
  },
124
210
  [navigation]
125
211
  );
126
212
 
213
+ const jumpToScreen = useCallback(() => {
214
+ if (!selectedScreen) return;
215
+
216
+ // Validate document type selection for document scanning screens
217
+ if (
218
+ selectedScreen.hasDocumentTypeOption &&
219
+ !allowIdCard &&
220
+ !allowPassport
221
+ ) {
222
+ // Don't navigate if no document types are selected
223
+ return;
224
+ }
225
+
226
+ if (selectedScreen.setupDemo) {
227
+ selectedScreen.setupDemo();
228
+ }
229
+ // Apply voice guidance AFTER setupDemo to avoid overwriting
230
+ applyVoiceGuidance(voiceGuidanceEnabled);
231
+ // Apply document types if it's a document scanning screen
232
+ if (selectedScreen.hasDocumentTypeOption) {
233
+ applyDocumentTypes(allowIdCard, allowPassport);
234
+ }
235
+ (navigation as any).navigate(selectedScreen.screen, selectedScreen.params);
236
+ setIsExpanded(false);
237
+ setSelectedScreen(null);
238
+ setVoiceGuidanceEnabled(true);
239
+ setAllowIdCard(true);
240
+ setAllowPassport(true);
241
+ }, [
242
+ navigation,
243
+ selectedScreen,
244
+ voiceGuidanceEnabled,
245
+ allowIdCard,
246
+ allowPassport,
247
+ applyVoiceGuidance,
248
+ applyDocumentTypes,
249
+ ]);
250
+
127
251
  // Only show in development mode
128
252
  if (!__DEV__) {
129
253
  return null;
@@ -134,21 +258,101 @@ const DebugNavigationPanel = () => {
134
258
  {isExpanded && (
135
259
  <View style={styles.panel}>
136
260
  <Text style={styles.title}>SDK JUMP TO SCREEN:</Text>
137
- {screens.map((screen) => (
138
- <TouchableOpacity
139
- key={screen.screen}
140
- style={styles.screenButton}
141
- onPress={() => jumpToScreen(screen)}
142
- >
143
- <Text style={styles.screenIcon}>{screen.icon}</Text>
144
- <Text style={styles.screenLabel}>{screen.label}</Text>
145
- </TouchableOpacity>
146
- ))}
261
+ {selectedScreen ? (
262
+ <View>
263
+ <Text style={styles.optionsTitle}>
264
+ {selectedScreen.icon} {selectedScreen.label}
265
+ </Text>
266
+ <View style={styles.optionRow}>
267
+ <Text style={styles.optionLabel}>🔊 Voice Guidance</Text>
268
+ <Switch
269
+ value={voiceGuidanceEnabled}
270
+ onValueChange={setVoiceGuidanceEnabled}
271
+ trackColor={{ false: '#616161', true: '#FF5252' }}
272
+ thumbColor="white"
273
+ />
274
+ </View>
275
+ {selectedScreen.hasDocumentTypeOption && (
276
+ <>
277
+ <View style={styles.optionRow}>
278
+ <Text style={styles.optionLabel}>🪪 Allow ID Card</Text>
279
+ <Switch
280
+ value={allowIdCard}
281
+ onValueChange={setAllowIdCard}
282
+ trackColor={{ false: '#616161', true: '#FF5252' }}
283
+ thumbColor="white"
284
+ />
285
+ </View>
286
+ <View style={styles.optionRow}>
287
+ <Text style={styles.optionLabel}>🛂 Allow Passport</Text>
288
+ <Switch
289
+ value={allowPassport}
290
+ onValueChange={setAllowPassport}
291
+ trackColor={{ false: '#616161', true: '#FF5252' }}
292
+ thumbColor="white"
293
+ />
294
+ </View>
295
+ </>
296
+ )}
297
+ <View style={styles.actionRow}>
298
+ <TouchableOpacity
299
+ style={styles.backButton}
300
+ onPress={() => setSelectedScreen(null)}
301
+ >
302
+ <Text style={styles.backButtonText}>◀ Back</Text>
303
+ </TouchableOpacity>
304
+ <TouchableOpacity
305
+ style={[
306
+ styles.goButton,
307
+ selectedScreen.hasDocumentTypeOption &&
308
+ !allowIdCard &&
309
+ !allowPassport &&
310
+ styles.goButtonDisabled,
311
+ ]}
312
+ onPress={jumpToScreen}
313
+ disabled={
314
+ selectedScreen.hasDocumentTypeOption &&
315
+ !allowIdCard &&
316
+ !allowPassport
317
+ }
318
+ >
319
+ <Text
320
+ style={[
321
+ styles.goButtonText,
322
+ selectedScreen.hasDocumentTypeOption &&
323
+ !allowIdCard &&
324
+ !allowPassport &&
325
+ styles.goButtonTextDisabled,
326
+ ]}
327
+ >
328
+ Go ▶
329
+ </Text>
330
+ </TouchableOpacity>
331
+ </View>
332
+ </View>
333
+ ) : (
334
+ screens.map((screen) => (
335
+ <TouchableOpacity
336
+ key={screen.screen}
337
+ style={styles.screenButton}
338
+ onPress={() => selectScreen(screen)}
339
+ >
340
+ <Text style={styles.screenIcon}>{screen.icon}</Text>
341
+ <Text style={styles.screenLabel}>{screen.label}</Text>
342
+ </TouchableOpacity>
343
+ ))
344
+ )}
147
345
  </View>
148
346
  )}
149
347
  <TouchableOpacity
150
348
  style={styles.toggleButton}
151
- onPress={() => setIsExpanded(!isExpanded)}
349
+ onPress={() => {
350
+ setIsExpanded(!isExpanded);
351
+ setSelectedScreen(null);
352
+ setVoiceGuidanceEnabled(true);
353
+ setAllowIdCard(true);
354
+ setAllowPassport(true);
355
+ }}
152
356
  >
153
357
  <Text style={styles.bugIcon}>{ICONS.BUG_REPORT}</Text>
154
358
  {isExpanded && (
@@ -214,7 +418,7 @@ const styles = StyleSheet.create({
214
418
  marginBottom: 10,
215
419
  borderWidth: 1,
216
420
  borderColor: 'rgba(255, 82, 82, 0.5)',
217
- minWidth: 180,
421
+ minWidth: 200,
218
422
  ...Platform.select({
219
423
  ios: {
220
424
  shadowColor: '#000',
@@ -257,6 +461,58 @@ const styles = StyleSheet.create({
257
461
  fontWeight: '500',
258
462
  flex: 1,
259
463
  },
464
+ optionsTitle: {
465
+ color: 'white',
466
+ fontSize: 14,
467
+ fontWeight: 'bold',
468
+ marginBottom: 12,
469
+ },
470
+ optionRow: {
471
+ flexDirection: 'row',
472
+ alignItems: 'center',
473
+ justifyContent: 'space-between',
474
+ paddingVertical: 6,
475
+ marginBottom: 12,
476
+ },
477
+ optionLabel: {
478
+ color: 'white',
479
+ fontSize: 13,
480
+ },
481
+ actionRow: {
482
+ flexDirection: 'row',
483
+ gap: 8,
484
+ },
485
+ backButton: {
486
+ flex: 1,
487
+ backgroundColor: '#616161',
488
+ paddingVertical: 8,
489
+ borderRadius: 4,
490
+ alignItems: 'center',
491
+ },
492
+ backButtonText: {
493
+ color: 'white',
494
+ fontSize: 12,
495
+ fontWeight: '500',
496
+ },
497
+ goButton: {
498
+ flex: 1,
499
+ backgroundColor: '#FF5252',
500
+ paddingVertical: 8,
501
+ borderRadius: 4,
502
+ alignItems: 'center',
503
+ },
504
+ goButtonDisabled: {
505
+ backgroundColor: '#9E9E9E',
506
+ opacity: 0.5,
507
+ },
508
+ goButtonText: {
509
+ color: 'white',
510
+ fontSize: 12,
511
+ fontWeight: 'bold',
512
+ },
513
+ goButtonTextDisabled: {
514
+ color: '#CCCCCC',
515
+ },
260
516
  });
261
517
 
262
518
  export default DebugNavigationPanel;
@@ -6,13 +6,14 @@ import DeviceInfo from 'react-native-device-info';
6
6
  import { MRZInfo } from '../EIDReader/lds/icao/mrzInfo';
7
7
  import { eidReader } from '../EIDReader/eidReader';
8
8
  import NativeProgressBar from './NativeProgressBar';
9
- import type { FieldRecords } from 'mrz';
9
+ import type { MRZFields } from '../Types/mrzFields';
10
10
  import { useTranslation } from 'react-i18next';
11
11
  import AppContext from '../Contexts/AppContext';
12
12
  import StyledButton from './StyledButton';
13
13
  import LottieView from 'lottie-react-native';
14
14
  import { useKeepAwake } from '../Libs/native-keep-awake.utils';
15
- import { speakWithDebounce } from '../Libs/tts.utils';
15
+ import { speak, resetLastMessage } from '../Libs/tts.utils';
16
+ import { isDebugEnabled } from '../Libs/debug.utils';
16
17
  import {
17
18
  trackEIDScanStart,
18
19
  trackEIDScanComplete,
@@ -25,7 +26,7 @@ interface eIDScannerProps {
25
26
  dateOfExpiry: string;
26
27
  documentType?: string;
27
28
  onScanSuccess?: (
28
- mrzInfo: FieldRecords,
29
+ mrzInfo: MRZFields,
29
30
  faceImage: string,
30
31
  faceImageMimeType: string
31
32
  ) => void;
@@ -67,7 +68,7 @@ const EIDScanner = ({
67
68
  const dd = dateStr.substring(4, 6);
68
69
 
69
70
  // Assume 19xx if YY >= 50, else 20xx
70
- const year = parseInt(yy) >= 50 ? `19${yy}` : `20${yy}`;
71
+ const year = parseInt(yy, 10) >= 50 ? `19${yy}` : `20${yy}`;
71
72
  return `${dd}/${mm}/${year}`;
72
73
  }
73
74
 
@@ -91,6 +92,7 @@ const EIDScanner = ({
91
92
  const appContext = React.useContext(AppContext);
92
93
  const [voiceGuidanceMessage, setVoiceGuidanceMessage] = useState<string>();
93
94
  const [attemptNumber, setAttemptNumber] = useState<number>(0);
95
+ const lastVoiceGuidanceMessage = useRef<string>('');
94
96
 
95
97
  const readNFC = useCallback(async () => {
96
98
  const startTime = Date.now();
@@ -101,6 +103,8 @@ const EIDScanner = ({
101
103
  setIsScanned(false);
102
104
  setProgress(0);
103
105
  setProgressStage('');
106
+ lastVoiceGuidanceMessage.current = '';
107
+ resetLastMessage();
104
108
 
105
109
  // Track EID scan start using analytics helper
106
110
  const docType =
@@ -141,7 +145,9 @@ const EIDScanner = ({
141
145
  return;
142
146
  }
143
147
 
144
- await trackEIDScanStart(docType, hasNfc, isEnabled, currentAttempt).catch(()=>{});
148
+ await trackEIDScanStart(docType, hasNfc, isEnabled, currentAttempt).catch(
149
+ () => {}
150
+ );
145
151
 
146
152
  try {
147
153
  if (documentNumber && dateOfBirth && dateOfExpiry) {
@@ -169,9 +175,11 @@ const EIDScanner = ({
169
175
  setDocumentMRZInfo(passportData.mrz);
170
176
  setDocumentFaceImageMimeType(passportData.mimeType);
171
177
  setIsScanned(true);
172
-
173
- // Track successful EID scan
174
- await trackEIDScanComplete(docType, scanDuration, currentAttempt).catch(()=>{});
178
+ await trackEIDScanComplete(
179
+ docType,
180
+ scanDuration,
181
+ currentAttempt
182
+ ).catch(() => {});
175
183
  }
176
184
  } else {
177
185
  const scanDuration = Date.now() - startTime;
@@ -267,7 +275,7 @@ const EIDScanner = ({
267
275
  issuingState: mrz.getIssuingState(),
268
276
  sex: mrz.getGender().getStrCode(),
269
277
  nationality: mrz.getNationality(),
270
- } satisfies FieldRecords;
278
+ } satisfies MRZFields;
271
279
  }, []);
272
280
 
273
281
  useEffect(() => {
@@ -358,9 +366,11 @@ const EIDScanner = ({
358
366
  useEffect(() => {
359
367
  if (
360
368
  voiceGuidanceMessage &&
361
- appContext.currentWorkflowStep?.data?.voiceGuidanceActive
369
+ appContext.currentWorkflowStep?.data?.voiceGuidanceActive &&
370
+ voiceGuidanceMessage !== lastVoiceGuidanceMessage.current
362
371
  ) {
363
- speakWithDebounce(voiceGuidanceMessage);
372
+ lastVoiceGuidanceMessage.current = voiceGuidanceMessage;
373
+ speak(voiceGuidanceMessage, true);
364
374
  }
365
375
  }, [
366
376
  voiceGuidanceMessage,
@@ -371,12 +381,22 @@ const EIDScanner = ({
371
381
  <View style={styles.container}>
372
382
  {/* NFC scan progress indicator and text at the top */}
373
383
  {hasNfc && !isScanned && progress > 0 && (
374
- <View style={[styles.topProgressContainer, { paddingTop: insets.top + 16 }]}>
384
+ <View
385
+ style={[styles.topProgressContainer, { paddingTop: insets.top + 16 }]}
386
+ >
387
+ <Text style={styles.holdSteadyText}>
388
+ {t('eidScannerScreen.readingDocument')}
389
+ </Text>
375
390
  <View style={styles.progressTextContainer}>
376
391
  <Text style={styles.topScanningText}>
377
- {progressStage || t('eidScannerScreen.readingDocument')}
392
+ {progressStage || t('eidScannerScreen.connecting')}
378
393
  </Text>
379
- <Text style={[styles.progressPercentage, { color: appContext.branding.primaryColor }]}>
394
+ <Text
395
+ style={[
396
+ styles.progressPercentage,
397
+ { color: appContext.branding.primaryColor },
398
+ ]}
399
+ >
380
400
  {Math.round(progress)}%
381
401
  </Text>
382
402
  </View>
@@ -574,7 +594,6 @@ const EIDScanner = ({
574
594
  </Text>
575
595
  )))}
576
596
 
577
-
578
597
  {hasNfc && isEnabled && isScanned && (
579
598
  <View style={styles.buttonsContainer}>
580
599
  <StyledButton
@@ -599,6 +618,58 @@ const EIDScanner = ({
599
618
  </StyledButton>
600
619
  </View>
601
620
  )}
621
+
622
+ {isDebugEnabled() && (
623
+ <View
624
+ style={{
625
+ position: 'absolute',
626
+ top: insets.top + 10,
627
+ right: 10,
628
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
629
+ padding: 10,
630
+ borderRadius: 8,
631
+ borderWidth: 1,
632
+ borderColor: '#FF6B6B',
633
+ maxWidth: 200,
634
+ zIndex: 1001,
635
+ }}
636
+ >
637
+ <Text
638
+ style={{
639
+ color: '#FF6B6B',
640
+ fontSize: 11,
641
+ fontWeight: 'bold',
642
+ marginBottom: 6,
643
+ }}
644
+ >
645
+ 🐛 DEBUG MODE
646
+ </Text>
647
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
648
+ {`NFC: ${hasNfc ? '✓' : '✗'}`}
649
+ </Text>
650
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
651
+ {`Enabled: ${isEnabled ? '✓' : '✗'}`}
652
+ </Text>
653
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
654
+ {`Scanning: ${isScanning ? '✓' : '○'}`}
655
+ </Text>
656
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
657
+ {`Scanned: ${isScanned ? '✓' : '○'}`}
658
+ </Text>
659
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
660
+ {`Progress: ${Math.round(progress)}%`}
661
+ </Text>
662
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
663
+ {`Face Image: ${documentFaceImage ? '✓' : '✗'}`}
664
+ </Text>
665
+ <Text style={{ color: '#88D8B0', fontSize: 9, marginBottom: 2 }}>
666
+ {`MRZ Info: ${documentMRZInfo ? '✓' : '✗'}`}
667
+ </Text>
668
+ <Text style={{ color: '#88D8B0', fontSize: 9 }}>
669
+ {`Doc Type: ${documentType}`}
670
+ </Text>
671
+ </View>
672
+ )}
602
673
  </>
603
674
  )}
604
675
  </View>
@@ -623,6 +694,13 @@ const styles = StyleSheet.create({
623
694
  backgroundColor: 'rgba(255, 255, 255, 0.95)',
624
695
  gap: 8,
625
696
  },
697
+ holdSteadyText: {
698
+ fontSize: 20,
699
+ fontWeight: '700',
700
+ color: '#000',
701
+ textAlign: 'center',
702
+ marginBottom: 8,
703
+ },
626
704
  progressTextContainer: {
627
705
  flexDirection: 'row',
628
706
  justifyContent: 'space-between',
@@ -630,7 +708,7 @@ const styles = StyleSheet.create({
630
708
  width: '100%',
631
709
  },
632
710
  topScanningText: {
633
- fontSize: 18,
711
+ fontSize: 14,
634
712
  fontWeight: 'bold',
635
713
  color: '#000',
636
714
  flex: 1,