@trustchex/react-native-sdk 1.475.1 → 1.481.1

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 (108) hide show
  1. package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +76 -24
  2. package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +1 -0
  3. package/ios/Camera/TrustchexCameraView.swift +20 -15
  4. package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +3 -2
  5. package/lib/module/Screens/Static/QrCodeScanningScreen.js +12 -2
  6. package/lib/module/Screens/Static/ResultScreen.js +145 -113
  7. package/lib/module/Shared/Components/DebugOverlay.js +5 -2
  8. package/lib/module/Shared/Components/DiagnosticReportButton.js +64 -0
  9. package/lib/module/Shared/Components/IdentityDocumentCamera.js +185 -30
  10. package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +8 -1
  11. package/lib/module/Shared/Components/NavigationManager.js +7 -9
  12. package/lib/module/Shared/EIDReader/eidReader.js +159 -38
  13. package/lib/module/Shared/Libs/MRZ_KNOWN_ISSUES.md +41 -0
  14. package/lib/module/Shared/Libs/SignalingClient.js +6 -5
  15. package/lib/module/Shared/Libs/crypto.utils.js +25 -3
  16. package/lib/module/Shared/Libs/deeplink.utils.js +37 -7
  17. package/lib/module/Shared/Libs/diagnosticReport.js +133 -0
  18. package/lib/module/Shared/Libs/diagnostics.js +171 -0
  19. package/lib/module/Shared/Libs/http-client.js +19 -6
  20. package/lib/module/Shared/Libs/mrz.utils.js +193 -33
  21. package/lib/module/Shared/Libs/mrzFrameAggregator.js +74 -3
  22. package/lib/module/Shared/Libs/native-device-info.utils.js +67 -0
  23. package/lib/module/Shared/Libs/promise.utils.js +4 -3
  24. package/lib/module/Shared/Libs/sendDiagnosticReport.js +130 -0
  25. package/lib/module/Shared/Libs/shuffle.utils.js +17 -0
  26. package/lib/module/Shared/Services/AnalyticsService.js +8 -2
  27. package/lib/module/Shared/Services/DataUploadService.js +114 -127
  28. package/lib/module/Shared/Services/VideoSessionService.js +4 -3
  29. package/lib/module/Translation/Resources/en.js +6 -0
  30. package/lib/module/Translation/Resources/tr.js +6 -0
  31. package/lib/module/Trustchex.js +20 -4
  32. package/lib/module/version.js +1 -1
  33. package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
  34. package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
  35. package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
  36. package/lib/typescript/src/Shared/Components/DebugOverlay.d.ts.map +1 -1
  37. package/lib/typescript/src/Shared/Components/DiagnosticReportButton.d.ts +20 -0
  38. package/lib/typescript/src/Shared/Components/DiagnosticReportButton.d.ts.map +1 -0
  39. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
  40. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.types.d.ts +10 -0
  41. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.types.d.ts.map +1 -1
  42. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +1 -1
  43. package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
  44. package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
  45. package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts +10 -0
  46. package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts.map +1 -1
  47. package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
  48. package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts.map +1 -1
  49. package/lib/typescript/src/Shared/Libs/crypto.utils.d.ts.map +1 -1
  50. package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts +1 -0
  51. package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
  52. package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts +48 -0
  53. package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts.map +1 -0
  54. package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +145 -0
  55. package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -0
  56. package/lib/typescript/src/Shared/Libs/http-client.d.ts +2 -0
  57. package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
  58. package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
  59. package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts +55 -0
  60. package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts.map +1 -1
  61. package/lib/typescript/src/Shared/Libs/native-device-info.utils.d.ts +33 -0
  62. package/lib/typescript/src/Shared/Libs/native-device-info.utils.d.ts.map +1 -1
  63. package/lib/typescript/src/Shared/Libs/promise.utils.d.ts.map +1 -1
  64. package/lib/typescript/src/Shared/Libs/sendDiagnosticReport.d.ts +30 -0
  65. package/lib/typescript/src/Shared/Libs/sendDiagnosticReport.d.ts.map +1 -0
  66. package/lib/typescript/src/Shared/Libs/shuffle.utils.d.ts +3 -0
  67. package/lib/typescript/src/Shared/Libs/shuffle.utils.d.ts.map +1 -0
  68. package/lib/typescript/src/Shared/Services/AnalyticsService.d.ts.map +1 -1
  69. package/lib/typescript/src/Shared/Services/DataUploadService.d.ts.map +1 -1
  70. package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts.map +1 -1
  71. package/lib/typescript/src/Translation/Resources/en.d.ts +6 -0
  72. package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
  73. package/lib/typescript/src/Translation/Resources/tr.d.ts +6 -0
  74. package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
  75. package/lib/typescript/src/Trustchex.d.ts.map +1 -1
  76. package/lib/typescript/src/version.d.ts +1 -1
  77. package/package.json +17 -3
  78. package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +4 -3
  79. package/src/Screens/Static/QrCodeScanningScreen.tsx +19 -2
  80. package/src/Screens/Static/ResultScreen.tsx +172 -162
  81. package/src/Shared/Components/DebugOverlay.tsx +5 -2
  82. package/src/Shared/Components/DiagnosticReportButton.tsx +77 -0
  83. package/src/Shared/Components/IdentityDocumentCamera.tsx +200 -29
  84. package/src/Shared/Components/IdentityDocumentCamera.types.ts +6 -0
  85. package/src/Shared/Components/IdentityDocumentCamera.utils.ts +9 -1
  86. package/src/Shared/Components/NavigationManager.tsx +7 -7
  87. package/src/Shared/Components/TrustchexCamera.tsx +6 -0
  88. package/src/Shared/EIDReader/eidReader.ts +181 -52
  89. package/src/Shared/Libs/MRZ_KNOWN_ISSUES.md +41 -0
  90. package/src/Shared/Libs/SignalingClient.ts +10 -5
  91. package/src/Shared/Libs/crypto.utils.ts +41 -4
  92. package/src/Shared/Libs/deeplink.utils.ts +39 -7
  93. package/src/Shared/Libs/diagnosticReport.ts +206 -0
  94. package/src/Shared/Libs/diagnostics.ts +251 -0
  95. package/src/Shared/Libs/http-client.ts +24 -8
  96. package/src/Shared/Libs/mrz.utils.ts +200 -34
  97. package/src/Shared/Libs/mrzFrameAggregator.ts +112 -2
  98. package/src/Shared/Libs/native-device-info.utils.ts +116 -0
  99. package/src/Shared/Libs/promise.utils.ts +11 -5
  100. package/src/Shared/Libs/sendDiagnosticReport.ts +165 -0
  101. package/src/Shared/Libs/shuffle.utils.ts +15 -0
  102. package/src/Shared/Services/AnalyticsService.ts +17 -1
  103. package/src/Shared/Services/DataUploadService.ts +155 -166
  104. package/src/Shared/Services/VideoSessionService.ts +15 -3
  105. package/src/Translation/Resources/en.ts +7 -0
  106. package/src/Translation/Resources/tr.ts +7 -0
  107. package/src/Trustchex.tsx +26 -3
  108. package/src/version.ts +1 -1
