datakeen-session-react 1.1.140-dev.129 → 1.1.140-dev.130

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 (37) hide show
  1. package/dist/cjs/components/document-video/DocumentVideoCapture.js +2 -2
  2. package/dist/cjs/components/document-video/DocumentVideoCapture.js.map +1 -1
  3. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js +10 -11
  4. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  5. package/dist/cjs/components/jdi/JDIProcessing.js +136 -147
  6. package/dist/cjs/components/jdi/JDIProcessing.js.map +1 -1
  7. package/dist/cjs/components/session/DocumentCheck.js +36 -11
  8. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  9. package/dist/cjs/components/session/EndFlow.js +10 -1
  10. package/dist/cjs/components/session/EndFlow.js.map +1 -1
  11. package/dist/cjs/components/session/controleJdiPolicy.js +47 -0
  12. package/dist/cjs/components/session/controleJdiPolicy.js.map +1 -0
  13. package/dist/cjs/index.css.js +1 -1
  14. package/dist/cjs/services/sessionService.js +15 -0
  15. package/dist/cjs/services/sessionService.js.map +1 -1
  16. package/dist/cjs/types/session.js.map +1 -1
  17. package/dist/cjs/utils/jdiCodes.js +57 -0
  18. package/dist/cjs/utils/jdiCodes.js.map +1 -0
  19. package/dist/esm/components/document-video/DocumentVideoCapture.js +2 -2
  20. package/dist/esm/components/document-video/DocumentVideoCapture.js.map +1 -1
  21. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js +10 -11
  22. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  23. package/dist/esm/components/jdi/JDIProcessing.js +136 -147
  24. package/dist/esm/components/jdi/JDIProcessing.js.map +1 -1
  25. package/dist/esm/components/session/DocumentCheck.js +37 -12
  26. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  27. package/dist/esm/components/session/EndFlow.js +10 -1
  28. package/dist/esm/components/session/EndFlow.js.map +1 -1
  29. package/dist/esm/components/session/controleJdiPolicy.js +42 -0
  30. package/dist/esm/components/session/controleJdiPolicy.js.map +1 -0
  31. package/dist/esm/index.css.js +1 -1
  32. package/dist/esm/services/sessionService.js +15 -1
  33. package/dist/esm/services/sessionService.js.map +1 -1
  34. package/dist/esm/types/session.js.map +1 -1
  35. package/dist/esm/utils/jdiCodes.js +53 -0
  36. package/dist/esm/utils/jdiCodes.js.map +1 -0
  37. package/package.json +1 -1
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Codes JDI (Justificatif D'Identité) considérés comme "bloquants" pour le
5
+ * nœud controle-jdi, c'est-à-dire déclenchant la boucle de resoumission
6
+ * (écran d'erreur + éventuel réessai) plutôt qu'un passage silencieux.
7
+ *
8
+ * Historiquement cette liste était hardcodée en dur (inversée) dans
9
+ * JDIProcessing.tsx / DocumentVideoProcessing.tsx / DocumentProcessing.tsx :
10
+ * `isSuccess = ["1.", "4.", "5.", "6.", "9."].some(prefix => code.startsWith(prefix))`.
11
+ * Elle est désormais configurable par nœud via `node.blockingCodes`, avec
12
+ * cette liste comme valeur par défaut pour préserver le comportement legacy.
13
+ *
14
+ * Miroir exact du catalogue frontend (app-frontend/src/utils/jdiCodes.ts) —
15
+ * les deux listes doivent rester synchronisées.
16
+ */
17
+ var DEFAULT_BLOCKING_CODES = [
18
+ '2.0',
19
+ '2.1',
20
+ '2.2',
21
+ '2.4',
22
+ '2.5',
23
+ '2.6',
24
+ '3.0',
25
+ '7.0',
26
+ '7.1',
27
+ ];
28
+ /**
29
+ * Codes toujours bloquants, quelle que soit la configuration du nœud.
30
+ * 8.0 (document trouvé dans la base de spécimens frauduleux) ne doit jamais
31
+ * pouvoir être désactivé — cf. DocumentCheck.tsx `isRetryAllowed` historique
32
+ * (`errorCode?.startsWith("8")` bloque déjà totalement le retry).
33
+ */
34
+ var ALWAYS_BLOCKING_CODES = ['8.0'];
35
+ /**
36
+ * Détermine si un code JDI doit être traité comme bloquant pour un nœud
37
+ * controle-jdi donné.
38
+ *
39
+ * - `configured` absent (nœud legacy, jamais reconfiguré) → applique
40
+ * DEFAULT_BLOCKING_CODES (comportement inchangé).
41
+ * - `configured` présent (même vide) → correspondance exacte uniquement
42
+ * (pas de préfixe : "4.0" dans la liste ne bloque pas "4.1"/"4.2").
43
+ * - Les codes de ALWAYS_BLOCKING_CODES bloquent toujours, indépendamment
44
+ * de `configured`.
45
+ */
46
+ function isBlockingCode(code, configured) {
47
+ if (ALWAYS_BLOCKING_CODES.includes(code)) {
48
+ return true;
49
+ }
50
+ var list = configured !== null && configured !== void 0 ? configured : DEFAULT_BLOCKING_CODES;
51
+ return list.includes(code);
52
+ }
53
+
54
+ exports.ALWAYS_BLOCKING_CODES = ALWAYS_BLOCKING_CODES;
55
+ exports.DEFAULT_BLOCKING_CODES = DEFAULT_BLOCKING_CODES;
56
+ exports.isBlockingCode = isBlockingCode;
57
+ //# sourceMappingURL=jdiCodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jdiCodes.js","sources":["../../../../src/utils/jdiCodes.ts"],"sourcesContent":["/**\n * Codes JDI (Justificatif D'Identité) considérés comme \"bloquants\" pour le\n * nœud controle-jdi, c'est-à-dire déclenchant la boucle de resoumission\n * (écran d'erreur + éventuel réessai) plutôt qu'un passage silencieux.\n *\n * Historiquement cette liste était hardcodée en dur (inversée) dans\n * JDIProcessing.tsx / DocumentVideoProcessing.tsx / DocumentProcessing.tsx :\n * `isSuccess = [\"1.\", \"4.\", \"5.\", \"6.\", \"9.\"].some(prefix => code.startsWith(prefix))`.\n * Elle est désormais configurable par nœud via `node.blockingCodes`, avec\n * cette liste comme valeur par défaut pour préserver le comportement legacy.\n *\n * Miroir exact du catalogue frontend (app-frontend/src/utils/jdiCodes.ts) —\n * les deux listes doivent rester synchronisées.\n */\nexport const DEFAULT_BLOCKING_CODES: string[] = [\n '2.0',\n '2.1',\n '2.2',\n '2.4',\n '2.5',\n '2.6',\n '3.0',\n '7.0',\n '7.1',\n];\n\n/**\n * Codes toujours bloquants, quelle que soit la configuration du nœud.\n * 8.0 (document trouvé dans la base de spécimens frauduleux) ne doit jamais\n * pouvoir être désactivé — cf. DocumentCheck.tsx `isRetryAllowed` historique\n * (`errorCode?.startsWith(\"8\")` bloque déjà totalement le retry).\n */\nexport const ALWAYS_BLOCKING_CODES: string[] = ['8.0'];\n\n/**\n * Détermine si un code JDI doit être traité comme bloquant pour un nœud\n * controle-jdi donné.\n *\n * - `configured` absent (nœud legacy, jamais reconfiguré) → applique\n * DEFAULT_BLOCKING_CODES (comportement inchangé).\n * - `configured` présent (même vide) → correspondance exacte uniquement\n * (pas de préfixe : \"4.0\" dans la liste ne bloque pas \"4.1\"/\"4.2\").\n * - Les codes de ALWAYS_BLOCKING_CODES bloquent toujours, indépendamment\n * de `configured`.\n */\nexport function isBlockingCode(code: string, configured?: string[]): boolean {\n if (ALWAYS_BLOCKING_CODES.includes(code)) {\n return true;\n }\n const list = configured ?? DEFAULT_BLOCKING_CODES;\n return list.includes(code);\n}\n"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;AAaG;AACI,IAAM,sBAAsB,GAAa;IAC9C,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;;AAGP;;;;;AAKG;AACI,IAAM,qBAAqB,GAAa,CAAC,KAAK;AAErD;;;;;;;;;;AAUG;AACG,SAAU,cAAc,CAAC,IAAY,EAAE,UAAqB,EAAA;AAChE,IAAA,IAAI,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxC,QAAA,OAAO,IAAI;IACb;IACA,IAAM,IAAI,GAAG,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAV,UAAU,GAAI,sBAAsB;AACjD,IAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5B;;;;;;"}
@@ -10,7 +10,7 @@ import DocumentVideoProcessing from './document-video-flow/DocumentVideoProcessi
10
10
  * Gère les étapes internes de capture, confirmation et traitement de la vidéo.
11
11
  */
12
12
  var DocumentVideoCapture = function (_a) {
13
- var selectedDocumentType = _a.selectedDocumentType, onComplete = _a.onComplete, onBack = _a.onBack, nodeId = _a.nodeId, sessionId = _a.sessionId, previewOverrides = _a.previewOverrides;
13
+ var selectedDocumentType = _a.selectedDocumentType, onComplete = _a.onComplete, onBack = _a.onBack, nodeId = _a.nodeId, sessionId = _a.sessionId, previewOverrides = _a.previewOverrides, blockingCodes = _a.blockingCodes;
14
14
  var _b = useState(0), internalStep = _b[0], setInternalStep = _b[1];
15
15
  var _c = useState({}), videoData = _c[0], setVideoData = _c[1];
16
16
  var _d = useState({}), thumbnail = _d[0], setThumbnail = _d[1];
@@ -71,7 +71,7 @@ var DocumentVideoCapture = function (_a) {
71
71
  (thumbnail[currentSide] || (previewOverrides === null || previewOverrides === void 0 ? void 0 : previewOverrides[currentSide])) && (jsx(DocumentVideoConfirmation, { videoData: videoData[currentSide], thumbnail: ((previewOverrides === null || previewOverrides === void 0 ? void 0 : previewOverrides[currentSide]) ||
72
72
  thumbnail[currentSide]), documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.label) || "document", side: currentSide, onConfirm: handleConfirmVideo, onRetake: handleRetakeVideo })), internalStep === 2 &&
73
73
  videoData.recto &&
74
- (thumbnail.recto || (previewOverrides === null || previewOverrides === void 0 ? void 0 : previewOverrides.recto)) && (jsx(DocumentVideoProcessing, { onProcessingComplete: videoProcessed, videoData: videoData, thumbnail: previewOverrides !== null && previewOverrides !== void 0 ? previewOverrides : thumbnail, onRetake: onRetake, sessionId: sessionId, nodeId: nodeId, documentTemplateId: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.documentTemplateId) || "", documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || "document", requiresTwoSides: requiresTwoSides }))] }));
74
+ (thumbnail.recto || (previewOverrides === null || previewOverrides === void 0 ? void 0 : previewOverrides.recto)) && (jsx(DocumentVideoProcessing, { onProcessingComplete: videoProcessed, videoData: videoData, thumbnail: previewOverrides !== null && previewOverrides !== void 0 ? previewOverrides : thumbnail, onRetake: onRetake, sessionId: sessionId, nodeId: nodeId, documentTemplateId: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.documentTemplateId) || "", documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || "document", requiresTwoSides: requiresTwoSides, blockingCodes: blockingCodes }))] }));
75
75
  };
