datakeen-session-react 1.1.200-dev.3 → 1.1.200-rc.2

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.
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var tslib_es6 = require('../node_modules/tslib/tslib.es6.js');
4
- var cameraResolution = require('../utils/cameraResolution.js');
5
4
  var professionalImageQuality = require('./professionalImageQuality.js');
6
5
 
7
6
  // Permit to enable development mode to test without a camera
@@ -124,18 +123,18 @@ var CameraService = /** @class */ (function () {
124
123
  };
125
124
  CameraService.prototype._doStartCamera = function (videoElement, options) {
126
125
  return tslib_es6.__awaiter(this, void 0, void 0, function () {
127
- var facingMode, preferImageCapture, desiredWidth, desiredHeight, videoConstraints, stream, retriedWithHd, err_2, errorMessage;
128
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
129
- return tslib_es6.__generator(this, function (_t) {
130
- switch (_t.label) {
126
+ var facingMode, preferImageCapture, desiredWidth, desiredHeight, videoConstraints, stream, err_2, errorMessage;
127
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
128
+ return tslib_es6.__generator(this, function (_o) {
129
+ switch (_o.label) {
131
130
  case 0:
132
131
  facingMode = (_b = options.facingMode) !== null && _b !== void 0 ? _b : "environment";
133
132
  preferImageCapture = (_c = options.preferImageCapture) !== null && _c !== void 0 ? _c : true;
134
133
  desiredWidth = (_e = (_d = options.idealResolution) === null || _d === void 0 ? void 0 : _d.width) !== null && _e !== void 0 ? _e : DEFAULT_RESOLUTION.width;
135
134
  desiredHeight = (_g = (_f = options.idealResolution) === null || _f === void 0 ? void 0 : _f.height) !== null && _g !== void 0 ? _g : DEFAULT_RESOLUTION.height;
136
- _t.label = 1;
135
+ _o.label = 1;
137
136
  case 1:
138
- _t.trys.push([1, 10, , 11]);
137
+ _o.trys.push([1, 8, , 9]);
139
138
  // Close any existing stream before opening a new one
140
139
  if (this.stream) {
141
140
  this.stream.getTracks().forEach(function (t) { return t.stop(); });
@@ -158,45 +157,28 @@ var CameraService = /** @class */ (function () {
158
157
  video: videoConstraints,
159
158
  })];
160
159
  case 2:
161
- stream = _t.sent();
160
+ stream = _o.sent();
162
161
  this.stream = stream;
163
162
  this.videoTrack = (_j = stream.getVideoTracks()[0]) !== null && _j !== void 0 ? _j : null;
164
163
  this.lastTrackSettings = (_l = (_k = this.videoTrack) === null || _k === void 0 ? void 0 : _k.getSettings()) !== null && _l !== void 0 ? _l : null;
165
- retriedWithHd = false;
166
- if (!(cameraResolution.isBelowHd((_m = this.lastTrackSettings) !== null && _m !== void 0 ? _m : undefined) && desiredWidth / desiredHeight !== 16 / 9)) return [3 /*break*/, 4];
167
- retriedWithHd = true;
168
- stream.getTracks().forEach(function (track) { return track.stop(); });
169
- this.stream = null;
170
- this.videoTrack = null;
171
- this.lastTrackSettings = null;
172
- return [4 /*yield*/, navigator.mediaDevices.getUserMedia({
173
- video: tslib_es6.__assign(tslib_es6.__assign({}, videoConstraints), { width: { ideal: 1920 }, height: { ideal: 1080 } }),
174
- })];
175
- case 3:
176
- stream = _t.sent();
177
- this.stream = stream;
178
- this.videoTrack = (_o = stream.getVideoTracks()[0]) !== null && _o !== void 0 ? _o : null;
179
- this.lastTrackSettings = (_q = (_p = this.videoTrack) === null || _p === void 0 ? void 0 : _p.getSettings()) !== null && _q !== void 0 ? _q : null;
180
- _t.label = 4;
181
- case 4:
182
164
  console.debug("[CameraService] Camera opened", {
183
165
  desired: { width: desiredWidth, height: desiredHeight },
184
166
  actual: this.lastTrackSettings,
185
167
  });
186
- if (!this.videoTrack) return [3 /*break*/, 8];
187
- _t.label = 5;
188
- case 5:
189
- _t.trys.push([5, 7, , 8]);
168
+ if (!this.videoTrack) return [3 /*break*/, 6];
169
+ _o.label = 3;
170
+ case 3:
171
+ _o.trys.push([3, 5, , 6]);
190
172
  return [4 /*yield*/, this.videoTrack.applyConstraints({
191
173
  advanced: [{ focusMode: "continuous" }],
192
174
  })];
175
+ case 4:
176
+ _o.sent();
177
+ return [3 /*break*/, 6];
178
+ case 5:
179
+ _o.sent();
180
+ return [3 /*break*/, 6];
193
181
  case 6:
194
- _t.sent();
195
- return [3 /*break*/, 8];
196
- case 7:
197
- _t.sent();
198
- return [3 /*break*/, 8];
199
- case 8:
200
182
  if (supportsImageCapture() && this.videoTrack && preferImageCapture) {
201
183
  try {
202
184
  this.imageCapture = new ImageCapture(this.videoTrack);
@@ -214,18 +196,15 @@ var CameraService = /** @class */ (function () {
214
196
  }
215
197
  videoElement.srcObject = stream;
216
198
  return [4 /*yield*/, this.waitForVideoReady(videoElement)];
217
- case 9:
218
- _t.sent();
199
+ case 7:
200
+ _o.sent();
219
201
  return [2 /*return*/, {
220
202
  success: true,
221
- settings: (_r = this.lastTrackSettings) !== null && _r !== void 0 ? _r : undefined,
203
+ settings: (_m = this.lastTrackSettings) !== null && _m !== void 0 ? _m : undefined,
222
204
  captureMethod: this.captureMethod,
223
- requested: { w: desiredWidth, h: desiredHeight },
224
- retriedWithHd: retriedWithHd,
225
- label: (_s = this.videoTrack) === null || _s === void 0 ? void 0 : _s.label,
226
205
  }];
227
- case 10:
228
- err_2 = _t.sent();
206
+ case 8:
207
+ err_2 = _o.sent();
229
208
  console.error("Erreur lors de l'accès à la caméra:", err_2);
230
209
  errorMessage = "Une erreur inconnue s'est produite lors de l'accès à la caméra.";
231
210
  if (err_2 instanceof DOMException) {
@@ -241,7 +220,7 @@ var CameraService = /** @class */ (function () {
241
220
  }
242
221
  }
243
222
  return [2 /*return*/, { success: false, error: errorMessage }];
244
- case 11: return [2 /*return*/];
223
+ case 9: return [2 /*return*/];
245
224
  }
246
225
  });
247
226
  });
@@ -5,21 +5,12 @@ var api = require('./api.js');
5
5
  var auditTrailService = require('./auditTrailService.js');
6
6
  var sessionMemoryStore = require('./sessionMemoryStore.js');
7
7
 
8
- /** Reports camera diagnostics without updating local session state. */
9
- function reportCaptureDiagnostics(sessionId, nodeId, diag) {
10
- return tslib_es6.__awaiter(this, void 0, void 0, function () {
11
- var _a;
12
- return tslib_es6.__generator(this, function (_b) {
13
- switch (_b.label) {
14
- case 0: return [4 /*yield*/, api.apiService.patch("/session/sdk/".concat(sessionId), { captureDiagnostics: (_a = {}, _a[nodeId] = diag, _a) })];
15
- case 1:
16
- _b.sent();
17
- return [2 /*return*/];
18
- }
19
- });
20
- });
21
- }
22
- /** Fetches session data by ID from the Datakeen backend. */
8
+ /**
9
+ * Fetches session data by ID from the Datakeen backend
10
+ *
11
+ * @param sessionId - The unique identifier of the session
12
+ * @returns The session data
13
+ */
23
14
  var fetchSessionById = function (sessionId) { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
24
15
  var response, error_1;
25
16
  return tslib_es6.__generator(this, function (_a) {
@@ -527,7 +518,6 @@ exports.getRunPrefillData = getRunPrefillData;
527
518
  exports.hasOutgoingEdgeForHandle = hasOutgoingEdgeForHandle;
528
519
  exports.isSessionExpired = isSessionExpired;
529
520
  exports.reconstructHistoryToStep = reconstructHistoryToStep;
530
- exports.reportCaptureDiagnostics = reportCaptureDiagnostics;
531
521
  exports.reportSelfieFailure = reportSelfieFailure;
532
522
  exports.resetNfcScan = resetNfcScan;
533
523
  exports.sendClientInfo = sendClientInfo;
@@ -304,7 +304,7 @@ var DocumentCollection = function (_a) {
304
304
  case "before-recto":
305
305
  return jsx(BeforePhoto, { setStep: function () { return setPhotoSubStep("recto"); }, isSingleSided: !requiresTwoSides_1, onBack: handleBack });
306
306
  case "recto":
307
- return jsx(Photo, { sessionId: sessionId, nodeId: node.id, onCapture: function (img) { return handlePhotoCapture(img, "recto"); }, automaticCapture: false, maskType: "document" });
307
+ return jsx(Photo, { onCapture: function (img) { return handlePhotoCapture(img, "recto"); }, automaticCapture: false, maskType: "document" });
308
308
  case "preview-recto":
309
309
  return (jsx(PhotoPreview, { imageUrl: capturedImages.recto, side: "recto", isSingleSided: !requiresTwoSides_1, onValidate: function () { return setPhotoSubStep(requiresTwoSides_1 ? "before-verso" : "confirmation"); }, onRetake: function () {
310
310
  setCapturedImages(function (prev) { var next = __assign({}, prev); delete next.recto; return next; });
@@ -313,7 +313,7 @@ var DocumentCollection = function (_a) {
313
313
  case "before-verso":
314
314
  return jsx(BeforeVersoPhoto, { setStep: function () { return setPhotoSubStep("verso"); } });
315
315
  case "verso":
316
- return jsx(Photo, { sessionId: sessionId, nodeId: node.id, onCapture: function (img) { return handlePhotoCapture(img, "verso"); }, automaticCapture: false, maskType: "document" });
316
+ return jsx(Photo, { onCapture: function (img) { return handlePhotoCapture(img, "verso"); }, automaticCapture: false, maskType: "document" });
317
317
  case "preview-verso":
318
318
  return (jsx(PhotoPreview, { imageUrl: capturedImages.verso, side: "verso", onValidate: function () { return setPhotoSubStep("confirmation"); }, onRetake: function () {
319
319
  setCapturedImages(function (prev) { var next = __assign({}, prev); delete next.verso; return next; });
@@ -7,31 +7,27 @@ import CameraError from './CameraError.js';
7
7
  import CameraMask from './CameraMask.js';
8
8
  import OrientationToggle from './OrientationToggle.js';
9
9
  import { useI18n } from '../../hooks/useI18n.js';
10
- import { isBelowHd } from '../../utils/cameraResolution.js';
11
- import { reportCaptureDiagnostics } from '../../services/sessionService.js';
12
10
  import useIsMobile from '../../hooks/useIsMobile.js';
13
11
 
14
12
  var Photo = function (_a) {
15
- var onCapture = _a.onCapture, sessionId = _a.sessionId, nodeId = _a.nodeId, _b = _a.automaticCapture, automaticCapture = _b === void 0 ? false : _b, _c = _a.maskType, maskType = _c === void 0 ? "id" : _c;
13
+ var onCapture = _a.onCapture, _b = _a.automaticCapture, automaticCapture = _b === void 0 ? false : _b, _c = _a.maskType, maskType = _c === void 0 ? "id" : _c;
16
14
  var isMobile = useIsMobile(768);
17
15
  var videoRef = useRef(null);
18
- var _d = useState(false), lowResolution = _d[0], setLowResolution = _d[1];
19
- var _e = useState(0), cameraAttempt = _e[0], setCameraAttempt = _e[1];
20
- var _f = useState(false), isDetecting = _f[0], setIsDetecting = _f[1];
21
- var _g = useState("environment"), facingMode = _g[0], setFacingMode = _g[1];
22
- var _h = useState(null), cameraError = _h[0], setCameraError = _h[1];
23
- var _j = useState(window.matchMedia("(orientation: portrait)").matches), isPortrait = _j[0], setIsPortrait = _j[1];
24
- var _k = useState(false), isCountingDown = _k[0], setIsCountingDown = _k[1];
25
- var _l = useState(0), countdown = _l[0], setCountdown = _l[1];
26
- var _m = useState(false), documentDetected = _m[0], setDocumentDetected = _m[1];
27
- var _o = useState(undefined), qualityHint = _o[0], setQualityHint = _o[1];
28
- var _p = useState(true), isInitializing = _p[0], setIsInitializing = _p[1];
29
- var _q = useState(false), isProcessing = _q[0], setIsProcessing = _q[1];
30
- var _r = useState(null), captureError = _r[0], setCaptureError = _r[1];
31
- var _s = useState(false), showCaptureFlash = _s[0], setShowCaptureFlash = _s[1];
16
+ var _d = useState(false), isDetecting = _d[0], setIsDetecting = _d[1];
17
+ var _e = useState("environment"), facingMode = _e[0], setFacingMode = _e[1];
18
+ var _f = useState(null), cameraError = _f[0], setCameraError = _f[1];
19
+ var _g = useState(window.matchMedia("(orientation: portrait)").matches), isPortrait = _g[0], setIsPortrait = _g[1];
20
+ var _h = useState(false), isCountingDown = _h[0], setIsCountingDown = _h[1];
21
+ var _j = useState(0), countdown = _j[0], setCountdown = _j[1];
22
+ var _k = useState(false), documentDetected = _k[0], setDocumentDetected = _k[1];
23
+ var _l = useState(undefined), qualityHint = _l[0], setQualityHint = _l[1];
24
+ var _m = useState(true), isInitializing = _m[0], setIsInitializing = _m[1];
25
+ var _o = useState(false), isProcessing = _o[0], setIsProcessing = _o[1];
26
+ var _p = useState(null), captureError = _p[0], setCaptureError = _p[1];
27
+ var _q = useState(false), showCaptureFlash = _q[0], setShowCaptureFlash = _q[1];
32
28
  var t = useI18n().t;
33
- var _t = useState(null); _t[0]; var setLastCaptureMeta = _t[1];
34
- var _u = useState(null), maskRect = _u[0], setMaskRect = _u[1];
29
+ var _r = useState(null); _r[0]; var setLastCaptureMeta = _r[1];
30
+ var _s = useState(null), maskRect = _s[0], setMaskRect = _s[1];
35
31
  var countdownIntervalRef = useRef(null);
36
32
  var detectionHandlerRef = useRef(null);
37
33
  var flashTimeoutRef = useRef(null);
@@ -220,13 +216,11 @@ var Photo = function (_a) {
220
216
  useEffect(function () {
221
217
  var isCancelled = false;
222
218
  var initCamera = function () { return __awaiter(void 0, void 0, void 0, function () {
223
- var result, belowHd;
224
- var _a, _b, _c, _d;
225
- return __generator(this, function (_e) {
226
- switch (_e.label) {
219
+ var result;
220
+ return __generator(this, function (_a) {
221
+ switch (_a.label) {
227
222
  case 0:
228
223
  setCameraError(null);
229
- setLowResolution(false);
230
224
  setIsInitializing(true);
231
225
  return [4 /*yield*/, cameraService.startCamera(videoRef.current, {
232
226
  facingMode: facingMode,
@@ -234,25 +228,11 @@ var Photo = function (_a) {
234
228
  preferImageCapture: true,
235
229
  })];
236
230
  case 1:
237
- result = _e.sent();
231
+ result = _a.sent();
238
232
  if (isCancelled)
239
233
  return [2 /*return*/];
240
234
  setIsInitializing(false);
241
235
  if (result.success) {
242
- belowHd = isBelowHd(result.settings);
243
- setLowResolution(belowHd);
244
- if (sessionId && nodeId) {
245
- void reportCaptureDiagnostics(sessionId, nodeId, {
246
- requested: result.requested,
247
- obtained: { w: (_a = result.settings) === null || _a === void 0 ? void 0 : _a.width, h: (_b = result.settings) === null || _b === void 0 ? void 0 : _b.height, frameRate: (_c = result.settings) === null || _c === void 0 ? void 0 : _c.frameRate },
248
- retriedWithHd: (_d = result.retriedWithHd) !== null && _d !== void 0 ? _d : false,
249
- devicePixelRatio: window.devicePixelRatio,
250
- cameraLabel: result.label,
251
- lowResolutionWarningShown: belowHd,
252
- facingMode: facingMode,
253
- at: new Date().toISOString(),
254
- }).catch(function () { });
255
- }
256
236
  setLastCaptureMeta(null);
257
237
  // Detection also runs in manual mode: it only drives the visual
258
238
  // feedback on the mask (documentDetected), it never starts the
@@ -280,7 +260,7 @@ var Photo = function (_a) {
280
260
  flashTimeoutRef.current = null;
281
261
  }
282
262
  };
283
- }, [facingMode, cameraAttempt, sessionId, nodeId, clearCountdown, stopDetection]);
263
+ }, [facingMode, clearCountdown, stopDetection]);
284
264
  useEffect(function () {
285
265
  if (!isDetecting || !videoRef.current) {
286
266
  return;
@@ -323,7 +303,21 @@ var Photo = function (_a) {
323
303
  setIsInitializing(true);
324
304
  stopDetection();
325
305
  cameraService.stopCamera();
326
- setCameraAttempt(function (attempt) { return attempt + 1; });
306
+ cameraService
307
+ .startCamera(videoRef.current, {
308
+ facingMode: facingMode,
309
+ idealResolution: { width: 4096, height: 3072 },
310
+ preferImageCapture: true,
311
+ })
312
+ .then(function (result) {
313
+ setIsInitializing(false);
314
+ if (result.success) {
315
+ setIsDetecting(true);
316
+ }
317
+ else if (result.error) {
318
+ setCameraError(result.error);
319
+ }
320
+ });
327
321
  };
328
322
  var handleManualCapture = function () {
329
323
  if (isProcessing) {
@@ -347,7 +341,7 @@ var Photo = function (_a) {
347
341
  zIndex: isMobile ? 50 : "auto",
348
342
  height: "100%",
349
343
  width: "100%",
350
- }, children: [jsx("div", { className: "flex-1 relative overflow-hidden bg-black", children: cameraError ? (jsx("div", { className: "flex items-center justify-center h-full px-4 py-6", children: jsx(CameraError, { errorMessage: cameraError, onRetry: handleRetry }) })) : (jsxs(Fragment, { children: [isInitializing && (jsxs("div", { "data-testid": "camera-initializing", className: "absolute inset-0 z-30 flex flex-col items-center justify-center gap-3 bg-black", children: [jsx("div", { className: "w-10 h-10 border-4 border-white border-t-transparent rounded-full animate-spin" }), jsx("span", { className: "text-white text-sm", children: t("id_check.photo.initializing", "Ouverture de la caméra…") })] })), isProcessing && (jsxs("div", { "data-testid": "camera-processing", className: "absolute inset-0 z-30 flex flex-col items-center justify-center gap-3 bg-black bg-opacity-70", children: [jsx("div", { className: "w-10 h-10 border-4 border-white border-t-transparent rounded-full animate-spin" }), jsx("span", { className: "text-white text-sm", children: t("id_check.photo.processing", "Traitement de l'image…") })] })), jsx("video", { ref: videoRef, autoPlay: true, playsInline: true, muted: true, className: "absolute inset-0 w-full h-full object-cover z-0 bg-black ".concat(facingMode === "user" ? "scale-x-[-1]" : "") }), jsx("div", { className: "absolute top-4 left-1/2 transform -translate-x-1/2 z-50", children: jsx("span", { className: "text-white z-50 text-sm font-semibold drop-shadow-lg", children: automaticCapture ? (jsx("span", { className: "animate-pulse", children: t("id_check.photo.mode_autocapture", "Autocapture activée") })) : (jsx("span", { className: "bg-orange-500 px-2 py-1 rounded hidden", children: t("id_check.photo.mode_manual", "Mode manuel") })) }) }), jsx(CameraMask, { isDetecting: isDetecting, isPortrait: isPortrait, facingMode: facingMode, isCountingDown: isCountingDown, countdown: countdown, maskType: maskType, documentDetected: documentDetected, qualityHint: qualityHint, onMaskRectChange: setMaskRect }), jsx("div", { className: "absolute bottom-20 left-0 right-0 z-20 pointer-events-none", children: jsx("div", { className: "text-center px-4", children: jsx("div", { className: "bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block", children: t("id_check.photo.position_document", "Posez le document à plat ou tenez-le dans le cadre") }) }) }), jsx(OrientationToggle, { onCameraToggle: toggleCamera }), lowResolution && !cameraError && (jsx("div", { role: "status", className: "absolute inset-x-3 z-30 ".concat(automaticCapture ? "top-12" : "top-3"), children: jsx("div", { className: "rounded-xl bg-black/75 text-white shadow-lg backdrop-blur-sm", children: jsxs("details", { className: "group", children: [jsxs("summary", { className: "flex min-h-11 cursor-pointer list-none items-center gap-2 rounded-xl px-3 py-2 text-sm font-medium focus-visible:outline focus-visible:outline-2 focus-visible:outline-white [&::-webkit-details-marker]:hidden", children: [jsx("svg", { "aria-hidden": "true", className: "h-5 w-5 shrink-0 text-amber-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 9v4m0 4h.01M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z" }) }), jsx("span", { className: "min-w-0 flex-1", children: t("id_check.camera.low_resolution.title") }), jsx("svg", { "aria-hidden": "true", className: "h-4 w-4 shrink-0 transition-transform group-open:rotate-180 motion-reduce:transition-none", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "m6 9 6 6 6-6" }) })] }), jsxs("div", { className: "space-y-2 px-3 pb-3 text-sm leading-relaxed text-white/85", children: [jsx("p", { children: t("id_check.camera.low_resolution.body") }), jsx("p", { children: t("id_check.camera.low_resolution.tips") }), jsx("button", { type: "button", onClick: handleRetry, disabled: isProcessing, className: "min-h-11 w-full rounded-lg bg-white px-4 font-medium text-gray-900 hover:bg-white/90 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-white disabled:opacity-50", children: t("id_check.camera.low_resolution.retry") })] })] }) }) })), showCaptureFlash && (jsx("div", { "data-testid": "capture-flash", className: "absolute inset-0 z-40 bg-white pointer-events-none animate-pulse" }))] })) }), jsx("div", { className: "relative z-20 bg-black bg-opacity-80 p-4", children: jsxs("div", { className: "flex flex-col items-center space-y-4", children: [jsx("button", { onClick: handleManualCapture, className: "w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all duration-150 bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer ".concat(showCaptureFlash ? "scale-90 ring-4 ring-[#11E5C5]" : ""), children: jsx("div", { className: "w-8 h-8 bg-white rounded-full" }) }), jsxs("div", { className: "text-white text-center text-sm", children: [jsxs("div", { className: "flex items-center justify-center space-x-2", children: [jsx("div", { className: "w-2 h-2 rounded-full ".concat(automaticCapture
344
+ }, children: [jsx("div", { className: "flex-1 relative overflow-hidden bg-black", children: cameraError ? (jsx("div", { className: "flex items-center justify-center h-full px-4 py-6", children: jsx(CameraError, { errorMessage: cameraError, onRetry: handleRetry }) })) : (jsxs(Fragment, { children: [isInitializing && (jsxs("div", { "data-testid": "camera-initializing", className: "absolute inset-0 z-30 flex flex-col items-center justify-center gap-3 bg-black", children: [jsx("div", { className: "w-10 h-10 border-4 border-white border-t-transparent rounded-full animate-spin" }), jsx("span", { className: "text-white text-sm", children: t("id_check.photo.initializing", "Ouverture de la caméra…") })] })), isProcessing && (jsxs("div", { "data-testid": "camera-processing", className: "absolute inset-0 z-30 flex flex-col items-center justify-center gap-3 bg-black bg-opacity-70", children: [jsx("div", { className: "w-10 h-10 border-4 border-white border-t-transparent rounded-full animate-spin" }), jsx("span", { className: "text-white text-sm", children: t("id_check.photo.processing", "Traitement de l'image…") })] })), jsx("video", { ref: videoRef, autoPlay: true, playsInline: true, muted: true, className: "absolute inset-0 w-full h-full object-cover z-0 bg-black ".concat(facingMode === "user" ? "scale-x-[-1]" : "") }), jsx("div", { className: "absolute top-4 left-1/2 transform -translate-x-1/2 z-50", children: jsx("span", { className: "text-white z-50 text-sm font-semibold drop-shadow-lg", children: automaticCapture ? (jsx("span", { className: "animate-pulse", children: t("id_check.photo.mode_autocapture", "Autocapture activée") })) : (jsx("span", { className: "bg-orange-500 px-2 py-1 rounded hidden", children: t("id_check.photo.mode_manual", "Mode manuel") })) }) }), jsx(CameraMask, { isDetecting: isDetecting, isPortrait: isPortrait, facingMode: facingMode, isCountingDown: isCountingDown, countdown: countdown, maskType: maskType, documentDetected: documentDetected, qualityHint: qualityHint, onMaskRectChange: setMaskRect }), jsx("div", { className: "absolute bottom-20 left-0 right-0 z-20 pointer-events-none", children: jsx("div", { className: "text-center px-4", children: jsx("div", { className: "bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block", children: t("id_check.photo.position_document", "Posez le document à plat ou tenez-le dans le cadre") }) }) }), jsx(OrientationToggle, { onCameraToggle: toggleCamera }), showCaptureFlash && (jsx("div", { "data-testid": "capture-flash", className: "absolute inset-0 z-40 bg-white pointer-events-none animate-pulse" }))] })) }), jsx("div", { className: "relative z-20 bg-black bg-opacity-80 p-4", children: jsxs("div", { className: "flex flex-col items-center space-y-4", children: [jsx("button", { onClick: handleManualCapture, className: "w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all duration-150 bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer ".concat(showCaptureFlash ? "scale-90 ring-4 ring-[#11E5C5]" : ""), children: jsx("div", { className: "w-8 h-8 bg-white rounded-full" }) }), jsxs("div", { className: "text-white text-center text-sm", children: [jsxs("div", { className: "flex items-center justify-center space-x-2", children: [jsx("div", { className: "w-2 h-2 rounded-full ".concat(automaticCapture
351
345
  ? "bg-[#11E5C5] animate-pulse"
352
346
  : "bg-orange-500") }), jsx("span", { children: statusMessage })] }), captureError && (jsx("p", { className: "text-red-400 text-xs mt-2 text-center", children: captureError }))] })] }) })] }));
353
347
  };
@@ -760,13 +760,13 @@ var DocumentCheck = function (_a) {
760
760
  return (jsx(BeforePhoto, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
761
761
  }
762
762
  if (currentPhotoStep === "recto") {
763
- return (jsx(Photo, { sessionId: sessionId, nodeId: node.id, onCapture: function (imageData) { return handlePhotoCapture(imageData, "recto"); } }));
763
+ return (jsx(Photo, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "recto"); } }));
764
764
  }
765
765
  if (currentPhotoStep === "before-verso") {
766
766
  return (jsx(BeforeVersoPhoto, { setStep: function () { return setCurrentPhotoStep("verso"); } }));
767
767
  }
768
768
  if (currentPhotoStep === "verso") {
769
- return (jsx(Photo, { sessionId: sessionId, nodeId: node.id, onCapture: function (imageData) { return handlePhotoCapture(imageData, "verso"); } }));
769
+ return (jsx(Photo, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "verso"); } }));
770
770
  }
771
771
  if (currentPhotoStep === "confirmation") {
772
772
  return (jsx(PhotoConfirmation, { imageUrl: capturedImages.recto || "", versoImageUrl: capturedImages.verso, requiresTwoSides: !!capturedImages.verso, onConfirm: onConfirm, onRetry: function () { return setCurrentPhotoStep("before-recto"); }, onRetryAfterProcessing: function () { return setCurrentPhotoStep("before-recto"); }, fileUploaded: fileUploaded, isSingleSided: isSingleSided }));
@@ -780,21 +780,11 @@ var id_check = {
780
780
  alt_verso: "Before taking the verso photo"
781
781
  },
782
782
  camera: {
783
- low_resolution: {
784
- title: "Limited camera resolution",
785
- body: "Your camera resolution is below HD. The photo may be blurry, but you can continue.",
786
- tips: "Close other apps using the camera, choose another camera or switch to mobile, and improve the lighting.",
787
- retry: "Try again"
788
- },
789
783
  error_title: "Camera error",
790
784
  retry: "Retry",
791
785
  document_detected: "Document detected"
792
786
  },
793
787
  photo: {
794
- hint: {
795
- too_dark: "Too dark, find more light",
796
- too_bright: "Too much glare, avoid direct light"
797
- },
798
788
  capture_failed: "Capture failed. Please try again.",
799
789
  mode_autocapture: "Autocapture enabled",
800
790
  mode_manual: "Manual mode",
@@ -780,21 +780,11 @@ var id_check = {
780
780
  alt_verso: "Antes de tomar la foto del reverso"
781
781
  },
782
782
  camera: {
783
- low_resolution: {
784
- title: "Resolución de cámara limitada",
785
- body: "La resolución de la cámara es inferior a HD. La foto puede salir borrosa, pero puede continuar.",
786
- tips: "Cierre otras aplicaciones que usen la cámara, elija otra cámara o pase al móvil y mejore la iluminación.",
787
- retry: "Reintentar"
788
- },
789
783
  error_title: "Error de cámara",
790
784
  retry: "Reintentar",
791
785
  document_detected: "Documento detectado"
792
786
  },
793
787
  photo: {
794
- hint: {
795
- too_dark: "Demasiado oscuro, busque más luz",
796
- too_bright: "Demasiados reflejos, evite la luz directa"
797
- },
798
788
  capture_failed: "La captura ha fallado. Inténtalo de nuevo.",
799
789
  mode_autocapture: "Captura automática activada",
800
790
  mode_manual: "Modo manual",
@@ -780,21 +780,11 @@ var id_check = {
780
780
  alt_verso: "Avant de prendre la photo du verso"
781
781
  },
782
782
  camera: {
783
- low_resolution: {
784
- title: "Résolution de la caméra limitée",
785
- body: "La résolution de votre caméra est inférieure à la HD. La photo risque d’être floue, mais vous pouvez continuer.",
786
- tips: "Fermez les autres applications utilisant la caméra, choisissez une autre caméra ou passez sur mobile, et améliorez l’éclairage.",
787
- retry: "Réessayer"
788
- },
789
783
  error_title: "Erreur de caméra",
790
784
  retry: "Réessayer",
791
785
  document_detected: "Document détecté"
792
786
  },
793
787
  photo: {
794
- hint: {
795
- too_dark: "Trop sombre, cherchez plus de lumière",
796
- too_bright: "Trop de reflets, évitez la lumière directe"
797
- },
798
788
  capture_failed: "La capture a échoué. Veuillez réessayer.",
799
789
  mode_autocapture: "Autocapture activée",
800
790
  mode_manual: "Mode manuel",