@trustchex/react-native-sdk 1.381.0 → 1.464.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 (204) hide show
  1. package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
  2. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +60 -13
  3. package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +1 -1
  4. package/ios/Camera/TrustchexCameraView.swift +10 -13
  5. package/ios/MLKit/MLKitModule.swift +1 -1
  6. package/lib/module/Screens/Debug/BarcodeTestScreen.js +308 -0
  7. package/lib/module/Screens/Debug/MRZTestScreen.js +105 -13
  8. package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
  9. package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +49 -32
  10. package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +22 -4
  11. package/lib/module/Screens/Dynamic/IdentityDocumentScanningScreen.js +5 -0
  12. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +126 -27
  13. package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
  14. package/lib/module/Screens/Dynamic/VideoCallScreen.js +678 -0
  15. package/lib/module/Screens/Static/OTPVerificationScreen.js +6 -0
  16. package/lib/module/Screens/Static/QrCodeScanningScreen.js +7 -1
  17. package/lib/module/Screens/Static/ResultScreen.js +154 -34
  18. package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +59 -51
  19. package/lib/module/Shared/Animations/recording.json +1 -0
  20. package/lib/module/Shared/Animations/video-call.json +1 -0
  21. package/lib/module/Shared/Components/DebugNavigationPanel.js +231 -67
  22. package/lib/module/Shared/Components/EIDScanner.js +213 -112
  23. package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
  24. package/lib/module/Shared/Components/IdentityDocumentCamera.js +77 -39
  25. package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
  26. package/lib/module/Shared/Components/NavigationManager.js +39 -19
  27. package/lib/module/Shared/Contexts/AppContext.js +1 -0
  28. package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
  29. package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
  30. package/lib/module/Shared/EIDReader/bacKey.js +16 -2
  31. package/lib/module/Shared/EIDReader/eidReader.js +354 -13
  32. package/lib/module/Shared/EIDReader/eidService.js +25 -1
  33. package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
  34. package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
  35. package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
  36. package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
  37. package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
  38. package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
  39. package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
  40. package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
  41. package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
  42. package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
  43. package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
  44. package/lib/module/Shared/Libs/SignalingClient.js +128 -0
  45. package/lib/module/Shared/Libs/analytics.utils.js +8 -0
  46. package/lib/module/Shared/Libs/contains.js +1 -40
  47. package/lib/module/Shared/Libs/country-display.utils.js +34 -0
  48. package/lib/module/Shared/Libs/deeplink.utils.js +9 -1
  49. package/lib/module/Shared/Libs/demo.utils.js +8 -0
  50. package/lib/module/Shared/Libs/http-client.js +9 -0
  51. package/lib/module/Shared/Libs/mrz.utils.js +3 -2
  52. package/lib/module/Shared/Libs/promise.utils.js +16 -2
  53. package/lib/module/Shared/Libs/status-bar.utils.js +23 -0
  54. package/lib/module/Shared/Services/DataUploadService.js +294 -0
  55. package/lib/module/Shared/Services/VideoSessionService.js +156 -0
  56. package/lib/module/Shared/Services/WebRTCService.js +510 -0
  57. package/lib/module/Shared/Types/analytics.types.js +4 -0
  58. package/lib/module/Translation/Resources/en.js +61 -2
  59. package/lib/module/Translation/Resources/tr.js +61 -2
  60. package/lib/module/Trustchex.js +64 -20
  61. package/lib/module/version.js +1 -1
  62. package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts +3 -0
  63. package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts.map +1 -0
  64. package/lib/typescript/src/Screens/Debug/MRZTestScreen.d.ts.map +1 -1
  65. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
  66. package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
  67. package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
  68. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
  69. package/lib/typescript/src/Screens/Dynamic/IdentityDocumentScanningScreen.d.ts.map +1 -1
  70. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  71. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
  72. package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
  73. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts +3 -0
  74. package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -0
  75. package/lib/typescript/src/Screens/Static/OTPVerificationScreen.d.ts.map +1 -1
  76. package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
  77. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  78. package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
  79. package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
  80. package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
  81. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  82. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
  83. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
  84. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
  85. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
  86. package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
  87. package/lib/typescript/src/Shared/Contexts/AppContext.d.ts +1 -0
  88. package/lib/typescript/src/Shared/Contexts/AppContext.d.ts.map +1 -1
  89. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
  90. package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
  91. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
  92. package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
  93. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
  94. package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
  95. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  96. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
  97. package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
  98. package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
  99. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
  100. package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
  101. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
  102. package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
  103. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
  104. package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
  105. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
  106. package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
  107. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
  108. package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
  109. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
  110. package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
  111. package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
  112. package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
  113. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
  114. package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
  115. package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts +24 -0
  116. package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts.map +1 -0
  117. package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
  118. package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
  119. package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
  120. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
  121. package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
  122. package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
  123. package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
  124. package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
  125. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  126. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  127. package/lib/typescript/src/Shared/Libs/promise.utils.d.ts.map +1 -1
  128. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts +9 -0
  129. package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -0
  130. package/lib/typescript/src/Shared/Services/DataUploadService.d.ts +25 -0
  131. package/lib/typescript/src/Shared/Services/DataUploadService.d.ts.map +1 -0
  132. package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts +33 -0
  133. package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts.map +1 -0
  134. package/lib/typescript/src/Shared/Services/WebRTCService.d.ts +58 -0
  135. package/lib/typescript/src/Shared/Services/WebRTCService.d.ts.map +1 -0
  136. package/lib/typescript/src/Shared/Types/analytics.types.d.ts +4 -0
  137. package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
  138. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +13 -1
  139. package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
  140. package/lib/typescript/src/Translation/Resources/en.d.ts +60 -1
  141. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  142. package/lib/typescript/src/Translation/Resources/tr.d.ts +60 -1
  143. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  144. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  145. package/lib/typescript/src/version.d.ts +1 -1
  146. package/package.json +35 -5
  147. package/src/Screens/Debug/BarcodeTestScreen.tsx +317 -0
  148. package/src/Screens/Debug/MRZTestScreen.tsx +107 -13
  149. package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
  150. package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +58 -35
  151. package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +27 -4
  152. package/src/Screens/Dynamic/IdentityDocumentScanningScreen.tsx +6 -0
  153. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +156 -27
  154. package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
  155. package/src/Screens/Dynamic/VideoCallScreen.tsx +766 -0
  156. package/src/Screens/Static/OTPVerificationScreen.tsx +6 -0
  157. package/src/Screens/Static/QrCodeScanningScreen.tsx +7 -1
  158. package/src/Screens/Static/ResultScreen.tsx +235 -48
  159. package/src/Screens/Static/VerificationSessionCheckScreen.tsx +67 -72
  160. package/src/Shared/Animations/recording.json +1 -0
  161. package/src/Shared/Animations/video-call.json +1 -0
  162. package/src/Shared/Components/DebugNavigationPanel.tsx +252 -51
  163. package/src/Shared/Components/EIDScanner.tsx +223 -116
  164. package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
  165. package/src/Shared/Components/IdentityDocumentCamera.tsx +224 -188
  166. package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
  167. package/src/Shared/Components/NavigationManager.tsx +41 -19
  168. package/src/Shared/Contexts/AppContext.ts +2 -0
  169. package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
  170. package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
  171. package/src/Shared/EIDReader/bacKey.ts +24 -8
  172. package/src/Shared/EIDReader/eidReader.ts +398 -12
  173. package/src/Shared/EIDReader/eidService.ts +49 -1
  174. package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
  175. package/src/Shared/EIDReader/paceInfo.ts +159 -0
  176. package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
  177. package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
  178. package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
  179. package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
  180. package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
  181. package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
  182. package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
  183. package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
  184. package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
  185. package/src/Shared/Libs/SignalingClient.ts +189 -0
  186. package/src/Shared/Libs/analytics.utils.ts +8 -0
  187. package/src/Shared/Libs/contains.ts +0 -53
  188. package/src/Shared/Libs/country-display.utils.ts +55 -0
  189. package/src/Shared/Libs/crypto.utils.ts +2 -2
  190. package/src/Shared/Libs/deeplink.utils.ts +12 -1
  191. package/src/Shared/Libs/demo.utils.ts +10 -0
  192. package/src/Shared/Libs/http-client.ts +19 -1
  193. package/src/Shared/Libs/mrz.utils.ts +3 -2
  194. package/src/Shared/Libs/promise.utils.ts +16 -2
  195. package/src/Shared/Libs/status-bar.utils.ts +21 -0
  196. package/src/Shared/Services/DataUploadService.ts +395 -0
  197. package/src/Shared/Services/VideoSessionService.ts +190 -0
  198. package/src/Shared/Services/WebRTCService.ts +636 -0
  199. package/src/Shared/Types/analytics.types.ts +4 -0
  200. package/src/Shared/Types/identificationInfo.ts +16 -1
  201. package/src/Translation/Resources/en.ts +88 -3
  202. package/src/Translation/Resources/tr.ts +89 -3
  203. package/src/Trustchex.tsx +65 -19
  204. package/src/version.ts +1 -1