76
76
 
77
77
  export { DocumentVideoCapture as default };
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentVideoCapture.js","sources":["../../../../../src/components/document-video/DocumentVideoCapture.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport DocumentVideoFlow from \"./document-video-flow/DocumentVideoFlow\";\nimport DocumentVideoConfirmation from \"./DocumentVideoConfirmation\";\nimport DocumentVideoProcessing from \"./document-video-flow/DocumentVideoProcessing\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n DocumentVideoSide,\n DocumentVideoCaptureData,\n} from \"../../types/documentVideo\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\n\ninterface DocumentVideoCaptureProps {\n selectedDocumentType: {\n id: string;\n label: string;\n hasTwoSides?: boolean;\n documentTemplateId?: string;\n } | null;\n onComplete: (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => void;\n onBack: () => void;\n nodeId: string;\n sessionId: string;\n previewOverrides?: DocumentVideoPreviewBySide;\n}\n\n/**\n * Composant de gestion du flux de capture vidéo de documents.\n * Gère les étapes internes de capture, confirmation et traitement de la vidéo.\n */\nconst DocumentVideoCapture = ({\n selectedDocumentType,\n onComplete,\n onBack,\n nodeId,\n sessionId,\n previewOverrides,\n}: DocumentVideoCaptureProps) => {\n const [internalStep, setInternalStep] = useState(0);\n const [videoData, setVideoData] = useState<DocumentVideoCaptureBySide>({});\n const [thumbnail, setThumbnail] = useState<DocumentVideoPreviewBySide>({});\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [currentSide, setCurrentSide] = useState<DocumentVideoSide>(\"recto\");\n\n const requiresTwoSides = !!selectedDocumentType?.hasTwoSides;\n\n const handleConfirmVideo = () => {\n // Ajouter une transition visuelle avant de passer à l'étape suivante\n setIsTransitioning(true);\n\n // Attendre un peu pour l'animation avant de passer à l'étape suivante\n setTimeout(() => {\n if (requiresTwoSides && currentSide === \"recto\") {\n setCurrentSide(\"verso\");\n setInternalStep(0);\n } else {\n setInternalStep(2); // Passer à l'étape de traitement de la vidéo\n }\n setIsTransitioning(false);\n }, 500);\n };\n\n const videoProcessed = (\n processed: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n // Callback pour indiquer que la vidéo a été traitée\n onComplete(processed, predictions, errorCode);\n };\n\n const onRetake = () => {\n setCurrentSide(\"recto\");\n setVideoData({});\n setThumbnail({});\n setInternalStep(0);\n };\n\n const handleRetakeVideo = () => {\n setVideoData((prev) => ({ ...prev, [currentSide]: undefined }));\n setThumbnail((prev) => ({ ...prev, [currentSide]: undefined }));\n setInternalStep(0);\n };\n\n return (\n <div\n className={`h-full w-full transition-opacity duration-500 ${\n isTransitioning ? \"opacity-50\" : \"opacity-100\"\n }`}\n >\n {internalStep === 0 && (\n <DocumentVideoFlow\n setVideoData={(\n side: DocumentVideoSide,\n data: DocumentVideoCaptureData,\n ) => setVideoData((prev) => ({ ...prev, [side]: data }))}\n setThumbnail={(side: DocumentVideoSide, data: string) =>\n setThumbnail((prev) => ({ ...prev, [side]: data }))\n }\n setStep={setInternalStep}\n onBack={\n currentSide === \"verso\"\n ? () => {\n setCurrentSide(\"recto\");\n setInternalStep(1);\n }\n : onBack\n }\n documentType={selectedDocumentType?.label || \"document\"}\n side={currentSide}\n />\n )}\n {internalStep === 1 &&\n videoData[currentSide] &&\n (thumbnail[currentSide] || previewOverrides?.[currentSide]) && (\n <DocumentVideoConfirmation\n videoData={videoData[currentSide] as DocumentVideoCaptureData}\n thumbnail={\n (previewOverrides?.[currentSide] ||\n thumbnail[currentSide]) as string\n }\n documentType={selectedDocumentType?.label || \"document\"}\n side={currentSide}\n onConfirm={handleConfirmVideo}\n onRetake={handleRetakeVideo}\n />\n )}\n {internalStep === 2 &&\n videoData.recto &&\n (thumbnail.recto || previewOverrides?.recto) && (\n <DocumentVideoProcessing\n onProcessingComplete={videoProcessed}\n videoData={videoData}\n thumbnail={previewOverrides ?? thumbnail}\n onRetake={onRetake}\n sessionId={sessionId}\n nodeId={nodeId}\n documentTemplateId={selectedDocumentType?.documentTemplateId || \"\"}\n documentType={selectedDocumentType?.id || \"document\"}\n requiresTwoSides={requiresTwoSides}\n />\n )}\n </div>\n );\n};\n\nexport default DocumentVideoCapture;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentVideoCapture.js","sources":["../../../../../src/components/document-video/DocumentVideoCapture.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport DocumentVideoFlow from \"./document-video-flow/DocumentVideoFlow\";\nimport DocumentVideoConfirmation from \"./DocumentVideoConfirmation\";\nimport DocumentVideoProcessing from \"./document-video-flow/DocumentVideoProcessing\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n DocumentVideoSide,\n DocumentVideoCaptureData,\n} from \"../../types/documentVideo\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\n\ninterface DocumentVideoCaptureProps {\n selectedDocumentType: {\n id: string;\n label: string;\n hasTwoSides?: boolean;\n documentTemplateId?: string;\n } | null;\n onComplete: (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => void;\n onBack: () => void;\n nodeId: string;\n sessionId: string;\n previewOverrides?: DocumentVideoPreviewBySide;\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\n/**\n * Composant de gestion du flux de capture vidéo de documents.\n * Gère les étapes internes de capture, confirmation et traitement de la vidéo.\n */\nconst DocumentVideoCapture = ({\n selectedDocumentType,\n onComplete,\n onBack,\n nodeId,\n sessionId,\n previewOverrides,\n blockingCodes,\n}: DocumentVideoCaptureProps) => {\n const [internalStep, setInternalStep] = useState(0);\n const [videoData, setVideoData] = useState<DocumentVideoCaptureBySide>({});\n const [thumbnail, setThumbnail] = useState<DocumentVideoPreviewBySide>({});\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [currentSide, setCurrentSide] = useState<DocumentVideoSide>(\"recto\");\n\n const requiresTwoSides = !!selectedDocumentType?.hasTwoSides;\n\n const handleConfirmVideo = () => {\n // Ajouter une transition visuelle avant de passer à l'étape suivante\n setIsTransitioning(true);\n\n // Attendre un peu pour l'animation avant de passer à l'étape suivante\n setTimeout(() => {\n if (requiresTwoSides && currentSide === \"recto\") {\n setCurrentSide(\"verso\");\n setInternalStep(0);\n } else {\n setInternalStep(2); // Passer à l'étape de traitement de la vidéo\n }\n setIsTransitioning(false);\n }, 500);\n };\n\n const videoProcessed = (\n processed: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n // Callback pour indiquer que la vidéo a été traitée\n onComplete(processed, predictions, errorCode);\n };\n\n const onRetake = () => {\n setCurrentSide(\"recto\");\n setVideoData({});\n setThumbnail({});\n setInternalStep(0);\n };\n\n const handleRetakeVideo = () => {\n setVideoData((prev) => ({ ...prev, [currentSide]: undefined }));\n setThumbnail((prev) => ({ ...prev, [currentSide]: undefined }));\n setInternalStep(0);\n };\n\n return (\n <div\n className={`h-full w-full transition-opacity duration-500 ${\n isTransitioning ? \"opacity-50\" : \"opacity-100\"\n }`}\n >\n {internalStep === 0 && (\n <DocumentVideoFlow\n setVideoData={(\n side: DocumentVideoSide,\n data: DocumentVideoCaptureData,\n ) => setVideoData((prev) => ({ ...prev, [side]: data }))}\n setThumbnail={(side: DocumentVideoSide, data: string) =>\n setThumbnail((prev) => ({ ...prev, [side]: data }))\n }\n setStep={setInternalStep}\n onBack={\n currentSide === \"verso\"\n ? () => {\n setCurrentSide(\"recto\");\n setInternalStep(1);\n }\n : onBack\n }\n documentType={selectedDocumentType?.label || \"document\"}\n side={currentSide}\n />\n )}\n {internalStep === 1 &&\n videoData[currentSide] &&\n (thumbnail[currentSide] || previewOverrides?.[currentSide]) && (\n <DocumentVideoConfirmation\n videoData={videoData[currentSide] as DocumentVideoCaptureData}\n thumbnail={\n (previewOverrides?.[currentSide] ||\n thumbnail[currentSide]) as string\n }\n documentType={selectedDocumentType?.label || \"document\"}\n side={currentSide}\n onConfirm={handleConfirmVideo}\n onRetake={handleRetakeVideo}\n />\n )}\n {internalStep === 2 &&\n videoData.recto &&\n (thumbnail.recto || previewOverrides?.recto) && (\n <DocumentVideoProcessing\n onProcessingComplete={videoProcessed}\n videoData={videoData}\n thumbnail={previewOverrides ?? thumbnail}\n onRetake={onRetake}\n sessionId={sessionId}\n nodeId={nodeId}\n documentTemplateId={selectedDocumentType?.documentTemplateId || \"\"}\n documentType={selectedDocumentType?.id || \"document\"}\n requiresTwoSides={requiresTwoSides}\n blockingCodes={blockingCodes}\n />\n )}\n </div>\n );\n};\n\nexport default DocumentVideoCapture;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -5,6 +5,7 @@ import Title from '../../ui/Title.js';
5
5
  import Subtitle from '../../ui/Subtitle.js';
6
6
  import { useI18n } from '../../../hooks/useI18n.js';
7
7
  import { analyzeDocumentVideo } from '../../../services/analysis.js';
8
+ import { isBlockingCode } from '../../../utils/jdiCodes.js';
8
9
 
9
10
  var processingSteps = [
10
11
  {
@@ -21,7 +22,7 @@ var processingSteps = [
21
22
  },
22
23
  ];
23
24
  var DocumentVideoProcessing = function (_a) {
24
- var onProcessingComplete = _a.onProcessingComplete, videoData = _a.videoData, thumbnail = _a.thumbnail, onRetake = _a.onRetake, sessionId = _a.sessionId, nodeId = _a.nodeId, documentTemplateId = _a.documentTemplateId, documentType = _a.documentType, requiresTwoSides = _a.requiresTwoSides;
25
+ var onProcessingComplete = _a.onProcessingComplete, videoData = _a.videoData, thumbnail = _a.thumbnail, onRetake = _a.onRetake, sessionId = _a.sessionId, nodeId = _a.nodeId, documentTemplateId = _a.documentTemplateId, documentType = _a.documentType, requiresTwoSides = _a.requiresTwoSides, blockingCodes = _a.blockingCodes;
25
26
  var t = useI18n().t;
26
27
  var _b = useState(0), currentStep = _b[0], setCurrentStep = _b[1];
27
28
  var _c = useState(false), hasError = _c[0], setHasError = _c[1];
@@ -46,7 +47,7 @@ var DocumentVideoProcessing = function (_a) {
46
47
  }
47
48
  }, 90000);
48
49
  var processFiles = function () { return __awaiter(void 0, void 0, void 0, function () {
49
- var response, rawCode, extractedCode_1, isSuccess, predictionSource, predictions, error_1;
50
+ var response, rawCode, extractedCode, isSuccess, predictionSource, predictions, error_1;
50
51
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
51
52
  return __generator(this, function (_4) {
52
53
  switch (_4.label) {
@@ -72,10 +73,8 @@ var DocumentVideoProcessing = function (_a) {
72
73
  console.log("✅ Analysis response:", response);
73
74
  clearTimeout(timeoutId);
74
75
  rawCode = (_r = (_m = (_h = (_e = (_d = (_c = (_b = (_a = response === null || response === void 0 ? void 0 : response.result) === null || _a === void 0 ? void 0 : _a.job_status) === null || _b === void 0 ? void 0 : _b.predictions) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.code) !== null && _e !== void 0 ? _e : (_g = (_f = response === null || response === void 0 ? void 0 : response.result) === null || _f === void 0 ? void 0 : _f.job_status) === null || _g === void 0 ? void 0 : _g.code) !== null && _h !== void 0 ? _h : (_l = (_k = (_j = response === null || response === void 0 ? void 0 : response.result) === null || _j === void 0 ? void 0 : _j.result) === null || _k === void 0 ? void 0 : _k[0]) === null || _l === void 0 ? void 0 : _l.code) !== null && _m !== void 0 ? _m : (_q = (_p = (_o = response === null || response === void 0 ? void 0 : response.job_status) === null || _o === void 0 ? void 0 : _o.predictions) === null || _p === void 0 ? void 0 : _p[0]) === null || _q === void 0 ? void 0 : _q.code) !== null && _r !== void 0 ? _r : response === null || response === void 0 ? void 0 : response.code;
75
- extractedCode_1 = rawCode ? String(rawCode) : "";
76
- isSuccess = ["1.", "4.", "5.", "6.", "9."].some(function (prefix) {
77
- return extractedCode_1.startsWith(prefix);
78
- });
76
+ extractedCode = rawCode ? String(rawCode) : "";
77
+ isSuccess = !isBlockingCode(extractedCode, blockingCodes);
79
78
  predictionSource = (_3 = (_y = (_v = (_u = (_t = (_s = response === null || response === void 0 ? void 0 : response.result) === null || _s === void 0 ? void 0 : _s.job_status) === null || _t === void 0 ? void 0 : _t.predictions) === null || _u === void 0 ? void 0 : _u[0]) !== null && _v !== void 0 ? _v : (_x = (_w = response === null || response === void 0 ? void 0 : response.job_status) === null || _w === void 0 ? void 0 : _w.predictions) === null || _x === void 0 ? void 0 : _x[0]) !== null && _y !== void 0 ? _y : (_2 = (_1 = (_0 = (_z = response === null || response === void 0 ? void 0 : response.result) === null || _z === void 0 ? void 0 : _z.result) === null || _0 === void 0 ? void 0 : _0[0]) === null || _1 === void 0 ? void 0 : _1.predictions) === null || _2 === void 0 ? void 0 : _2[0]) !== null && _3 !== void 0 ? _3 : null;
80
79
  predictions = (predictionSource === null || predictionSource === void 0 ? void 0 : predictionSource.code)
81
80
  ? [
@@ -90,10 +89,10 @@ var DocumentVideoProcessing = function (_a) {
90
89
  type: predictionSource.type || "document",
91
90
  },
92
91
  ]
93
- : extractedCode_1
92
+ : extractedCode
94
93
  ? [
95
94
  {
96
- code: extractedCode_1,
95
+ code: extractedCode,
97
96
  codeName: (response === null || response === void 0 ? void 0 : response.codeName) || "",
98
97
  codeDescription: (response === null || response === void 0 ? void 0 : response.codeDescription) || "",
99
98
  type: "document",
@@ -102,11 +101,11 @@ var DocumentVideoProcessing = function (_a) {
102
101
  : [];
103
102
  console.log("📊 Document video analysis result:", {
104
103
  isSuccess: isSuccess,
105
- code: extractedCode_1,
104
+ code: extractedCode,
106
105
  response: response,
107
106
  });
108
107
  setAnalysisPredictions(predictions);
109
- setAnalysisErrorCode(extractedCode_1);
108
+ setAnalysisErrorCode(extractedCode);
110
109
  setHasError(!isSuccess);
111
110
  setIsDone(true);
112
111
  return [3 /*break*/, 4];
@@ -127,7 +126,7 @@ var DocumentVideoProcessing = function (_a) {
127
126
  return function () {
128
127
  clearTimeout(timeoutId);
129
128
  };
130
- }, [onProcessingComplete, videoData, thumbnail, sessionId, nodeId, isDone, documentType, requiresTwoSides, documentTemplateId]);
129
+ }, [onProcessingComplete, videoData, thumbnail, sessionId, nodeId, isDone, documentType, requiresTwoSides, documentTemplateId, blockingCodes]);
131
130
  useEffect(function () {
132
131
  // While analysis is not finished, stay at step 0
133
132
  if (!isDone && !hasError) {
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentVideoProcessing.js","sources":["../../../../../../src/components/document-video/document-video-flow/DocumentVideoProcessing.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport Title from \"../../ui/Title\";\nimport Subtitle from \"../../ui/Subtitle\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../../../types/documentVideo\";\nimport type { Prediction } from \"../../../utils/apiAnalysis\";\nimport { analyzeDocumentVideo } from \"../../../services/analysis\";\n\ninterface DocumentVideoProcessingProps {\n onProcessingComplete: (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string\n ) => void;\n videoData: DocumentVideoCaptureBySide;\n thumbnail: DocumentVideoPreviewBySide;\n onRetake: () => void;\n sessionId: string;\n nodeId: string;\n documentTemplateId: string;\n documentType: string;\n requiresTwoSides: boolean;\n}\n\nconst processingSteps = [\n {\n key: \"upload\",\n },\n {\n key: \"analysis\",\n },\n {\n key: \"validation\",\n },\n {\n key: \"finalization\",\n },\n];\n\nconst DocumentVideoProcessing = ({\n onProcessingComplete,\n videoData,\n thumbnail,\n onRetake,\n sessionId,\n nodeId,\n documentTemplateId,\n documentType,\n requiresTwoSides,\n}: DocumentVideoProcessingProps) => {\n const { t } = useI18n();\n const [currentStep, setCurrentStep] = useState(0);\n const [hasError, setHasError] = useState(false);\n const [isDone, setIsDone] = useState(false);\n const [analysisErrorCode, setAnalysisErrorCode] = useState<string | null>(null);\n const [analysisPredictions, setAnalysisPredictions] = useState<Prediction[]>([]);\n\n const analysisStartedRef = useRef(false);\n\n useEffect(() => {\n // Prevent multiple analysis runs\n if (analysisStartedRef.current) return;\n if (!videoData.recto || !thumbnail.recto || !sessionId) return;\n\n analysisStartedRef.current = true;\n\n // Timeout: 90 secondes pour la vidéo (plus long que selfie car fichier plus gros)\n const timeoutId = setTimeout(() => {\n if (!isDone) {\n console.error(\"⏰ Document video analysis timeout after 90 seconds\");\n setHasError(true);\n setIsDone(true);\n onProcessingComplete(false);\n }\n }, 90000);\n\n const processFiles = async () => {\n console.log(\"🚀 Starting document video analysis...\");\n\n try {\n if (requiresTwoSides && (!videoData.verso || !thumbnail.verso)) {\n throw new Error(\"Missing verso video or preview\");\n }\n\n console.log(\"📹 Video data:\", videoData);\n console.log(\"📸 Thumbnail:\", thumbnail);\n console.log(\"🔑 Session ID:\", sessionId);\n console.log(\"🆔 Node ID:\", nodeId);\n console.log(\"📄 Document Template ID:\", documentTemplateId);\n\n // Call the analyzeDocumentVideo API\n const response = await analyzeDocumentVideo(\n sessionId,\n nodeId,\n videoData,\n thumbnail,\n documentTemplateId,\n {\n documentType,\n requiresTwoSides,\n }\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n clearTimeout(timeoutId);\n\n const rawCode =\n response?.result?.job_status?.predictions?.[0]?.code ??\n response?.result?.job_status?.code ??\n response?.result?.result?.[0]?.code ??\n response?.job_status?.predictions?.[0]?.code ??\n response?.code;\n const extractedCode = rawCode ? String(rawCode) : \"\";\n // Code 8.x (specimen) is blocking — treated as failure\n const isSuccess = [\"1.\", \"4.\", \"5.\", \"6.\", \"9.\"].some((prefix) =>\n extractedCode.startsWith(prefix)\n );\n const predictionSource =\n response?.result?.job_status?.predictions?.[0] ??\n response?.job_status?.predictions?.[0] ??\n response?.result?.result?.[0]?.predictions?.[0] ??\n null;\n const predictions: Prediction[] =\n predictionSource?.code\n ? [\n {\n code: String(predictionSource.code),\n codeName:\n predictionSource.codeName ||\n predictionSource.code_name ||\n \"\",\n codeDescription:\n predictionSource.codeDescription ||\n predictionSource.code_description ||\n \"\",\n type: predictionSource.type || \"document\",\n },\n ]\n : extractedCode\n ? [\n {\n code: extractedCode,\n codeName: response?.codeName || \"\",\n codeDescription: response?.codeDescription || \"\",\n type: \"document\",\n },\n ]\n : [];\n\n console.log(\"📊 Document video analysis result:\", {\n isSuccess,\n code: extractedCode,\n response,\n });\n\n setAnalysisPredictions(predictions);\n setAnalysisErrorCode(extractedCode);\n setHasError(!isSuccess);\n setIsDone(true);\n\n // Don't call onProcessingComplete here - let the animation effect handle it\n } catch (error) {\n console.error(\"💥 Document video analysis failed:\", error);\n clearTimeout(timeoutId);\n setHasError(true);\n setIsDone(true);\n setAnalysisErrorCode(null);\n setAnalysisPredictions([]);\n }\n };\n\n processFiles();\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [onProcessingComplete, videoData, thumbnail, sessionId, nodeId, isDone, documentType, requiresTwoSides, documentTemplateId]);\n\n useEffect(() => {\n // While analysis is not finished, stay at step 0\n if (!isDone && !hasError) {\n setCurrentStep(0);\n return;\n }\n\n // When analysis is finished (success or error), start the animation\n const stepToStop = hasError ? 1 : processingSteps.length; // Stop at step 1 if error, otherwise complete all steps\n\n const interval = setInterval(() => {\n setCurrentStep((prev) => {\n if (prev < stepToStop - 1) {\n return prev + 1;\n } else {\n clearInterval(interval);\n onProcessingComplete(!hasError, analysisPredictions, analysisErrorCode || undefined);\n return prev;\n }\n });\n }, 500); // Adjust the speed of the animation\n\n return () => clearInterval(interval);\n }, [onProcessingComplete, hasError, isDone, analysisPredictions, analysisErrorCode]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {hasError\n ? t(\n \"document_video.processing.error_title\",\n \"Échec de l'analyse\"\n )\n : t(\"document_video.processing.title\", \"Analyse en cours\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {hasError\n ? t(\n \"document_video.processing.error_subtitle\",\n \"Une erreur est survenue lors de l'analyse de la vidéo. Veuillez réessayer.\"\n )\n : t(\n \"document_video.processing.subtitle\",\n \"Vérification d'authenticité du document\"\n )}\n </Subtitle>\n </div>\n\n <div className=\"w-full\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index) => (\n <div key={index} className=\"flex items-start\">\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {hasError && index === currentStep ? (\n // Step in error - red cross\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs font-bold\">\n ×\n </div>\n ) : index < currentStep ? (\n // Completed step - green check\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n ) : index === currentStep ? (\n // Current step - spinner\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Upcoming step - gray circle\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {t(`document_video.processing.steps.${step.key}.title`)}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {t(\n `document_video.processing.steps.${step.key}.subtitle`\n )}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"w-full\">\n <div className=\"bg-gray-200 rounded-full h-2\">\n <div\n className={\n hasError\n ? \"bg-red-500 h-2 rounded-full transition-all duration-500 ease-out\"\n : \"bg-[#11E5C5] h-2 rounded-full transition-all duration-500 ease-out\"\n }\n style={{\n width: `${\n ((currentStep + 1) / processingSteps.length) * 100\n }%`,\n }}\n ></div>\n </div>\n <p className=\"text-xs text-gray-500 mt-2 text-center\">\n {t(\"document_video.processing.step_of\", {\n current: currentStep + 1,\n total: processingSteps.length,\n defaultValue: `Étape ${currentStep + 1} sur ${processingSteps.length}`,\n })}\n </p>\n </div>\n\n {/* Footer with buttons */}\n {hasError && (\n <div className=\"sticky bottom-0 bg-white border-t border-gray-100 p-4 md:p-6\">\n <div className=\"w-full max-w-md mx-auto\">\n {/* Mobile layout - stacked buttons */}\n <div className=\"flex flex-col space-y-3 md:hidden\">\n <button\n onClick={onRetake}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\n \"document_video.confirmation.retake\",\n \"Reprendre la vidéo\"\n )}\n </button>\n </div>\n\n {/* Desktop layout - horizontal buttons */}\n <div className=\"hidden md:flex gap-3 justify-between items-center\">\n <button\n onClick={onRetake}\n className=\"px-6 py-3 text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline border border-gray-300 rounded-lg\"\n >\n {t(\n \"document_video.confirmation.retake\",\n \"Reprendre la vidéo\"\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default DocumentVideoProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentVideoProcessing.js","sources":["../../../../../../src/components/document-video/document-video-flow/DocumentVideoProcessing.tsx"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport Title from \"../../ui/Title\";\nimport Subtitle from \"../../ui/Subtitle\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../../../types/documentVideo\";\nimport type { Prediction } from \"../../../utils/apiAnalysis\";\nimport { analyzeDocumentVideo } from \"../../../services/analysis\";\nimport { isBlockingCode } from \"../../../utils/jdiCodes\";\n\ninterface DocumentVideoProcessingProps {\n onProcessingComplete: (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string\n ) => void;\n videoData: DocumentVideoCaptureBySide;\n thumbnail: DocumentVideoPreviewBySide;\n onRetake: () => void;\n sessionId: string;\n nodeId: string;\n documentTemplateId: string;\n documentType: string;\n requiresTwoSides: boolean;\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\nconst processingSteps = [\n {\n key: \"upload\",\n },\n {\n key: \"analysis\",\n },\n {\n key: \"validation\",\n },\n {\n key: \"finalization\",\n },\n];\n\nconst DocumentVideoProcessing = ({\n onProcessingComplete,\n videoData,\n thumbnail,\n onRetake,\n sessionId,\n nodeId,\n documentTemplateId,\n documentType,\n requiresTwoSides,\n blockingCodes,\n}: DocumentVideoProcessingProps) => {\n const { t } = useI18n();\n const [currentStep, setCurrentStep] = useState(0);\n const [hasError, setHasError] = useState(false);\n const [isDone, setIsDone] = useState(false);\n const [analysisErrorCode, setAnalysisErrorCode] = useState<string | null>(null);\n const [analysisPredictions, setAnalysisPredictions] = useState<Prediction[]>([]);\n\n const analysisStartedRef = useRef(false);\n\n useEffect(() => {\n // Prevent multiple analysis runs\n if (analysisStartedRef.current) return;\n if (!videoData.recto || !thumbnail.recto || !sessionId) return;\n\n analysisStartedRef.current = true;\n\n // Timeout: 90 secondes pour la vidéo (plus long que selfie car fichier plus gros)\n const timeoutId = setTimeout(() => {\n if (!isDone) {\n console.error(\"⏰ Document video analysis timeout after 90 seconds\");\n setHasError(true);\n setIsDone(true);\n onProcessingComplete(false);\n }\n }, 90000);\n\n const processFiles = async () => {\n console.log(\"🚀 Starting document video analysis...\");\n\n try {\n if (requiresTwoSides && (!videoData.verso || !thumbnail.verso)) {\n throw new Error(\"Missing verso video or preview\");\n }\n\n console.log(\"📹 Video data:\", videoData);\n console.log(\"📸 Thumbnail:\", thumbnail);\n console.log(\"🔑 Session ID:\", sessionId);\n console.log(\"🆔 Node ID:\", nodeId);\n console.log(\"📄 Document Template ID:\", documentTemplateId);\n\n // Call the analyzeDocumentVideo API\n const response = await analyzeDocumentVideo(\n sessionId,\n nodeId,\n videoData,\n thumbnail,\n documentTemplateId,\n {\n documentType,\n requiresTwoSides,\n }\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n clearTimeout(timeoutId);\n\n const rawCode =\n response?.result?.job_status?.predictions?.[0]?.code ??\n response?.result?.job_status?.code ??\n response?.result?.result?.[0]?.code ??\n response?.job_status?.predictions?.[0]?.code ??\n response?.code;\n const extractedCode = rawCode ? String(rawCode) : \"\";\n // Determine success from the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const predictionSource =\n response?.result?.job_status?.predictions?.[0] ??\n response?.job_status?.predictions?.[0] ??\n response?.result?.result?.[0]?.predictions?.[0] ??\n null;\n const predictions: Prediction[] =\n predictionSource?.code\n ? [\n {\n code: String(predictionSource.code),\n codeName:\n predictionSource.codeName ||\n predictionSource.code_name ||\n \"\",\n codeDescription:\n predictionSource.codeDescription ||\n predictionSource.code_description ||\n \"\",\n type: predictionSource.type || \"document\",\n },\n ]\n : extractedCode\n ? [\n {\n code: extractedCode,\n codeName: response?.codeName || \"\",\n codeDescription: response?.codeDescription || \"\",\n type: \"document\",\n },\n ]\n : [];\n\n console.log(\"📊 Document video analysis result:\", {\n isSuccess,\n code: extractedCode,\n response,\n });\n\n setAnalysisPredictions(predictions);\n setAnalysisErrorCode(extractedCode);\n setHasError(!isSuccess);\n setIsDone(true);\n\n // Don't call onProcessingComplete here - let the animation effect handle it\n } catch (error) {\n console.error(\"💥 Document video analysis failed:\", error);\n clearTimeout(timeoutId);\n setHasError(true);\n setIsDone(true);\n setAnalysisErrorCode(null);\n setAnalysisPredictions([]);\n }\n };\n\n processFiles();\n\n return () => {\n clearTimeout(timeoutId);\n };\n }, [onProcessingComplete, videoData, thumbnail, sessionId, nodeId, isDone, documentType, requiresTwoSides, documentTemplateId, blockingCodes]);\n\n useEffect(() => {\n // While analysis is not finished, stay at step 0\n if (!isDone && !hasError) {\n setCurrentStep(0);\n return;\n }\n\n // When analysis is finished (success or error), start the animation\n const stepToStop = hasError ? 1 : processingSteps.length; // Stop at step 1 if error, otherwise complete all steps\n\n const interval = setInterval(() => {\n setCurrentStep((prev) => {\n if (prev < stepToStop - 1) {\n return prev + 1;\n } else {\n clearInterval(interval);\n onProcessingComplete(!hasError, analysisPredictions, analysisErrorCode || undefined);\n return prev;\n }\n });\n }, 500); // Adjust the speed of the animation\n\n return () => clearInterval(interval);\n }, [onProcessingComplete, hasError, isDone, analysisPredictions, analysisErrorCode]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {hasError\n ? t(\n \"document_video.processing.error_title\",\n \"Échec de l'analyse\"\n )\n : t(\"document_video.processing.title\", \"Analyse en cours\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {hasError\n ? t(\n \"document_video.processing.error_subtitle\",\n \"Une erreur est survenue lors de l'analyse de la vidéo. Veuillez réessayer.\"\n )\n : t(\n \"document_video.processing.subtitle\",\n \"Vérification d'authenticité du document\"\n )}\n </Subtitle>\n </div>\n\n <div className=\"w-full\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index) => (\n <div key={index} className=\"flex items-start\">\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {hasError && index === currentStep ? (\n // Step in error - red cross\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs font-bold\">\n ×\n </div>\n ) : index < currentStep ? (\n // Completed step - green check\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n ) : index === currentStep ? (\n // Current step - spinner\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Upcoming step - gray circle\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {t(`document_video.processing.steps.${step.key}.title`)}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {t(\n `document_video.processing.steps.${step.key}.subtitle`\n )}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"w-full\">\n <div className=\"bg-gray-200 rounded-full h-2\">\n <div\n className={\n hasError\n ? \"bg-red-500 h-2 rounded-full transition-all duration-500 ease-out\"\n : \"bg-[#11E5C5] h-2 rounded-full transition-all duration-500 ease-out\"\n }\n style={{\n width: `${\n ((currentStep + 1) / processingSteps.length) * 100\n }%`,\n }}\n ></div>\n </div>\n <p className=\"text-xs text-gray-500 mt-2 text-center\">\n {t(\"document_video.processing.step_of\", {\n current: currentStep + 1,\n total: processingSteps.length,\n defaultValue: `Étape ${currentStep + 1} sur ${processingSteps.length}`,\n })}\n </p>\n </div>\n\n {/* Footer with buttons */}\n {hasError && (\n <div className=\"sticky bottom-0 bg-white border-t border-gray-100 p-4 md:p-6\">\n <div className=\"w-full max-w-md mx-auto\">\n {/* Mobile layout - stacked buttons */}\n <div className=\"flex flex-col space-y-3 md:hidden\">\n <button\n onClick={onRetake}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\n \"document_video.confirmation.retake\",\n \"Reprendre la vidéo\"\n )}\n </button>\n </div>\n\n {/* Desktop layout - horizontal buttons */}\n <div className=\"hidden md:flex gap-3 justify-between items-center\">\n <button\n onClick={onRetake}\n className=\"px-6 py-3 text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline border border-gray-300 rounded-lg\"\n >\n {t(\n \"document_video.confirmation.retake\",\n \"Reprendre la vidéo\"\n )}\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default DocumentVideoProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}