@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.
- package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +76 -24
- package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +1 -0
- package/ios/Camera/TrustchexCameraView.swift +20 -15
- package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +3 -2
- package/lib/module/Screens/Static/QrCodeScanningScreen.js +12 -2
- package/lib/module/Screens/Static/ResultScreen.js +145 -113
- package/lib/module/Shared/Components/DebugOverlay.js +5 -2
- package/lib/module/Shared/Components/DiagnosticReportButton.js +64 -0
- package/lib/module/Shared/Components/IdentityDocumentCamera.js +185 -30
- package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +8 -1
- package/lib/module/Shared/Components/NavigationManager.js +7 -9
- package/lib/module/Shared/EIDReader/eidReader.js +159 -38
- package/lib/module/Shared/Libs/MRZ_KNOWN_ISSUES.md +41 -0
- package/lib/module/Shared/Libs/SignalingClient.js +6 -5
- package/lib/module/Shared/Libs/crypto.utils.js +25 -3
- package/lib/module/Shared/Libs/deeplink.utils.js +37 -7
- package/lib/module/Shared/Libs/diagnosticReport.js +133 -0
- package/lib/module/Shared/Libs/diagnostics.js +171 -0
- package/lib/module/Shared/Libs/http-client.js +19 -6
- package/lib/module/Shared/Libs/mrz.utils.js +193 -33
- package/lib/module/Shared/Libs/mrzFrameAggregator.js +74 -3
- package/lib/module/Shared/Libs/native-device-info.utils.js +67 -0
- package/lib/module/Shared/Libs/promise.utils.js +4 -3
- package/lib/module/Shared/Libs/sendDiagnosticReport.js +130 -0
- package/lib/module/Shared/Libs/shuffle.utils.js +17 -0
- package/lib/module/Shared/Services/AnalyticsService.js +8 -2
- package/lib/module/Shared/Services/DataUploadService.js +114 -127
- package/lib/module/Shared/Services/VideoSessionService.js +4 -3
- package/lib/module/Translation/Resources/en.js +6 -0
- package/lib/module/Translation/Resources/tr.js +6 -0
- package/lib/module/Trustchex.js +20 -4
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/DebugOverlay.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/DiagnosticReportButton.d.ts +20 -0
- package/lib/typescript/src/Shared/Components/DiagnosticReportButton.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.types.d.ts +10 -0
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.types.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts +10 -0
- package/lib/typescript/src/Shared/Components/TrustchexCamera.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/crypto.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts +1 -0
- package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts +48 -0
- package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +145 -0
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/http-client.d.ts +2 -0
- package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts +55 -0
- package/lib/typescript/src/Shared/Libs/mrzFrameAggregator.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/native-device-info.utils.d.ts +33 -0
- package/lib/typescript/src/Shared/Libs/native-device-info.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/promise.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/sendDiagnosticReport.d.ts +30 -0
- package/lib/typescript/src/Shared/Libs/sendDiagnosticReport.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/shuffle.utils.d.ts +3 -0
- package/lib/typescript/src/Shared/Libs/shuffle.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Services/AnalyticsService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Services/DataUploadService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts +6 -0
- package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts +6 -0
- package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
- package/lib/typescript/src/Trustchex.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +17 -3
- package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +4 -3
- package/src/Screens/Static/QrCodeScanningScreen.tsx +19 -2
- package/src/Screens/Static/ResultScreen.tsx +172 -162
- package/src/Shared/Components/DebugOverlay.tsx +5 -2
- package/src/Shared/Components/DiagnosticReportButton.tsx +77 -0
- package/src/Shared/Components/IdentityDocumentCamera.tsx +200 -29
- package/src/Shared/Components/IdentityDocumentCamera.types.ts +6 -0
- package/src/Shared/Components/IdentityDocumentCamera.utils.ts +9 -1
- package/src/Shared/Components/NavigationManager.tsx +7 -7
- package/src/Shared/Components/TrustchexCamera.tsx +6 -0
- package/src/Shared/EIDReader/eidReader.ts +181 -52
- package/src/Shared/Libs/MRZ_KNOWN_ISSUES.md +41 -0
- package/src/Shared/Libs/SignalingClient.ts +10 -5
- package/src/Shared/Libs/crypto.utils.ts +41 -4
- package/src/Shared/Libs/deeplink.utils.ts +39 -7
- package/src/Shared/Libs/diagnosticReport.ts +206 -0
- package/src/Shared/Libs/diagnostics.ts +251 -0
- package/src/Shared/Libs/http-client.ts +24 -8
- package/src/Shared/Libs/mrz.utils.ts +200 -34
- package/src/Shared/Libs/mrzFrameAggregator.ts +112 -2
- package/src/Shared/Libs/native-device-info.utils.ts +116 -0
- package/src/Shared/Libs/promise.utils.ts +11 -5
- package/src/Shared/Libs/sendDiagnosticReport.ts +165 -0
- package/src/Shared/Libs/shuffle.utils.ts +15 -0
- package/src/Shared/Services/AnalyticsService.ts +17 -1
- package/src/Shared/Services/DataUploadService.ts +155 -166
- package/src/Shared/Services/VideoSessionService.ts +15 -3
- package/src/Translation/Resources/en.ts +7 -0
- package/src/Translation/Resources/tr.ts +7 -0
- package/src/Trustchex.tsx +26 -3
- 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
|
-
|
|
22
|
+
debugLog('DataUploadService', 'POST', `${this.apiUrl}/identifications/${identificationId}`);
|
|
22
23
|
await httpClient.post(`${this.apiUrl}/identifications/${identificationId}`, {});
|
|
23
|
-
|
|
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
|
-
|
|
32
|
+
debugLog('DataUploadService', 'No document data to submit');
|
|
32
33
|
return;
|
|
33
34
|
}
|
|
34
35
|
const mrzFields = scannedDocument.mrzFields;
|
|
35
36
|
if (!mrzFields) {
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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:
|
|
91
|
-
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
207
|
+
debugLog('DataUploadService', 'No identification ID, skipping upload');
|
|
221
208
|
return false;
|
|
222
209
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
221
|
+
debugLog('DataUploadService', 'Getting session key...');
|
|
235
222
|
try {
|
|
236
223
|
authToken = await runWithRetry(() => getSessionKey(this.apiUrl, sessionId));
|
|
237
|
-
|
|
224
|
+
debugLog('DataUploadService', '✓ Session key obtained');
|
|
238
225
|
} catch (error) {
|
|
239
226
|
if (existingAuthToken) {
|
|
240
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
262
|
+
logWarn('DataUploadService', 'Upload skipped: identification is not active anymore');
|
|
276
263
|
return false;
|
|
277
264
|
}
|
|
278
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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...',
|
package/lib/module/Trustchex.js
CHANGED
|
@@ -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
|
-
|
|
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(() => {
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LivenessDetectionScreen.d.ts","sourceRoot":"","sources":["../../../../../src/Screens/Dynamic/LivenessDetectionScreen.tsx"],"names":[],"mappings":"
|
|
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":"
|
|
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":"
|
|
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,
|
|
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":"
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.types.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,IAAI,EACL,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAOpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM;;;;;EAmBpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;;;;;sBAW9C,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM;EAIjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC/D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;;;;;EAQhB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,oBAAoB,EAAE,YAAY,EAClC,eAAe,EAAE,OAAO,EACxB,aAAa,EAAE,OAAO,EACtB,mBAAmB,EAAE,OAAO,EAC5B,uBAAuB,EAAE,MAAM,EAAE,EACjC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,
|
|
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;
|
|
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 {
|