@@ -4,9 +4,10 @@ import RNFS from 'react-native-fs';
4
4
  import { Platform } from 'react-native';
5
5
  import { getSessionKey, encryptWithAes } from "../Libs/crypto.utils.js";
6
6
  import mrzUtils from "../Libs/mrz.utils.js";
7
- import httpClient from "../Libs/http-client.js";
7
+ import httpClient, { getSessionToken } from "../Libs/http-client.js";
8
8
  import { NotFoundError } from "../Libs/http-client.js";
9
9
  import { runWithRetry } from "../Libs/promise.utils.js";
10
+ import { debugLog, debugWarn, logError, logWarn } from "../Libs/debug.utils.js";
10
11
 
11
12
  /**
12
13
  * Service to upload collected identification data to the backend.
@@ -18,9 +19,9 @@ export class DataUploadService {
18
19
  this.apiUrl = `${baseUrl}/api/app/mobile`;
19
20
  }
20
21
  async ensureIdentificationExists(identificationId) {
21
- console.log('[DataUploadService] POST', `${this.apiUrl}/identifications/${identificationId}`);
22
+ debugLog('DataUploadService', 'POST', `${this.apiUrl}/identifications/${identificationId}`);
22
23
  await httpClient.post(`${this.apiUrl}/identifications/${identificationId}`, {});
23
- console.log('[DataUploadService] ✓ Identification created/verified');
24
+ debugLog('DataUploadService', '✓ Identification created/verified');
24
25
  }
25
26
 
26
27
  /**
@@ -28,12 +29,12 @@ export class DataUploadService {
28
29
  */