@@ -11,6 +11,7 @@ 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
+ import { getLocalizedCountryName } from '../Libs/country-display.utils';
14
15
  import { useKeepAwake } from '../Libs/native-keep-awake.utils';
15
16
  import { speak, resetLastMessage } from '../Libs/tts.utils';
16
17
  import {
@@ -87,11 +88,48 @@ const EIDScanner = ({
87
88
  }, []);
88
89
  const [isScanned, setIsScanned] = React.useState(false);
89
90
  const [hasGuideShown, setHasGuideShown] = React.useState(false);
90
- const { t } = useTranslation();
91
+ const { t, i18n } = useTranslation();
91
92
  const appContext = React.useContext(AppContext);
93
+
94
+ const formatGender = useCallback(
95
+ (code?: string | null) => {
96
+ switch (code?.toUpperCase()) {
97
+ case 'M':
98
+ return t('eidScannerScreen.genderMale', 'Male');
99
+ case 'F':
100
+ return t('eidScannerScreen.genderFemale', 'Female');
101
+ default:
102
+ return t('eidScannerScreen.genderUnspecified', 'Unspecified');
103
+ }
104
+ },
105
+ [t]
106
+ );
107
+
108
+ const formatDocumentType = useCallback(
109
+ (code?: string | null) => {
110
+ if (!code) return '';
111
+ const upper = code.toUpperCase();
112
+ if (upper.startsWith('P'))
113
+ return t('eidScannerScreen.docTypePassport', 'Passport');
114
+ if (upper.startsWith('I'))
115
+ return t('eidScannerScreen.docTypeID', 'ID Card');
116
+ if (upper.startsWith('A'))
117
+ return t('eidScannerScreen.docTypeResidence', 'Residence Permit');
118
+ if (upper.startsWith('V'))
119
+ return t('eidScannerScreen.docTypeVisa', 'Visa');
120
+ return code;
121
+ },
122
+ [t]
123
+ );
124
+
125
+ const formatNationality = useCallback(
126
+ (code?: string | null) => {
127
+ return getLocalizedCountryName(code, i18n.language);
128
+ },
129
+ [i18n.language]
130
+ );
92
131
  const [voiceGuidanceMessage, setVoiceGuidanceMessage] = useState<string>();
93
132
  const [attemptNumber, setAttemptNumber] = useState<number>(0);
94
- const lastVoiceGuidanceMessage = useRef<string>('');
95
133
 
96
134
  const readNFC = useCallback(async () => {
97
135
  const startTime = Date.now();
@@ -102,7 +140,6 @@ const EIDScanner = ({
102
140
  setIsScanned(false);
103
141
  setProgress(0);
104
142
  setProgressStage('');
105
- lastVoiceGuidanceMessage.current = '';
106
143
  resetLastMessage();
107
144
 
108
145
  // Track EID scan start using analytics helper
@@ -365,10 +402,8 @@ const EIDScanner = ({
365
402
  useEffect(() => {
366
403
  if (
367
404
  voiceGuidanceMessage &&
368
- appContext.currentWorkflowStep?.data?.voiceGuidanceActive &&
369
- voiceGuidanceMessage !== lastVoiceGuidanceMessage.current
405
+ appContext.currentWorkflowStep?.data?.voiceGuidanceActive
370
406
  ) {
371
- lastVoiceGuidanceMessage.current = voiceGuidanceMessage;
372
407
  speak(voiceGuidanceMessage, true);
373
408
  }
374
409
  }, [
@@ -438,106 +473,118 @@ const EIDScanner = ({
438
473
  </View>
439
474
  ) : (
440
475
  <>
441
- {isScanned &&
442
- documentFaceImage &&
443
- documentFaceImageMimeType === 'image/jpeg' && (
444
- <Image
445
- source={{
446
- uri: `data:${documentFaceImageMimeType};base64,${documentFaceImage}`,
447
- }}
448
- style={styles.faceImage}
449
- />
450
- )}
451
-
452
- {isScanned &&
453
- documentFaceImage &&
454
- // TODO Add support for jp2 images
455
- documentFaceImageMimeType === 'image/jp2' && (
456
- <Text style={styles.mainText}>
457
- {t('eidScannerScreen.imageCannotBeShown')}
458
- </Text>
459
- )}
460
-
461
- {isScanned && !documentFaceImage && (
462
- <Text style={styles.mainText}>
463
- {t('eidScannerScreen.faceImageNotFound')}
464
- </Text>
465
- )}
466
-
467
- {isScanned && documentMRZInfo && (
468
- <View style={styles.mrzInfo}>
469
- <View style={styles.mrzInfoItem}>
470
- <Text style={styles.mrzInfoLabel}>
471
- {t('eidScannerScreen.documentCode')}:
472
- </Text>
473
- <Text style={styles.mrzInfoText}>
474
- {documentMRZInfo.getDocumentCode()}
475
- </Text>
476
- </View>
477
- <View style={styles.mrzInfoItem}>
478
- <Text style={styles.mrzInfoLabel}>
479
- {t('eidScannerScreen.nationality')}:
480
- </Text>
481
- <Text style={styles.mrzInfoText}>
482
- {documentMRZInfo.getNationality()}
483
- </Text>
484
- </View>
485
- <View style={styles.mrzInfoItem}>
486
- <Text style={styles.mrzInfoLabel}>
487
- {t('eidScannerScreen.personalNumber')}:
488
- </Text>
489
- <Text style={styles.mrzInfoText}>
490
- {documentMRZInfo.getOptionalData1()}
491
- </Text>
492
- </View>
493
- <View style={styles.mrzInfoItem}>
494
- <Text style={styles.mrzInfoLabel}>
495
- {t('eidScannerScreen.documentNumber')}:
496
- </Text>
497
- <Text style={styles.mrzInfoText}>
498
- {documentMRZInfo.getDocumentNumber()}
499
- </Text>
500
- </View>
501
- <View style={styles.mrzInfoItem}>
502
- <Text style={styles.mrzInfoLabel}>
503
- {t('eidScannerScreen.name')}:
504
- </Text>
505
- <Text style={styles.mrzInfoText}>
506
- {documentMRZInfo.getSecondaryIdentifier()}
507
- </Text>
508
- </View>
509
- <View style={styles.mrzInfoItem}>
510
- <Text style={styles.mrzInfoLabel}>
511
- {t('eidScannerScreen.surname')}:
512
- </Text>
513
- <Text style={styles.mrzInfoText}>
514
- {documentMRZInfo.getPrimaryIdentifier()}
515
- </Text>
516
- </View>
517
- <View style={styles.mrzInfoItem}>
518
- <Text style={styles.mrzInfoLabel}>
519
- {t('eidScannerScreen.birthDate')}:
520
- </Text>
521
- <Text style={styles.mrzInfoText}>
522
- {formatDate(documentMRZInfo.getDateOfBirth())}
523
- </Text>
524
- </View>
525
- <View style={styles.mrzInfoItem}>
526
- <Text style={styles.mrzInfoLabel}>
527
- {t('eidScannerScreen.gender')}:
528
- </Text>
529
- <Text style={styles.mrzInfoText}>
530
- {documentMRZInfo.getGender().getStrCode()}
531
- </Text>
532
- </View>
533
- <View style={styles.mrzInfoItem}>
534
- <Text style={styles.mrzInfoLabel}>
535
- {t('eidScannerScreen.expirationDate')}:
536
- </Text>
537
- <Text style={styles.mrzInfoText}>
538
- {formatDate(documentMRZInfo.getDateOfExpiry())}
539
- </Text>
476
+ {isScanned && (
477
+ <View style={styles.resultCard}>
478
+ <View style={styles.resultHeader}>
479
+ {documentFaceImage &&
480
+ (documentFaceImageMimeType === 'image/jpeg' ||
481
+ documentFaceImageMimeType === 'image/png') ? (
482
+ <Image
483
+ source={{
484
+ uri: `data:${documentFaceImageMimeType};base64,${documentFaceImage}`,
485
+ }}
486
+ style={styles.faceImage}
487
+ resizeMode="cover"
488
+ />
489
+ ) : (
490
+ <View style={styles.faceImagePlaceholder}>
491
+ <Text style={styles.faceImagePlaceholderText}>?</Text>
492
+ </View>
493
+ )}
494
+ {documentMRZInfo && (
495
+ <View style={styles.resultHeaderInfo}>
496
+ <Text style={styles.fullName} numberOfLines={2}>
497
+ {documentMRZInfo.getSecondaryIdentifier()}{' '}
498
+ {documentMRZInfo.getPrimaryIdentifier()}
499
+ </Text>
500
+ <Text style={styles.subInfo}>
501
+ {formatNationality(documentMRZInfo.getNationality())} ·{' '}
502
+ {formatDocumentType(documentMRZInfo.getDocumentCode())}
503
+ </Text>
504
+ <Text style={styles.subInfo}>
505
+ {formatGender(documentMRZInfo.getGender().getStrCode())} ·{' '}
506
+ {formatDate(documentMRZInfo.getDateOfBirth())}
507
+ </Text>
508
+ </View>
509
+ )}
540
510
  </View>
511
+
512
+ {documentMRZInfo && (
513
+ <View style={styles.mrzInfo}>
514
+ <View style={styles.mrzInfoItem}>
515
+ <Text style={styles.mrzInfoLabel}>
516
+ {t('eidScannerScreen.name')}
517
+ </Text>
518
+ <Text style={styles.mrzInfoText}>
519
+ {documentMRZInfo.getSecondaryIdentifier()}
520
+ </Text>
521
+ </View>
522
+ <View style={styles.mrzInfoItem}>
523
+ <Text style={styles.mrzInfoLabel}>
524
+ {t('eidScannerScreen.surname')}
525
+ </Text>
526
+ <Text style={styles.mrzInfoText}>
527
+ {documentMRZInfo.getPrimaryIdentifier()}
528
+ </Text>
529
+ </View>
530
+ <View style={styles.mrzInfoItem}>
531
+ <Text style={styles.mrzInfoLabel}>
532
+ {t('eidScannerScreen.documentCode')}
533
+ </Text>
534
+ <Text style={styles.mrzInfoText}>
535
+ {formatDocumentType(documentMRZInfo.getDocumentCode())}
536
+ </Text>
537
+ </View>
538
+ <View style={styles.mrzInfoItem}>
539
+ <Text style={styles.mrzInfoLabel}>
540
+ {t('eidScannerScreen.documentNumber')}
541
+ </Text>
542
+ <Text style={styles.mrzInfoText}>
543
+ {documentMRZInfo.getDocumentNumber()}
544
+ </Text>
545
+ </View>
546
+ <View style={styles.mrzInfoItem}>
547
+ <Text style={styles.mrzInfoLabel}>
548
+ {t('eidScannerScreen.personalNumber')}
549
+ </Text>
550
+ <Text style={styles.mrzInfoText}>
551
+ {documentMRZInfo.getOptionalData1()}
552
+ </Text>
553
+ </View>
554
+ <View style={styles.mrzInfoItem}>
555
+ <Text style={styles.mrzInfoLabel}>
556
+ {t('eidScannerScreen.nationality')}
557
+ </Text>
558
+ <Text style={styles.mrzInfoText}>
559
+ {formatNationality(documentMRZInfo.getNationality())}
560
+ </Text>
561
+ </View>
562
+ <View style={styles.mrzInfoItem}>
563
+ <Text style={styles.mrzInfoLabel}>
564
+ {t('eidScannerScreen.gender')}
565
+ </Text>
566
+ <Text style={styles.mrzInfoText}>
567
+ {formatGender(documentMRZInfo.getGender().getStrCode())}
568
+ </Text>
569
+ </View>
570
+ <View style={styles.mrzInfoItem}>
571
+ <Text style={styles.mrzInfoLabel}>
572
+ {t('eidScannerScreen.birthDate')}
573
+ </Text>
574
+ <Text style={styles.mrzInfoText}>
575
+ {formatDate(documentMRZInfo.getDateOfBirth())}
576
+ </Text>
577
+ </View>
578
+ <View style={styles.mrzInfoItem}>
579
+ <Text style={styles.mrzInfoLabel}>
580
+ {t('eidScannerScreen.expirationDate')}
581
+ </Text>
582
+ <Text style={styles.mrzInfoText}>
583
+ {formatDate(documentMRZInfo.getDateOfExpiry())}
584
+ </Text>
585
+ </View>
586
+ </View>
587
+ )}
541
588
  </View>
542
589
  )}
543
590
 
@@ -593,6 +640,14 @@ const EIDScanner = ({
593
640
  </Text>
594
641
  )))}
595
642
 
643
+ {hasNfc && isEnabled && !isScanning && !isScanned && (
644
+ <View style={styles.buttonsContainer}>
645
+ <StyledButton mode="contained" onPress={readNFC}>
646
+ {t('eidScannerScreen.startScanning')}
647
+ </StyledButton>
648
+ </View>
649
+ )}
650
+
596
651
  {hasNfc && isEnabled && isScanned && (
597
652
  <View style={styles.buttonsContainer}>
598
653
  <StyledButton
@@ -692,31 +747,83 @@ const styles = StyleSheet.create({
692
747
  color: 'black',
693
748
  textAlign: 'center',
694
749
  },
695
- faceImage: {
696
- width: 150,
697
- height: 150,
698
- borderRadius: 150,
699
- borderColor: 'lightgray',
750
+ resultCard: {
751
+ backgroundColor: '#fff',
752
+ borderRadius: 16,
753
+ padding: 16,
754
+ gap: 16,
755
+ shadowColor: '#000',
756
+ shadowOffset: { width: 0, height: 2 },
757
+ shadowOpacity: 0.08,
758
+ shadowRadius: 8,
759
+ elevation: 3,
700
760
  borderWidth: 1,
701
- alignSelf: 'center',
761
+ borderColor: '#f0f0f0',
762
+ },
763
+ resultHeader: {
764
+ flexDirection: 'row',
765
+ gap: 14,
766
+ alignItems: 'flex-start',
767
+ },
768
+ resultHeaderInfo: {
769
+ flex: 1,
770
+ gap: 4,
771
+ justifyContent: 'center',
772
+ },
773
+ fullName: {
774
+ fontSize: 17,
775
+ fontWeight: '700',
776
+ color: '#111',
777
+ letterSpacing: 0.2,
778
+ },
779
+ subInfo: {
780
+ fontSize: 13,
781
+ color: '#666',
782
+ fontWeight: '500',
783
+ },
784
+ faceImage: {
785
+ width: 90,
786
+ height: 115,
787
+ borderRadius: 10,
788
+ overflow: 'hidden',
789
+ },
790
+ faceImagePlaceholder: {
791
+ width: 90,
792
+ height: 115,
793
+ borderRadius: 10,
794
+ backgroundColor: '#f5f5f5',
795
+ alignItems: 'center',
796
+ justifyContent: 'center',
797
+ },
798
+ faceImagePlaceholderText: {
799
+ fontSize: 32,
800
+ color: '#ccc',
702
801
  },
703
802
  mrzInfo: {
704
803
  flexDirection: 'column',
705
804
  width: '100%',
805
+ gap: 2,
706
806
  },
707
807
  mrzInfoItem: {
708
808
  flexDirection: 'row',
709
809
  justifyContent: 'space-between',
710
- borderBottomColor: 'lightgray',
810
+ alignItems: 'center',
811
+ paddingVertical: 8,
812
+ borderBottomColor: '#f0f0f0',
711
813
  borderBottomWidth: 1,
712
- paddingVertical: 5,
713
814
  },
714
815
  mrzInfoLabel: {
715
- color: 'black',
716
- fontWeight: 'bold',
816
+ color: '#888',
817
+ fontSize: 13,
818
+ fontWeight: '500',
717
819
  },
718
820
  mrzInfoText: {
719
- color: 'black',
821
+ color: '#111',
822
+ fontSize: 13,
823
+ fontWeight: '600',
824
+ textAlign: 'right',
825
+ flexShrink: 1,
826
+ marginLeft: 8,
720
827
  },
721
828
  guide: {
722
829
  flex: 1,
@@ -6,7 +6,7 @@
6
6
  * KEY DISTINGUISHING FEATURES:
7
7
  * =============================
8
8
  * PASSPORT: Has MRZ on FRONT with pattern P<XXX (e.g., P<TUR, P<USA)
9
- * ID CARD: Has NO MRZ on front; MRZ only on BACK with code 'I'
9
+ * ID CARD: Has NO MRZ on front; MRZ only on BACK with code starting with I, A, or C
10
10
  *
11
11
  * IMPORTANT: Both passports and ID cards have signature sections!
12
12
  * Signature presence is NOT a distinguishing feature between document types.
@@ -31,7 +31,7 @@
31
31
  import type { Face } from './IdentityDocumentCamera.types';
32
32
  import type { MRZFields } from '../Types/mrzFields';
33
33
  import { PASSPORT_MRZ_PATTERN } from './IdentityDocumentCamera.constants';
34
- import { debugLog, isDebugEnabled } from '../Libs/debug.utils';
34
+ import { isIDCardDocumentCode } from './IdentityDocumentCamera.utils';
35
35
 
36
36
  /**
37
37
  * After this many retry attempts for ID_FRONT flow, proceed with face detection alone
@@ -222,10 +222,13 @@ export function handleIDFrontFlow(
222
222
  }
223
223
 
224
224
  // ============================================================================
225
- // STEP 4: Final MRZ code check (if present, must be 'I' not 'P')
225
+ // STEP 4: Final MRZ code check (if present, must be an ID card code, not P)
226
226
  // ============================================================================
227
227
  // ID cards should NOT have MRZ on front, but if detected, verify it's not passport
228
- if (mrzFields?.documentCode && mrzFields.documentCode !== 'I') {
228
+ if (
229
+ mrzFields?.documentCode &&
230
+ !isIDCardDocumentCode(mrzFields.documentCode)
231
+ ) {
229
232
  return {
230
233
  shouldProceed: false,
231
234
  reason: `MRZ shows unexpected document code: ${mrzFields.documentCode}`,