29
30
  async submitDocumentData(identificationId, scannedDocument, sessionKey) {
30
31
  if (!scannedDocument || scannedDocument.documentType === 'UNKNOWN') {
31
- console.log('[DataUploadService] No document data to submit');
32
+ debugLog('DataUploadService', 'No document data to submit');
32
33
  return;
33
34
  }
34
35
  const mrzFields = scannedDocument.mrzFields;
35
36
  if (!mrzFields) {
36
- console.log('[DataUploadService] No MRZ fields to submit');
37
+ debugLog('DataUploadService', 'No MRZ fields to submit');
37
38
  return;
38
39
  }
39
40
  const identificationDocument = {
@@ -50,28 +51,32 @@ export class DataUploadService {
50
51
  dataSource: scannedDocument.dataSource,
51
52
  mrzText: scannedDocument.mrzText
52
53
  };
53
- console.log('[DataUploadService] Submitting document data:', identificationDocument.type, identificationDocument.number);
54
+ debugLog('DataUploadService', 'Submitting document data:', identificationDocument.type);
54
55
  const {
55
56
  encryptedData,
56
57
  nonce
57
58
  } = encryptWithAes(JSON.stringify(identificationDocument), sessionKey);
58
- console.log('[DataUploadService] POST', `${this.apiUrl}/identifications/${identificationId}/documents`);
59
+ debugLog('DataUploadService', 'POST', `${this.apiUrl}/identifications/${identificationId}/documents`);
59
60
  await runWithRetry(() => httpClient.post(`${this.apiUrl}/identifications/${identificationId}/documents`, {
60
61
  encryptedData,
61
62
  nonce
62
63
  }));
63
- console.log('[DataUploadService] ✓ Document data submitted');
64
+ debugLog('DataUploadService', '✓ Document data submitted');
64
65
  }
65
66
 
66
67
  /**
67
68
  * Upload media files (document images, selfies, etc.)
68
69
  */
69
70
  async uploadMedia(identificationId, scannedDocument, livenessDetection, onProgress) {
71
+ const sessionToken = getSessionToken();
70
72
  const uploadFileOptions = {
71
73
  toUrl: `${this.apiUrl}/identifications/${identificationId}/media`,
72
74
  method: 'POST',
73
75
  headers: {
74
- Accept: 'application/json'
76
+ Accept: 'application/json',
77
+ ...(sessionToken ? {
78
+ 'X-Session-Token': sessionToken
79
+ } : {})
75
80
  },
76
81
  files: [],
77
82
  progress: res => {
@@ -80,127 +85,109 @@ export class DataUploadService {
80
85
  }
81
86
  };
82
87
 
83
- // Add document front image
84
- const frontImage = scannedDocument?.frontImage;
85
- if (frontImage && frontImage !== '') {
86
- const filePath = `${RNFS.TemporaryDirectoryPath}/DOCUMENT_FRONT_IMAGE.jpg`;
87
- await RNFS.writeFile(decodeURIComponent(filePath), frontImage, 'base64');
88
+ // Plaintext identity images/video staged on disk for the multipart upload;
89
+ // every entry is deleted in the finally below, whether the upload succeeds
90
+ // or not.
91
+ const tempPaths = [];
92
+ const writeTempImage = async (fileName, base64Data) => {
93
+ const filePath = decodeURIComponent(`${RNFS.TemporaryDirectoryPath}/${fileName}`);
94
+ await RNFS.writeFile(filePath, base64Data, 'base64');
95
+ tempPaths.push(filePath);
88
96
  uploadFileOptions.files.push({
89
97
  name: 'files',
90
- filename: 'DOCUMENT_FRONT_IMAGE.jpg',
91
- filepath: decodeURIComponent(filePath),
98
+ filename: fileName,
99
+ filepath: filePath,
92
100
  filetype: 'image/jpeg'
93
101
  });
94
- }
102
+ return filePath;
103
+ };
104
+ try {
105
+ // Add document front image
106
+ const frontImage = scannedDocument?.frontImage;
107
+ if (frontImage && frontImage !== '') {
108
+ await writeTempImage('DOCUMENT_FRONT_IMAGE.jpg', frontImage);
109
+ }
95
110
 
96
- // Add document back image
97
- const backImage = scannedDocument?.backImage;
98
- if (backImage && backImage !== '') {
99
- const filePath = `${RNFS.TemporaryDirectoryPath}/DOCUMENT_BACK_IMAGE.jpg`;
100
- await RNFS.writeFile(decodeURIComponent(filePath), backImage, 'base64');
101
- uploadFileOptions.files.push({
102
- name: 'files',
103
- filename: 'DOCUMENT_BACK_IMAGE.jpg',
104
- filepath: decodeURIComponent(filePath),
105
- filetype: 'image/jpeg'
106
- });
107
- }
111
+ // Add document back image
112
+ const backImage = scannedDocument?.backImage;
113
+ if (backImage && backImage !== '') {
114
+ await writeTempImage('DOCUMENT_BACK_IMAGE.jpg', backImage);
115
+ }
108
116
 
109
- // Add face image from document
110
- const faceImage = scannedDocument?.faceImage;
111
- if (faceImage && faceImage !== '') {
112
- const filePath = `${RNFS.TemporaryDirectoryPath}/FACE_IMAGE.jpg`;
113
- await RNFS.writeFile(decodeURIComponent(filePath), faceImage, 'base64');
114
- uploadFileOptions.files.push({
115
- name: 'files',
116
- filename: 'FACE_IMAGE.jpg',
117
- filepath: decodeURIComponent(filePath),
118
- filetype: 'image/jpeg'
119
- });
120
- }
117
+ // Add face image from document
118
+ const faceImage = scannedDocument?.faceImage;
119
+ if (faceImage && faceImage !== '') {
120
+ await writeTempImage('FACE_IMAGE.jpg', faceImage);
121
+ }
121
122
 
122
- // Add secondary face image from document (optional)
123
- const secondaryFaceImage = scannedDocument?.secondaryFaceImage;
124
- if (secondaryFaceImage && secondaryFaceImage !== '') {
125
- const filePath = `${RNFS.TemporaryDirectoryPath}/DOCUMENT_SECONDARY_FACE_IMAGE.jpg`;
126
- await RNFS.writeFile(decodeURIComponent(filePath), secondaryFaceImage, 'base64');
127
- uploadFileOptions.files.push({
128
- name: 'files',
129
- filename: 'DOCUMENT_SECONDARY_FACE_IMAGE.jpg',
130
- filepath: decodeURIComponent(filePath),
131
- filetype: 'image/jpeg'
132
- });
133
- }
123
+ // Add secondary face image from document (optional)
124
+ const secondaryFaceImage = scannedDocument?.secondaryFaceImage;
125
+ if (secondaryFaceImage && secondaryFaceImage !== '') {
126
+ await writeTempImage('DOCUMENT_SECONDARY_FACE_IMAGE.jpg', secondaryFaceImage);
127
+ }
134
128
 
135
- // Add hologram image from document (optional)
136
- const hologramImage = scannedDocument?.hologramImage;
137
- if (hologramImage && hologramImage !== '') {
138
- const filePath = `${RNFS.TemporaryDirectoryPath}/DOCUMENT_HOLOGRAM_IMAGE.jpg`;
139
- await RNFS.writeFile(decodeURIComponent(filePath), hologramImage, 'base64');
140
- uploadFileOptions.files.push({
141
- name: 'files',
142
- filename: 'DOCUMENT_HOLOGRAM_IMAGE.jpg',
143
- filepath: decodeURIComponent(filePath),
144
- filetype: 'image/jpeg'
145
- });
146
- }
129
+ // Add hologram image from document (optional)
130
+ const hologramImage = scannedDocument?.hologramImage;
131
+ if (hologramImage && hologramImage !== '') {
132
+ await writeTempImage('DOCUMENT_HOLOGRAM_IMAGE.jpg', hologramImage);
133
+ }
147
134
 
148
- // Add liveness images and selfie from liveness detection
149
- if (livenessDetection?.instructions) {
150
- for (const instruction of livenessDetection.instructions) {
151
- if (instruction?.photo) {
152
- const filePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_${instruction.instruction}_IMAGE.jpg`;
153
- await RNFS.writeFile(decodeURIComponent(filePath), instruction.photo, 'base64');
154
- uploadFileOptions.files.push({
155
- name: 'files',
156
- filename: `LIVENESS_${instruction.instruction}_IMAGE.jpg`,
157
- filepath: decodeURIComponent(filePath),
158
- filetype: 'image/jpeg'
159
- });
160
- if (instruction.instruction === 'LOOK_STRAIGHT_AND_BLINK') {
161
- uploadFileOptions.files.push({
162
- name: 'files',
163
- filename: 'SELFIE_IMAGE.jpg',
164
- filepath: decodeURIComponent(filePath),
165
- filetype: 'image/jpeg'
166
- });
135
+ // Add liveness images and selfie from liveness detection
136
+ if (livenessDetection?.instructions) {
137
+ for (const instruction of livenessDetection.instructions) {
138
+ if (instruction?.photo) {
139
+ const filePath = await writeTempImage(`LIVENESS_${instruction.instruction}_IMAGE.jpg`, instruction.photo);
140
+ if (instruction.instruction === 'LOOK_STRAIGHT_AND_BLINK') {
141
+ uploadFileOptions.files.push({
142
+ name: 'files',
143
+ filename: 'SELFIE_IMAGE.jpg',
144
+ filepath: filePath,
145
+ filetype: 'image/jpeg'
146
+ });
147
+ }
167
148
  }
168
149
  }
169
150
  }
170
- }
171
151
 
172
- // Add liveness video (optional)
173
- if (livenessDetection?.videoPath) {
174
- let videoFilePath;
175
- if (Platform.OS === 'ios') {
176
- const tempDir = `${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}`;
177
- await RNFS.mkdir(tempDir);
178
- videoFilePath = `${tempDir}/LIVENESS_VIDEO.mp4`;
179
- } else {
180
- videoFilePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`;
152
+ // Add liveness video (optional). Only the staged copy is cleaned up here;
153
+ // livenessDetection.videoPath stays available for later submissions.
154
+ if (livenessDetection?.videoPath) {
155
+ let videoFilePath;
156
+ if (Platform.OS === 'ios') {
157
+ const tempDir = `${RNFS.TemporaryDirectoryPath}/${new Date().getTime()}`;
158
+ await RNFS.mkdir(tempDir);
159
+ tempPaths.push(tempDir);
160
+ videoFilePath = `${tempDir}/LIVENESS_VIDEO.mp4`;
161
+ } else {
162
+ videoFilePath = decodeURIComponent(`${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`);
163
+ tempPaths.push(videoFilePath);
164
+ }
165
+ await RNFS.copyFile(livenessDetection.videoPath, videoFilePath);
166
+ uploadFileOptions.files.push({
167
+ name: 'files',
168
+ filename: 'LIVENESS_VIDEO.mp4',
169
+ filepath: decodeURIComponent(videoFilePath),
170
+ filetype: 'video/mp4'
171
+ });
181
172
  }
182
- await RNFS.copyFile(livenessDetection.videoPath, videoFilePath);
183
- uploadFileOptions.files.push({
184
- name: 'files',
185
- filename: 'LIVENESS_VIDEO.mp4',
186
- filepath: decodeURIComponent(videoFilePath),
187
- filetype: 'video/mp4'
188
- });
189
- }
190
173
 
191
- // Skip upload if no files
192
- if (uploadFileOptions.files.length === 0) {
193
- console.log('[DataUploadService] No media files to upload');
194
- return;
195
- }
196
- console.log('[DataUploadService] Uploading', uploadFileOptions.files.length, 'media files to', uploadFileOptions.toUrl);
197
- const response = await runWithRetry(() => RNFS.uploadFiles(uploadFileOptions).promise);
198
- console.log('[DataUploadService] Upload response status:', response.statusCode);
199
- if (![200, 201, 204].includes(response.statusCode)) {
200
- console.error('[DataUploadService] Media upload failed:', response.statusCode, response.body);
201
- throw new Error(`Media upload failed: ${response.statusCode}`);
174
+ // Skip upload if no files
175
+ if (uploadFileOptions.files.length === 0) {
176
+ debugLog('DataUploadService', 'No media files to upload');
177
+ return;
178
+ }
179
+ debugLog('DataUploadService', `Uploading ${uploadFileOptions.files.length} media files to`, uploadFileOptions.toUrl);
180
+ const response = await runWithRetry(() => RNFS.uploadFiles(uploadFileOptions).promise);
181
+ debugLog('DataUploadService', 'Upload response status:', response.statusCode);
182
+ if (![200, 201, 204].includes(response.statusCode)) {
183
+ logError('DataUploadService', `Media upload failed: ${response.statusCode}`);
184
+ debugLog('DataUploadService', 'Failed upload response:', response.body);
185
+ throw new Error(`Media upload failed: ${response.statusCode}`);
186
+ }
187
+ debugLog('DataUploadService', '✓ Media uploaded successfully');
188
+ } finally {
189
+ await Promise.all(tempPaths.map(path => RNFS.unlink(path).catch(() => {})));
202
190
  }
203
- console.log('[DataUploadService] ✓ Media uploaded successfully');
204
191
  }
205
192
 
206
193
  /**
@@ -217,27 +204,27 @@ export class DataUploadService {
217
204
  authToken
218
205
  } = identificationInfo;
219
206
  if (!identificationId) {
220
- console.log('[DataUploadService] No identification ID, skipping upload');
207
+ debugLog('DataUploadService', 'No identification ID, skipping upload');
221
208
  return false;
222
209
  }
223
- console.log('[DataUploadService] ========== UPLOADING COLLECTED DATA ==========');
224
- console.log('[DataUploadService] Identification ID:', identificationId);
225
- console.log('[DataUploadService] Has document:', !!scannedDocument);
226
- console.log('[DataUploadService] Has liveness:', !!livenessDetection);
227
- console.log('[DataUploadService] Has auth token:', !!authToken);
210
+ debugLog('DataUploadService', '========== UPLOADING COLLECTED DATA ==========');
211
+ debugLog('DataUploadService', 'Identification ID:', identificationId);
212
+ debugLog('DataUploadService', 'Has document:', !!scannedDocument);
213
+ debugLog('DataUploadService', 'Has liveness:', !!livenessDetection);
214
+ debugLog('DataUploadService', 'Has auth token:', !!authToken);
228
215
  try {
229
216
  await runWithRetry(() => this.ensureIdentificationExists(identificationId));
230
217
 
231
218
  // Always refresh session key for current session (required for encrypted submission)
232
219
  if (sessionId) {
233
220
  const existingAuthToken = authToken;
234
- console.log('[DataUploadService] Getting session key...');
221
+ debugLog('DataUploadService', 'Getting session key...');
235
222
  try {
236
223
  authToken = await runWithRetry(() => getSessionKey(this.apiUrl, sessionId));
237
- console.log('[DataUploadService] ✓ Session key obtained');
224
+ debugLog('DataUploadService', '✓ Session key obtained');
238
225
  } catch (error) {
239
226
  if (existingAuthToken) {
240
- console.warn('[DataUploadService] Session key refresh failed, using existing token');
227
+ debugWarn('DataUploadService', 'Session key refresh failed, using existing token');
241
228
  authToken = existingAuthToken;
242
229
  } else {
243
230
  throw error;
@@ -245,7 +232,7 @@ export class DataUploadService {
245
232
  }
246
233
  }
247
234
  if (!authToken) {
248
- console.log('[DataUploadService] No session key available, skipping upload');
235
+ debugLog('DataUploadService', 'No session key available, skipping upload');
249
236
  return false;
250
237
  }
251
238
 
@@ -262,7 +249,7 @@ export class DataUploadService {
262
249
  onProgress?.(0.4 + p * 0.5);
263
250
  }));
264
251
  onProgress?.(1.0);
265
- console.log('[DataUploadService] ✓ All collected data uploaded');
252
+ debugLog('DataUploadService', '✓ All collected data uploaded');
266
253
 
267
254
  // Mark media as uploaded during video call
268
255
  identificationInfo.mediaUploadedDuringVideoCall = true;
@@ -272,10 +259,10 @@ export class DataUploadService {
272
259
  return true;
273
260
  } catch (error) {
274
261
  if (error instanceof NotFoundError) {
275
- console.warn('[DataUploadService] Upload skipped: identification is not active anymore');
262
+ logWarn('DataUploadService', 'Upload skipped: identification is not active anymore');
276
263
  return false;
277
264
  }
278
- console.error('[DataUploadService] Failed to upload collected data:', error);
265
+ logError('DataUploadService', 'Failed to upload collected data:', error);
279
266
  return false;
280
267
  }
281
268
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import { debugLog } from "../Libs/debug.utils.js";
3
4
  export class VideoSessionService {
4
5
  constructor(baseUrl, identificationId) {
5
6
  this.baseUrl = baseUrl;
@@ -102,11 +103,11 @@ export class VideoSessionService {
102
103
  // Use react-native-sse for real SSE support
103
104
  const EventSource = require('react-native-sse').default;
104
105
  const url = `${this.baseUrl}/api/app/mobile/video-sessions/${sessionId}/queue-status?identificationId=${this.identificationId}`;
105
- console.log('[VideoSessionService] Creating SSE connection to:', url);
106
+ debugLog('VideoSessionService', '[VideoSessionService] Creating SSE connection to:', url);
106
107
  const es = new EventSource(url);
107
108
  let heartbeatInterval = null;
108
109
  es.addEventListener('open', () => {
109
- console.log('[VideoSessionService] Queue SSE connected');
110
+ debugLog('VideoSessionService', '[VideoSessionService] Queue SSE connected');
110
111
  // Send initial heartbeat
111
112
  this.sendHeartbeat(sessionId).catch(() => {});
112
113
  // Set up periodic heartbeat (every 20s to stay under 30s watchdog)
@@ -121,7 +122,7 @@ export class VideoSessionService {
121
122
  es.addEventListener('message', event => {
122
123
  try {
123
124
  const data = JSON.parse(event.data);
124
- console.log('[VideoSessionService] Queue update:', data);
125
+ debugLog('VideoSessionService', '[VideoSessionService] Queue update:', data);
125
126
  if (data.queuePosition !== undefined) {
126
127
  onUpdate(data.queuePosition);
127
128
  }
@@ -45,6 +45,11 @@ export default {
45
45
  'resultScreen.demoVerbalConsentTitle': 'Title',
46
46
  'resultScreen.demoVerbalConsentText': 'Text',
47
47
  'resultScreen.demoStartOver': 'Start Over',
48
+ 'diagnosticReport.button': 'Report a scanning issue',
49
+ 'diagnosticReport.noticeTitle': 'Share diagnostic report',
50
+ 'diagnosticReport.noticeBody': 'This opens a draft with your scan data, document images and technical details so support can help resolve a scanning issue. Review it before sending.',
51
+ 'diagnosticReport.continue': 'Continue',
52
+ 'diagnosticReport.cancel': 'Cancel',
48
53
  'livenessDetectionScreen.guideHeader': 'Face Verification',
49
54
  'livenessDetectionScreen.guideText': 'Please ensure the following for best results:',
50
55
  'livenessDetectionScreen.guidePoint1': 'Remove glasses, hats, or face coverings',
@@ -112,6 +117,7 @@ export default {
112
117
  'identityDocumentCamera.alignIDFrontSide': 'Align the front side of your ID card',
113
118
  'identityDocumentCamera.alignIDBackSide': 'Align the back side of your ID card',
114
119
  'identityDocumentCamera.scanCompleted': 'Scan completed!',
120
+ 'identityDocumentCamera.mrzDetected': 'MRZ detected — hold steady',
115
121
  'identityDocumentCamera.searchingDocument': 'Position document within the frame',
116
122
  'identityDocumentCamera.faceDetected': 'Keep device steady...',
117
123
  'identityDocumentCamera.readingDocument': 'Reading document...',
@@ -45,6 +45,11 @@ export default {
45
45
  'resultScreen.demoVerbalConsentTitle': 'Başlık',
46
46
  'resultScreen.demoVerbalConsentText': 'Metin',
47
47
  'resultScreen.demoStartOver': 'Baştan Başla',
48
+ 'diagnosticReport.button': 'Tarama sorununu bildir',
49
+ 'diagnosticReport.noticeTitle': 'Tanılama raporu paylaş',
50
+ 'diagnosticReport.noticeBody': 'Bu işlem; tarama verilerinizi, belge görüntülerinizi ve teknik ayrıntıları içeren bir taslak açar; böylece destek ekibi tarama sorununu çözebilir. Göndermeden önce gözden geçirin.',
51
+ 'diagnosticReport.continue': 'Devam et',
52
+ 'diagnosticReport.cancel': 'İptal',
48
53
  'livenessDetectionScreen.guideHeader': 'Yüz Doğrulaması',
49
54
  'livenessDetectionScreen.guideText': 'En iyi sonuç için lütfen şunları sağlayın:',
50
55
  'livenessDetectionScreen.guidePoint1': 'Gözlük, şapka veya yüz aksesuarlarını çıkarın',
@@ -112,6 +117,7 @@ export default {
112
117
  'identityDocumentCamera.alignIDFrontSide': 'Kimlik kartınızın ön yüzünü hizalayın',
113
118
  'identityDocumentCamera.alignIDBackSide': 'Kimlik kartınızın arka yüzünü hizalayın',
114
119
  'identityDocumentCamera.scanCompleted': 'Tarama tamamlandı!',
120
+ 'identityDocumentCamera.mrzDetected': 'MRZ algılandı — sabit tutun',
115
121
  'identityDocumentCamera.searchingDocument': 'Belgeyi çerçeve içine yerleştirin',
116
122
  'identityDocumentCamera.faceDetected': 'Cihazı sabit tutun...',
117
123
  'identityDocumentCamera.readingDocument': 'Belge okunuyor...',
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import React, { useEffect, useState, useMemo, useRef } from 'react';
3
+ import React, { useEffect, useState, useMemo, useRef, useCallback } from 'react';
4
4
  import { NavigationContainer } from '@react-navigation/native';
5
5
  import { createNativeStackNavigator } from '@react-navigation/native-stack';
6
6
  import { View, ActivityIndicator, StyleSheet } from 'react-native';
@@ -65,10 +65,26 @@ const Trustchex = ({
65
65
  // A plain useMemo would create a new object on every dependency change,
66
66
  // discarding those mutations and causing screens to see undefined values.
67
67
  const contextRef = useRef(null);
68
+
69
+ // Wrap the demo-session setter so it ALSO mutates the persistent context
70
+ // object synchronously. The React state update is async, but the verification
71
+ // flow navigates to the next step in the same tick and advances thereafter by
72
+ // direct mutation (never re-rendering Trustchex). If isDemoSession lived only
73
+ // as a state-derived memo field, downstream screens (e.g. ResultScreen, which
74
+ // gates the diagnostics button on it) could read a stale `false`. Mutating the
75
+ // ref makes the flag travel with the object every screen holds.
76
+ const setIsDemoSessionAndPersist = useCallback(value => {
77
+ if (contextRef.current) {
78
+ contextRef.current.isDemoSession = value;
79
+ }
80
+ setIsDemoSession(value);
81
+ }, []);
68
82
  const contextValue = useMemo(() => {
69
83
  const prev = contextRef.current;
70
84
  const value = {
71
- isDemoSession,
85
+ // Prefer a direct mutation carried on the persistent object over the
86
+ // (possibly not-yet-flushed) state, so the demo flag can't desync.
87
+ isDemoSession: prev?.isDemoSession || isDemoSession,
72
88
  baseUrl: baseUrl || '',
73
89
  locale,
74
90
  branding,
@@ -92,7 +108,7 @@ const Trustchex = ({
92
108
  onError,
93
109
  setSessionId,
94
110
  setBaseUrl,
95
- setIsDemoSession
111
+ setIsDemoSession: setIsDemoSessionAndPersist
96
112
  };
97
113
 
98
114
  // Update state-derived identificationInfo fields without replacing
@@ -103,7 +119,7 @@ const Trustchex = ({
103
119
  value.identificationInfo.locale = propLocale || i18n.language;
104
120
  contextRef.current = value;
105
121
  return value;
106
- }, [baseUrl, locale, branding, sessionId, propLocale, onCompleted, onError, isDemoSession]);
122
+ }, [baseUrl, locale, branding, sessionId, propLocale, onCompleted, onError, isDemoSession, setIsDemoSessionAndPersist]);
107
123
 
108
124
  // Initialize analytics when SDK mounts with valid session
109
125
  useEffect(() => {
@@ -2,4 +2,4 @@
2
2
 
3
3
  // This file is auto-generated. Do not edit manually.
4
4
  // Version is synced from package.json during build.
5
- export const SDK_VERSION = '1.475.1';
5
+ export const SDK_VERSION = '1.481.1';
@@ -1 +1 @@
1
- {"version":3,"file":"LivenessDetectionScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Dynamic/LivenessDetectionScreen.tsx"],"names":[],"mappings":"AA2FA,QAAA,MAAM,uBAAuB,+CAy9B5B,CAAC;AA+GF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"LivenessDetectionScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Dynamic/LivenessDetectionScreen.tsx"],"names":[],"mappings":"AA4FA,QAAA,MAAM,uBAAuB,+CAy9B5B,CAAC;AA+GF,eAAe,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"QrCodeScanningScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Static/QrCodeScanningScreen.tsx"],"names":[],"mappings":"AAUA,QAAA,MAAM,oBAAoB,+CAwCzB,CAAC;AASF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"QrCodeScanningScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Static/QrCodeScanningScreen.tsx"],"names":[],"mappings":"AAWA,QAAA,MAAM,oBAAoB,+CAwDzB,CAAC;AASF,eAAe,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResultScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Static/ResultScreen.tsx"],"names":[],"mappings":"AAqDA,QAAA,MAAM,YAAY,+CAqiCjB,CAAC;AAqIF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ResultScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Static/ResultScreen.tsx"],"names":[],"mappings":"AA8EA,QAAA,MAAM,YAAY,+CAshCjB,CAAC;AAqIF,eAAe,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DebugOverlay.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/DebugOverlay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,gCAAgC,CAAC;AA2PxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB,EAAE,YAAY,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,mBAAmB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,QAAA,MAAM,YAAY,+CAyThB,CAAC;AAIH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,gDAiDxB,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"DebugOverlay.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/DebugOverlay.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,gCAAgC,CAAC;AA2PxC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB,EAAE,YAAY,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,mBAAmB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,QAAA,MAAM,YAAY,+CAyThB,CAAC;AAIH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,gDAoDxB,CAAC;AAEH,eAAe,YAAY,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { type DiagnosticImage } from '../Libs/sendDiagnosticReport';
3
+ import type { ScanDataForReport } from '../Libs/diagnosticReport';
4
+ export interface DiagnosticReportButtonProps {
5
+ scan: ScanDataForReport;
6
+ sessionId?: string;
7
+ images?: DiagnosticImage[];
8
+ }
9
+ /**
10
+ * "Report a scanning issue" button for the result screen.
11
+ *
12
+ * Shows a brief notice describing what will be shared (the draft itself is the
13
+ * user's review/consent step), then opens the OS share sheet — the user picks
14
+ * email / WhatsApp / Drive / etc. and sends the diagnostic bundle to support.
15
+ * Self-contained so the result screen only needs to render it with the scan
16
+ * data + captured images.
17
+ */
18
+ declare const DiagnosticReportButton: React.FC<DiagnosticReportButtonProps>;
19
+ export default DiagnosticReportButton;
20
+ //# sourceMappingURL=DiagnosticReportButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticReportButton.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/DiagnosticReportButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA+CjE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityDocumentCamera.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.tsx"],"names":[],"mappings":"AAwEA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,2BAA2B,EAK5B,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAMnE,QAAA,MAAM,sBAAsB,GAAI,uDAI7B,2BAA2B,4CA04E7B,CAAC;AAiIF,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"IdentityDocumentCamera.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.tsx"],"names":[],"mappings":"AAyEA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,2BAA2B,EAK5B,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAMnE,QAAA,MAAM,sBAAsB,GAAI,uDAI7B,2BAA2B,4CAojF7B,CAAC;AAiIF,eAAe,sBAAsB,CAAC"}
@@ -18,6 +18,16 @@ export type BlockText = {
18
18
  blocks: BlocksData[];
19
19
  resultText: string;
20
20
  mrzOnlyText?: string;
21
+ /**
22
+ * Per-frame OCR confidence over MRZ characters from ML Kit per-symbol
23
+ * confidence (Android bundled library only; undefined on iOS). Feeds the
24
+ * multi-frame vote weight so low-confidence frames count less.
25
+ */
26
+ textConfidence?: {
27
+ mean: number;
28
+ min: number;
29
+ count: number;
30
+ };
21
31
  };
22
32
  export type BlocksData = {
23
33
  blockFrame: FrameType;
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityDocumentCamera.types.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IdentityDocumentCamera.types.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,SAAS,GACT,UAAU,GACV,eAAe,GACf,WAAW,GACX,eAAe,GACf,KAAK,GACL,cAAc,GACd,WAAW,CAAC;AAEhB,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,wBAAwB,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,SAAS,GAAG;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,gBAAgB,EAAE,gBAAgB;IAClC,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,SAAS;IACpB,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE;IAC5B,QAAQ,EAAE,MAAM;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,mBAAmB,EAAE,gBAAgB;IACrC,YAAY,EAAE,SAAS;IACvB,WAAW,EAAE,MAAM;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EACR,gBAAgB,GAChB,UAAU,GACV,oBAAoB,GACpB,eAAe,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,OAAO,CAAC;IACrB,yBAAyB,EAAE,CAAC,WAAW,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,YAAY,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAChB,2BAA2B,GAC3B,cAAc,GACd,eAAe,GACf,WAAW,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAE5E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3E,MAAM,MAAM,aAAa,GACrB,2BAA2B,GAC3B,cAAc,GACd,eAAe,GACf,IAAI,CAAC;AAET,MAAM,MAAM,kBAAkB,GAAG;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3C,CAAC"}
@@ -42,7 +42,7 @@ export declare function transformBoundsToScreen(bounds: {
42
42
  * Unified status message logic used by both voice guidance and render text.
43
43
  * Returns the appropriate i18n key arguments for the current scan state.
44
44
  */
45
- export declare function getStatusMessage(nextStep: ScanStep, status: ScanStatus, detectedDocumentType: DocumentType, isBrightnessLow: boolean, isFrameBlurry: boolean, allElementsDetected: boolean, elementsOutsideScanArea: string[], t: (key: string, params?: Record<string, unknown>) => string): string;
45
+ export declare function getStatusMessage(nextStep: ScanStep, status: ScanStatus, detectedDocumentType: DocumentType, isBrightnessLow: boolean, isFrameBlurry: boolean, allElementsDetected: boolean, elementsOutsideScanArea: string[], t: (key: string, params?: Record<string, unknown>) => string, mrzReliable?: boolean): string;
46
46
  /**
47
47
  * Calculate angle from two points in degrees
48
48
  */
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityDocumentCamera.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IdentityDocumentCamera.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationManager.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/NavigationManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;AAoBf,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,QAAA,MAAM,iBAAiB,wFA0PtB,CAAC;AAWF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"NavigationManager.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/NavigationManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;AAmBf,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,QAAA,MAAM,iBAAiB,wFAyPtB,CAAC;AAaF,eAAe,iBAAiB,CAAC"}
@@ -10,6 +10,16 @@ export interface Frame {
10
10
  faces?: NativeFace[];
11
11
  textBlocks?: NativeTextBlock[];
12
12
  resultText?: string;
13
+ /**
14
+ * Per-frame OCR confidence over MRZ characters, from ML Kit per-symbol
15
+ * confidence. Android (bundled ML Kit library) only — iOS ML Kit exposes no
16
+ * symbol-level confidence, so this is undefined there.
17
+ */
18
+ textConfidence?: {
19
+ mean: number;
20
+ min: number;
21
+ count: number;
22
+ };
13
23
  barcodes?: NativeBarcode[];
14
24
  }
15
25
  export interface NativeFace {