datakeen-session-react 1.1.140-rc.72 → 1.1.140-rc.73
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/dist/cjs/components/nfc-scan/NfcScanNode.js +22 -3
- package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +24 -1
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/hooks/useNfcSseStatus.js +12 -0
- package/dist/cjs/hooks/useNfcSseStatus.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/isMobileDevice.js +17 -0
- package/dist/cjs/utils/isMobileDevice.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcScanNode.js +22 -3
- package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +25 -2
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/hooks/useNfcSseStatus.js +12 -0
- package/dist/esm/hooks/useNfcSseStatus.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/isMobileDevice.js +15 -0
- package/dist/esm/utils/isMobileDevice.js.map +1 -0
- package/package.json +1 -1
|
@@ -9,16 +9,20 @@ var QRCode = require('qrcode');
|
|
|
9
9
|
var useI18n = require('../../hooks/useI18n.js');
|
|
10
10
|
var useNfcSseStatus = require('../../hooks/useNfcSseStatus.js');
|
|
11
11
|
var api = require('../../services/api.js');
|
|
12
|
+
var isMobileDevice = require('../../utils/isMobileDevice.js');
|
|
12
13
|
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
14
|
+
var Button = require('../ui/Button.js');
|
|
13
15
|
var Title = require('../ui/Title.js');
|
|
14
16
|
var Subtitle = require('../ui/Subtitle.js');
|
|
15
17
|
var NfcSuccessAnimation = require('./NfcSuccessAnimation.js');
|
|
16
18
|
|
|
17
19
|
var NfcScanStep = function (_a) {
|
|
18
|
-
var sessionId = _a.sessionId, nodeId = _a.nodeId, stepObject = _a.stepObject, template = _a.template, pageTitle = _a.pageTitle, pageDescription = _a.pageDescription;
|
|
20
|
+
var sessionId = _a.sessionId, nodeId = _a.nodeId, stepObject = _a.stepObject, template = _a.template, pageTitle = _a.pageTitle, pageDescription = _a.pageDescription, onBack = _a.onBack;
|
|
19
21
|
var t = useI18n.useI18n().t;
|
|
20
22
|
var canvasRef = React.useRef(null);
|
|
21
23
|
var _b = React.useState(null), qrError = _b[0], setQrError = _b[1];
|
|
24
|
+
// Sur mobile, on ouvre directement l'app de scan au lieu d'afficher un QR code inutile.
|
|
25
|
+
var isMobile = React.useMemo(function () { return isMobileDevice.isMobileDevice(); }, []);
|
|
22
26
|
var nfcUrl = React.useMemo(function () {
|
|
23
27
|
var origin = typeof window !== "undefined" ? window.location.origin : "";
|
|
24
28
|
return "".concat(origin, "/scan/").concat(sessionId);
|
|
@@ -39,7 +43,19 @@ var NfcScanStep = function (_a) {
|
|
|
39
43
|
var title = pageTitle || t("nfc_scan.page_title", "Scan NFC de votre document");
|
|
40
44
|
var subtitle = pageDescription ||
|
|
41
45
|
t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.");
|
|
46
|
+
// Sur mobile : ouvrir directement l'application de scan (pas de QR à se scanner soi-même).
|
|
47
|
+
// Une seule fois, tant que le scan n'a pas progressé. Le SSE reste actif pour faire avancer
|
|
48
|
+
// le parcours quand la lecture est terminée.
|
|
49
|
+
var hasRedirectedRef = React.useRef(false);
|
|
42
50
|
React.useEffect(function () {
|
|
51
|
+
if (!isMobile || status !== "pending" || hasRedirectedRef.current)
|
|
52
|
+
return;
|
|
53
|
+
hasRedirectedRef.current = true;
|
|
54
|
+
window.location.assign(nfcUrl);
|
|
55
|
+
}, [isMobile, status, nfcUrl]);
|
|
56
|
+
React.useEffect(function () {
|
|
57
|
+
if (isMobile)
|
|
58
|
+
return; // pas de QR sur mobile (redirection directe)
|
|
43
59
|
if (status !== "pending")
|
|
44
60
|
return;
|
|
45
61
|
var generate = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
@@ -81,8 +97,11 @@ var NfcScanStep = function (_a) {
|
|
|
81
97
|
});
|
|
82
98
|
}); };
|
|
83
99
|
generate();
|
|
84
|
-
}, [nfcUrl, status, t]);
|
|
85
|
-
|
|
100
|
+
}, [nfcUrl, status, t, isMobile]);
|
|
101
|
+
// Bouton retour : seulement tant que le scan n'a pas commencé/abouti, et si un handler est fourni.
|
|
102
|
+
var canGoBack = !!onBack && (status === "pending" || status === "opened");
|
|
103
|
+
var footer = canGoBack ? (jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onBack, children: t("common.back", "Retour") })) : null;
|
|
104
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: footer, children: jsxRuntime.jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxRuntime.jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxRuntime.jsxs("div", { className: "text-center space-y-4 mt-16 md:mt-20", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line", children: subtitle })] }), jsxRuntime.jsx("div", { className: "flex-1 flex justify-center items-center", children: status === "success" ? (jsxRuntime.jsx(NfcSuccessAnimation.default, {})) : status === "completed" ? (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4 p-8", children: [jsxRuntime.jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsxRuntime.jsx("p", { className: "text-sm text-gray-600", children: t("nfc_scan.verifying", "Vérification en cours…") })] })) : status === "opened" ? (jsxRuntime.jsxs("div", { className: "w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm", children: [jsxRuntime.jsx("div", { className: "mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200", children: jsxRuntime.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", className: "h-7 w-7", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntime.jsx("path", { d: "M20 6 9 17l-5-5" }) }) }), jsxRuntime.jsx("p", { className: "text-base font-semibold text-gray-900", children: t("nfc_scan.qr_opened_title", "QR code scanné") }), jsxRuntime.jsx("p", { className: "mt-2 text-sm leading-relaxed text-gray-600", children: t("nfc_scan.qr_opened_description", "L'expérience NFC est ouverte sur votre smartphone. Continuez le scan sur votre téléphone.") }), jsxRuntime.jsxs("div", { className: "mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700", children: [jsxRuntime.jsx("span", { className: "h-2 w-2 animate-pulse rounded-full bg-emerald-500" }), t("nfc_scan.waiting_completion", "En attente de la lecture NFC")] })] })) : qrError ? (jsxRuntime.jsx("div", { className: "text-red-500 text-center p-4", children: qrError })) : isMobile ? (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4 p-8 text-center", children: [jsxRuntime.jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsxRuntime.jsx("p", { className: "text-sm text-gray-600", children: t("nfc_scan.opening_app", "Ouverture de l'application…") }), jsxRuntime.jsx("a", { href: nfcUrl, className: "text-sm font-medium text-blue-600 underline", children: t("nfc_scan.open_app_link", "Ouvrir l'application") })] })) : (jsxRuntime.jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", children: jsxRuntime.jsx("canvas", { ref: canvasRef }) })) })] }) }) }));
|
|
86
105
|
};
|
|
87
106
|
|
|
88
107
|
exports.default = NfcScanStep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NfcScanNode.js","sources":["../../../../../src/components/nfc-scan/NfcScanNode.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport type { SessionTemplate, stepObject } from \"../../types/session\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useNfcSseStatus } from \"../../hooks/useNfcSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport NfcSuccessAnimation from \"./NfcSuccessAnimation\";\n\ninterface NfcScanStepProps {\n sessionId: string;\n nodeId: string;\n stepObject: stepObject;\n template?: SessionTemplate;\n pageTitle?: string;\n pageDescription?: string;\n}\n\nconst NfcScanStep: React.FC<NfcScanStepProps> = ({\n sessionId,\n nodeId,\n stepObject,\n template,\n pageTitle,\n pageDescription,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n\n const nfcUrl = useMemo(() => {\n const origin = typeof window !== \"undefined\" ? window.location.origin : \"\";\n return `${origin}/scan/${sessionId}`;\n }, [sessionId]);\n\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n const { status } = useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted: () => {\n if (template) {\n stepObject.goToNextStep(nodeId, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n },\n });\n\n const title =\n pageTitle || t(\"nfc_scan.page_title\", \"Scan NFC de votre document\");\n const subtitle =\n pageDescription ||\n t(\n \"nfc_scan.page_description\",\n \"Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.\"\n );\n\n useEffect(() => {\n if (status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n\n try {\n const dataUrl = await QRCode.toDataURL(nfcUrl, {\n width: 256,\n margin: 2,\n color: { dark: \"#000000\", light: \"#FFFFFF\" },\n });\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n } catch {\n setQrError(t(\"qr_code.generation_failed\", \"Erreur de génération du QR code\"));\n }\n };\n\n generate();\n }, [nfcUrl, status, t]);\n\n return (\n <MobilePageLayout footer={null}>\n <div className=\"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 mt-16 md:mt-20\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">{title}</Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"flex-1 flex justify-center items-center\">\n {status === \"success\" ? (\n <NfcSuccessAnimation />\n ) : status === \"completed\" ? (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"nfc_scan.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"opened\" ? (\n <div className=\"w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200\">\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"h-7 w-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n <p className=\"text-base font-semibold text-gray-900\">\n {t(\"nfc_scan.qr_opened_title\", \"QR code scanné\")}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-gray-600\">\n {t(\n \"nfc_scan.qr_opened_description\",\n \"L'expérience NFC est ouverte sur votre smartphone. Continuez le scan sur votre téléphone.\"\n )}\n </p>\n <div className=\"mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-emerald-500\" />\n {t(\"nfc_scan.waiting_completion\", \"En attente de la lecture NFC\")}\n </div>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : (\n <div className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\">\n <canvas ref={canvasRef} />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcScanStep;\n"],"names":["useI18n","useRef","useState","useMemo","getBaseURL","useNfcSseStatus","useEffect","__awaiter","_jsx","MobilePageLayout","_jsxs","Title","Subtitle","NfcSuccessAnimation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NfcScanNode.js","sources":["../../../../../src/components/nfc-scan/NfcScanNode.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport type { SessionTemplate, stepObject } from \"../../types/session\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useNfcSseStatus } from \"../../hooks/useNfcSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport { isMobileDevice } from \"../../utils/isMobileDevice\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Button from \"../ui/Button\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport NfcSuccessAnimation from \"./NfcSuccessAnimation\";\n\ninterface NfcScanStepProps {\n sessionId: string;\n nodeId: string;\n stepObject: stepObject;\n template?: SessionTemplate;\n pageTitle?: string;\n pageDescription?: string;\n /** Retour vers la sélection du document (pour corriger un mauvais choix). */\n onBack?: () => void;\n}\n\nconst NfcScanStep: React.FC<NfcScanStepProps> = ({\n sessionId,\n nodeId,\n stepObject,\n template,\n pageTitle,\n pageDescription,\n onBack,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n // Sur mobile, on ouvre directement l'app de scan au lieu d'afficher un QR code inutile.\n const isMobile = useMemo(() => isMobileDevice(), []);\n\n const nfcUrl = useMemo(() => {\n const origin = typeof window !== \"undefined\" ? window.location.origin : \"\";\n return `${origin}/scan/${sessionId}`;\n }, [sessionId]);\n\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n const { status } = useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted: () => {\n if (template) {\n stepObject.goToNextStep(nodeId, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n },\n });\n\n const title =\n pageTitle || t(\"nfc_scan.page_title\", \"Scan NFC de votre document\");\n const subtitle =\n pageDescription ||\n t(\n \"nfc_scan.page_description\",\n \"Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.\"\n );\n\n // Sur mobile : ouvrir directement l'application de scan (pas de QR à se scanner soi-même).\n // Une seule fois, tant que le scan n'a pas progressé. Le SSE reste actif pour faire avancer\n // le parcours quand la lecture est terminée.\n const hasRedirectedRef = useRef(false);\n useEffect(() => {\n if (!isMobile || status !== \"pending\" || hasRedirectedRef.current) return;\n hasRedirectedRef.current = true;\n window.location.assign(nfcUrl);\n }, [isMobile, status, nfcUrl]);\n\n useEffect(() => {\n if (isMobile) return; // pas de QR sur mobile (redirection directe)\n if (status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n\n try {\n const dataUrl = await QRCode.toDataURL(nfcUrl, {\n width: 256,\n margin: 2,\n color: { dark: \"#000000\", light: \"#FFFFFF\" },\n });\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n } catch {\n setQrError(t(\"qr_code.generation_failed\", \"Erreur de génération du QR code\"));\n }\n };\n\n generate();\n }, [nfcUrl, status, t, isMobile]);\n\n // Bouton retour : seulement tant que le scan n'a pas commencé/abouti, et si un handler est fourni.\n const canGoBack = !!onBack && (status === \"pending\" || status === \"opened\");\n const footer = canGoBack ? (\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"common.back\", \"Retour\")}\n </Button>\n ) : null;\n\n return (\n <MobilePageLayout footer={footer}>\n <div className=\"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 mt-16 md:mt-20\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">{title}</Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"flex-1 flex justify-center items-center\">\n {status === \"success\" ? (\n <NfcSuccessAnimation />\n ) : status === \"completed\" ? (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"nfc_scan.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"opened\" ? (\n <div className=\"w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200\">\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"h-7 w-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n <p className=\"text-base font-semibold text-gray-900\">\n {t(\"nfc_scan.qr_opened_title\", \"QR code scanné\")}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-gray-600\">\n {t(\n \"nfc_scan.qr_opened_description\",\n \"L'expérience NFC est ouverte sur votre smartphone. Continuez le scan sur votre téléphone.\"\n )}\n </p>\n <div className=\"mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-emerald-500\" />\n {t(\"nfc_scan.waiting_completion\", \"En attente de la lecture NFC\")}\n </div>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : isMobile ? (\n <div className=\"flex flex-col items-center gap-4 p-8 text-center\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"nfc_scan.opening_app\", \"Ouverture de l'application…\")}\n </p>\n <a\n href={nfcUrl}\n className=\"text-sm font-medium text-blue-600 underline\"\n >\n {t(\"nfc_scan.open_app_link\", \"Ouvrir l'application\")}\n </a>\n </div>\n ) : (\n <div className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\">\n <canvas ref={canvasRef} />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcScanStep;\n"],"names":["useI18n","useRef","useState","useMemo","isMobileDevice","getBaseURL","useNfcSseStatus","useEffect","__awaiter","_jsx","Button","MobilePageLayout","_jsxs","Title","Subtitle","NfcSuccessAnimation"],"mappings":"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"}
|
|
@@ -142,6 +142,21 @@ var DocumentCheck = function (_a) {
|
|
|
142
142
|
setRetryCount(sessionRetryCount);
|
|
143
143
|
}
|
|
144
144
|
}, [session, node.id]);
|
|
145
|
+
// Restauration après refresh : si le NFC est en cours côté backend (l'utilisateur attendait sur
|
|
146
|
+
// l'écran QR), revenir directement à cet écran (docStep 7) au lieu de repartir au début du nœud.
|
|
147
|
+
// `docStep` est en mémoire et serait sinon perdu au rechargement.
|
|
148
|
+
var hasRestoredNfcStep = React.useRef(false);
|
|
149
|
+
React.useEffect(function () {
|
|
150
|
+
if (hasRestoredNfcStep.current)
|
|
151
|
+
return;
|
|
152
|
+
if (node.nfcEnabled !== true)
|
|
153
|
+
return;
|
|
154
|
+
var status = session === null || session === void 0 ? void 0 : session.nfcStatus;
|
|
155
|
+
if (status === "pending" || status === "opened") {
|
|
156
|
+
hasRestoredNfcStep.current = true;
|
|
157
|
+
setDocStep(7);
|
|
158
|
+
}
|
|
159
|
+
}, [session, node.nfcEnabled]);
|
|
145
160
|
// Check retry limits on mount/reload - if retries exhausted, show error page immediately
|
|
146
161
|
React.useEffect(function () {
|
|
147
162
|
// Special case: if allowResubmission is false and retryCount > 0, show error immediately
|
|
@@ -699,7 +714,15 @@ var DocumentCheck = function (_a) {
|
|
|
699
714
|
if (nfcPreparationError) {
|
|
700
715
|
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx("div", { className: "w-full max-w-md mx-auto", children: jsxRuntime.jsx(ButtonDesktop.default, { type: "back", onClick: function () { return setDocStep(2); }, className: "w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2", children: t("buttons.back", "Retour") }) }), children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center h-full p-4 text-center", children: [jsxRuntime.jsx("div", { className: "text-red-500 text-4xl mb-4", children: "\u26A0\uFE0F" }), jsxRuntime.jsx("h2", { className: "text-xl font-bold text-red-600 mb-2", children: t("nfc_scan.preparation_error_title", "Erreur de préparation NFC") }), jsxRuntime.jsx("p", { className: "text-gray-600 mb-4", children: nfcPreparationError })] }) }));
|
|
701
716
|
}
|
|
702
|
-
return (jsxRuntime.jsx(NfcScanNode.default, { sessionId: sessionId, nodeId: node.id, stepObject: stepObject, template: template
|
|
717
|
+
return (jsxRuntime.jsx(NfcScanNode.default, { sessionId: sessionId, nodeId: node.id, stepObject: stepObject, template: template, onBack: function () {
|
|
718
|
+
var _a, _b;
|
|
719
|
+
// Retour vers la sélection du document (corriger un mauvais choix). Le démontage de
|
|
720
|
+
// NfcScanStep ferme le SSE via le cleanup du hook (pas d'appel backend nécessaire).
|
|
721
|
+
var hasIntroduction = ((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) !== undefined ||
|
|
722
|
+
((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) !== undefined;
|
|
723
|
+
hasRestoredNfcStep.current = true; // ne pas re-restaurer l'étape QR après ce retour
|
|
724
|
+
setDocStep(hasIntroduction ? 0 : 1);
|
|
725
|
+
} }));
|
|
703
726
|
default:
|
|
704
727
|
console.error("Invalid docStep: ".concat(docStep));
|
|
705
728
|
return (jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center h-full p-4 text-center", children: [jsxRuntime.jsx("div", { className: "text-red-500 text-4xl mb-4", children: "\u26A0\uFE0F" }), jsxRuntime.jsx("h2", { className: "text-xl font-bold text-red-600 mb-2", children: t("document_check.navigation_error.title", "Erreur de navigation") }), jsxRuntime.jsx("p", { className: "text-gray-600 mb-4", children: t("document_check.navigation_error.description", "Étape non valide. Veuillez recommencer.") }), jsxRuntime.jsx(ButtonDesktop.default, { className: "px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors", type: "back", onClick: function () { return setDocStep(0); }, children: t("document_check.navigation_error.back", "Retour au début") })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n} from \"../../types/session\";\nimport JDIPreIntroduction from \"../jdi/JDIPreIntroduction\";\nimport JDICountrySelection from \"../jdi/JDICountrySelection\";\nimport JDIDocumentSelection from \"../jdi/JDIDocumentSelection\";\nimport JDIDocumentUpload from \"../jdi/JDIDocumentUpload\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport DocumentVideoCapture from \"../document-video/DocumentVideoCapture\";\nimport { Camera, Upload } from \"lucide-react\";\nimport { useDocumentContext } from \"../../context/DocumentContext\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n logDocumentTypeSelected,\n logCaptureModeSelected,\n logPhotoCaptured,\n logPhotosValidated,\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { ISO_COUNTRY_CODES } from \"../../utils/isoCountryCodes\";\nimport {\n DocumentTemplate,\n FetchedDocumentTemplates,\n getAllDocumentTemplates,\n getDocTypeKey,\n getDocumentTemplateId,\n} from \"../../services/documentTemplate\";\nimport { UserInput } from \"../../types/userInput\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n updateSessionUserInput,\n skipNfcWithReason,\n} from \"../../services/sessionService\";\nimport NfcScanStep from \"../nfc-scan/NfcScanNode\";\nimport NfcChipGate from \"../nfc-scan/NfcChipGate\";\nimport NfcFallbackSurvey from \"../nfc-scan/NfcFallbackSurvey\";\n\nexport interface CountryDocuments {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n residencePermit: string[];\n driverLicense: string[];\n pinkDriverLicense: string[];\n };\n}\n\nexport interface NodeIdentityControl {\n id: string;\n acceptedCountries: CountryDocuments[];\n automaticPhotoCapture?: boolean;\n withVideo?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy), normalisé via normalizeNfcMode.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n allowedAddingMethods?: string[];\n introductionPage?: {\n title: string;\n description: string;\n };\n countrySelection?: {\n title: string;\n description: string;\n };\n documentSelection?: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\ninterface DocumentCheckProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeIdentityControl;\n onContinueOnPC?: () => void;\n documentTypeId: string;\n acceptedCountries?: AcceptedCountry[];\n isMobileCapture?: boolean;\n allowedAddingMethods?: string[];\n template?: SessionTemplate;\n templateIndex?: number;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n}\n\nimport { EUROPEAN_COUNTRY_CODES } from \"../../utils/europeanCountries\";\n\nconst NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([\n \"passport\",\n \"idCard\",\n \"residencePermit\",\n]);\n\n/**\n * Normalise le mode NFC vers les valeurs courantes.\n * Rétrocompat : les parcours enregistrés avant le renommage portent encore\n * `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).\n */\nconst normalizeNfcMode = (mode?: string): \"nfcOnly\" | \"nfcOrPhoto\" =>\n mode === \"nfcAndApi\" || mode === \"nfcOrPhoto\" ? \"nfcOrPhoto\" : \"nfcOnly\";\n\n/**\n * DocumentCheck component manages the multi-step document verification flow for a session.\n * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.\n * The component adapts its flow for mobile capture and supports custom session templates.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC (used for mobile capture fallback).\n * @param {string} props.documentTypeId - The ID of the required document type for verification (e.g., \"jdi-2\" for ID card).\n * @param {AcceptedCountry[]} [props.acceptedCountries] - Optional list of countries accepted for the document type. If not provided, resolved from the session template.\n * @param {boolean} [props.isMobileCapture=false] - If true, enables mobile photo capture flow instead of file upload.\n * @param {SessionTemplate} [props.template] - Optional session template object, used to resolve accepted countries and flow configuration.\n * @param {number} [props.templateIndex] - Optional index of the current template node, used for navigation and retry logic.\n *\n * @returns {JSX.Element} Multi-step document verification UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Handles both desktop and mobile flows, including photo capture and file upload.\n * - Integrates with context for selected document type and manages internal state for step navigation, country selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for misconfiguration or invalid navigation.\n * - Uses hooks for translation, retry navigation, and context management.\n */\nconst DocumentCheck = ({\n stepObject,\n sessionId,\n node,\n onContinueOnPC: _onContinueOnPC,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [documentTemplates, setDocumentTemplates] =\n useState<FetchedDocumentTemplates>();\n const [loadingTemplates, setLoadingTemplates] = useState(true);\n\n useEffect(() => {\n (async () => {\n setLoadingTemplates(true);\n const templates = await getAllDocumentTemplates();\n setDocumentTemplates(templates);\n setLoadingTemplates(false);\n })();\n }, []);\n\n const initialRetryCount = getNodeRetryCount(session, node.id);\n const [selectedMethod, setSelectedMethod] = useState<\n \"download\" | \"picture\" | null\n >(null);\n\n const isPictureAllowed = allowedAddingMethods?.includes(\"picture\") ?? true;\n const isDownloadAllowed = allowedAddingMethods?.includes(\"download\") ?? true;\n\n // Check if retry is allowed based on initial retry count\n const isInitialRetryAllowed = () => {\n // Special case: if allowResubmission is false and retryCount > 0, no retries allowed\n if (node.allowResubmission === false && initialRetryCount > 0) {\n return false;\n }\n\n if (node.allowResubmission === undefined) return true;\n if (!node.allowResubmission) return false;\n if (node.maxResubmissionAttempts !== undefined) {\n return initialRetryCount <= node.maxResubmissionAttempts;\n }\n return true;\n };\n\n // Initialize docStep - if retries exhausted, start at error page (step 6)\n const [docStep, setDocStep] = useState(() => {\n if (initialRetryCount > 0 && !isInitialRetryAllowed()) {\n return 6; // Error page\n }\n return 0; // Normal flow - start with introduction\n });\n const [selectedCountry, setSelectedCountry] = useState(\n acceptedCountries?.[0]?.code?.toUpperCase() || \"FR\",\n );\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [nfcPreparationError, setNfcPreparationError] = useState<string | null>(null);\n // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),\n // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).\n const [nfcSkipped, setNfcSkipped] = useState(false);\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page immediately\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (node.allowResubmission === false && retryCount > 0) {\n setDocStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n // Inline retry check to avoid dependency issues\n const checkRetryLimit = () => {\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n // Check immediately on mount if retries are exhausted\n // This redirects to error page before showing any JDI steps\n if (retryCount > 0 && !checkRetryLimit()) {\n // User has exhausted retries, redirect to error page immediately\n setDocStep(6);\n }\n }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);\n\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>(\n {},\n );\n const [currentPhotoStep, setCurrentPhotoStep] = useState(\n \"before-recto\" as\n | \"before-recto\"\n | \"recto\"\n | \"before-verso\"\n | \"verso\"\n | \"confirmation\",\n );\n const [videoFlowPhase, setVideoFlowPhase] = useState<\"photo\" | \"video\">(\n \"photo\",\n );\n\n const { selectedDocumentType, setSelectedDocumentType } =\n useDocumentContext();\n\n const finalAcceptedCountries = useMemo(() => {\n if (loadingTemplates) return acceptedCountries;\n const result: AcceptedCountry[] = [];\n const hasInternational = acceptedCountries?.some(c => c.code === \"INT\");\n const hasEurope = acceptedCountries?.some(c => c.code === \"EU\");\n\n if (!hasInternational && !hasEurope) return acceptedCountries;\n\n const internationalDoc = acceptedCountries?.find(c => c.code === \"INT\");\n const europeDoc = acceptedCountries?.find(c => c.code === \"EU\");\n\n for (const ISOCode of ISO_COUNTRY_CODES) {\n if (ISOCode === \"INT\" || ISOCode === \"EU\") continue;\n\n const countryDocInput = acceptedCountries?.find(c => c.code?.toUpperCase() === ISOCode);\n const isEuropean = EUROPEAN_COUNTRY_CODES.includes(ISOCode);\n\n // Determine which configuration to use for this country\n // 1. Specific country config\n // 2. EU group config (if European)\n // 3. INT group config\n let configToUse: AcceptedCountry | undefined = countryDocInput;\n\n if (!configToUse) {\n if (isEuropean && europeDoc) {\n configToUse = europeDoc;\n } else if (internationalDoc) {\n configToUse = internationalDoc;\n }\n }\n\n if (configToUse) {\n const documents: AcceptedCountry['documents'] = {\n passport: [],\n idCard: [],\n driverLicense: [],\n residencePermit: [],\n pinkDriverLicense: [],\n };\n for (const key of Object.keys(configToUse.documents)) {\n const docKey = key as keyof AcceptedCountry['documents'];\n if (!isDocumentTypeAvailable(ISOCode, docKey)) continue;\n documents[docKey] = configToUse.documents[docKey];\n }\n if (\n documents.passport.length ||\n documents.idCard.length ||\n documents.driverLicense.length ||\n documents.residencePermit.length ||\n documents.pinkDriverLicense.length\n ) {\n result.push({ code: ISOCode, documents: { ...documents } });\n }\n }\n }\n return result;\n }, [acceptedCountries, documentTemplates, loadingTemplates]);\n\n // Helper to check if a document type is available for a country\n function isDocumentTypeAvailable(\n countryCode: string,\n documentType: keyof AcceptedCountry[\"documents\"],\n ) {\n if (countryCode === 'INT' || countryCode === 'EU') return true;\n const docTypeKey = (getDocTypeKey(documentType) ?? \"\").toLowerCase();\n return documentTemplates?.data?.some(\n (tpl: DocumentTemplate) =>\n tpl.countryCode === countryCode &&\n (tpl.name?.toLowerCase() || \"\").includes(docTypeKey),\n );\n }\n\n useEffect(() => {\n if (!documentTypeId) console.error(\"DocumentCheck: Missing documentTypeId\");\n console.debug(\"[DocumentCheck] node content:\", node);\n\n // Don't reset docStep if we're already on error page (step 6) due to exhausted retries\n if (docStep === 6) {\n return;\n }\n\n // En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1)\n if (node.nfcEnabled === true) {\n setDocStep(-1);\n return;\n }\n\n if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\n }, [documentTypeId, sessionId, isMobileCapture]);\n\n const handleCountrySelect = (countryId: string) => {\n console.debug(\n \"[DocumentCheck] handleCountrySelect - countryId:\",\n countryId,\n );\n setUserInput((prev) => ({ ...prev, countryCode: countryId.toUpperCase() }));\n setSelectedCountry(countryId.toUpperCase());\n setSelectedDocumentType(null);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n // Reset retry count to 0 (will be synced to session)\n setRetryCount(0);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(2);\n };\n\n const handlePhotoCapture = async (\n imageData: string,\n side: \"recto\" | \"verso\",\n ) => {\n try {\n // Convert data URL to Blob for processing\n const imageBlob = dataUrlToBlob(imageData);\n\n // Resize and optimize the image (only on mobile)\n const processedBlob = await resizeAfterCapture(imageBlob);\n\n // Convert back to data URL for storage and display\n const processedDataUrl = await blobToDataUrl(processedBlob);\n\n console.debug(`[DocumentCheck] Photo processed for ${side}`, {\n originalSize: imageBlob.size,\n processedSize: processedBlob.size,\n originalType: imageBlob.type,\n processedType: processedBlob.type,\n });\n\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n } catch (error) {\n console.error(\n `[DocumentCheck] Failed to process photo for ${side}:`,\n error,\n );\n // Fallback: use original image if processing fails\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n }\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n logPhotosValidated(sessionId);\n setFileUploaded({\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n });\n setDocStep(4);\n }\n };\n\n const handlePhotoConfirmedForVideo = () => {\n setVideoFlowPhase(\"video\");\n };\n\n const handleDocumentVideoComplete = (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n const analysisData =\n predictions && predictions.length > 0 ? predictions : null;\n if (analysisData) {\n setAnalysisData(analysisData);\n }\n if (errorCode) {\n setErrorCode(errorCode);\n }\n handleProcessingComplete(success, undefined, analysisData);\n };\n\n const handleDocumentTypeSelect = async (documentId: string) => {\n const documentLabel = t(`documentTypes.${documentId}`, documentId);\n logDocumentTypeSelected(sessionId, documentId, documentLabel);\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n const selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n const selectedCountryCode = selectedCountry.toUpperCase();\n const selectedDocumentInput = {\n countryCode: selectedCountryCode,\n identityDocumentType: documentId,\n identityDocumentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setUserInput((prev) => ({ ...prev, ...selectedDocumentInput }));\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n\n if (\n node.nfcEnabled === true &&\n !nfcSkipped &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId)\n ) {\n const nfcMode = normalizeNfcMode(node.nfcMode);\n try {\n await updateSessionUserInput(sessionId, {\n ...((session?.userInput as Record<string, unknown> | undefined) ?? {}),\n ...selectedDocumentInput,\n });\n } catch (error) {\n console.error(\"Failed to persist NFC document selection:\", error);\n setNfcPreparationError(\n t(\n \"nfc_scan.preparation_failed\",\n \"Impossible de préparer le scan NFC. Veuillez réessayer.\",\n ),\n );\n }\n setDocStep(nfcMode === \"nfcOrPhoto\" ? 3 : 7);\n return;\n }\n\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n logDocumentLoaded(sessionId, \"recto\");\n if (files.back) {\n logDocumentLoaded(sessionId, \"verso\");\n }\n logDocumentsValidated(sessionId);\n\n setFileUploaded(files);\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setDocStep(6);\n } else {\n // Proceed to processing\n setDocStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n _retryCount?: number,\n apiAnalysisData?: Prediction[] | null,\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n\n // Extract and store the error code\n if (apiAnalysisData.length > 0) {\n const code = apiAnalysisData[0].code;\n setErrorCode(code);\n }\n }\n\n if (success) {\n const shouldRunNfcAfterApi =\n node.nfcEnabled === true &&\n !nfcSkipped &&\n normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\" &&\n !!selectedDocumentType?.id &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);\n\n if (shouldRunNfcAfterApi) {\n setDocStep(7);\n return;\n }\n\n // Increment currentStep in database immediately after successful analysis\n // This prevents double analysis if the user refreshes the page\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(5);\n } else {\n // Increment retry count both in state and session\n setRetryCount((prev) => {\n const newCount = prev + 1;\n // Update session asynchronously\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setDocStep(6);\n }\n };\n\n const handleRetryFromError = () => {\n // Note: retry count is already incremented in handleProcessingComplete\n // This function just handles navigation\n // Pour l'erreur 2.5 (face manquante), on conserve fileUploaded pour pré-remplir\n // l'upload avec la face déjà déposée. Pour les autres erreurs, on repart de zéro.\n if (errorCode !== \"2.5\") {\n setFileUploaded(null);\n }\n // Always stay on the current node and go back to upload step.\n // Never navigate to a different global step: if this node was reached via a\n // condition branch (e.g. \"true\"), navigating away would land on the other\n // branch (\"false\"). The retry means \"re-submit on THIS node\", not \"go back\n // in the journey\".\n setDocStep(3);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n console.log(\"isRetryAllowed - Props:\", {\n allowResubmission: node.allowResubmission,\n maxResubmissionAttempts: node.maxResubmissionAttempts,\n retryCount,\n });\n // Specimen documents (code 8.x) block retry — user can only continue anyway\n if (errorCode?.startsWith(\"8\")) {\n return false;\n }\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n // Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.\n // On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :\n // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC\n // - nfcOnly → on saute le nœud (nœud suivant)\n const handleNfcFallback = async (\n reason: string,\n label: string,\n comment?: string,\n ) => {\n setNfcSkipped(true);\n try {\n await skipNfcWithReason(sessionId, { reason, label, comment });\n } catch (error) {\n console.error(\"Failed to persist NFC fallback reason:\", error);\n }\n\n const nfcMode = normalizeNfcMode(node.nfcMode);\n if (nfcMode === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n return;\n }\n\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n\n // Le questionnaire de fallback (-2) revient au gate (-1)\n if (docStep === -2) {\n setDocStep(-1);\n return;\n }\n\n // En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)\n if (\n node.nfcEnabled === true &&\n docStep === (hasIntroduction ? 0 : 1)\n ) {\n setDocStep(-1);\n return;\n }\n\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\n case -1: {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n return (\n <NfcChipGate\n onConfirm={() => setDocStep(hasIntroduction ? 0 : 1)}\n // Pas de puce → questionnaire de fallback pour recueillir la raison\n onNoChip={() => setDocStep(-2)}\n />\n );\n }\n case -2:\n return <NfcFallbackSurvey onSubmit={handleNfcFallback} />;\n case 0:\n if (!documentTypeId) {\n console.error(\"DocumentCheck: Missing documentTypeId in step 0\");\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\n \"document_check.config_error.title\",\n \"Erreur de configuration\",\n )}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.config_error.description\",\n \"Type de document non spécifié.\",\n )}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() =>\n stepObject.setStep(Math.max(0, stepObject.step - 1))\n }\n >\n {t(\"document_check.config_error.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n );\n }\n return (\n <JDIPreIntroduction\n documentTypeId={documentTypeId}\n onContinue={() => setDocStep(1)}\n onBack={handleBack}\n introTitleText={\n node.introductionPage?.title || t(\"jdi.pre_introduction.title\")\n }\n introDescText={\n node.introductionPage?.description ||\n t(\"jdi.pre_introduction.description\")\n }\n />\n );\n case 1:\n return (\n <JDICountrySelection\n onCountrySelect={handleCountrySelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n acceptedCountries={finalAcceptedCountries}\n countryIntroText={\n node.countrySelection?.title || t(\"jdi.country_selection.title\")\n }\n countryDescText={\n node.countrySelection?.description ||\n t(\"jdi.country_selection.description\")\n }\n />\n );\n case 2:\n return (\n <JDIDocumentSelection\n onDocumentSelect={handleDocumentTypeSelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n sessionId={sessionId}\n chosenCountry={\n finalAcceptedCountries?.find((c) => c.code === selectedCountry) ||\n undefined\n }\n documentSelectionTitle={\n node.documentSelection?.title || t(\"jdi.document_selection.title\")\n }\n documentSelectionDescription={\n // En NFC, on laisse JDIDocumentSelection choisir le wording adapté\n // (subtitle_identity_nfc) plutôt que l'override \"téléverser\" du nœud.\n node.nfcEnabled === true\n ? undefined\n : node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\n nfcEnabled={node.nfcEnabled === true}\n />\n );\n case 3:\n if (!selectedDocumentType) {\n console.error(\n \"DocumentCheck: selectedDocumentType is null for step 3!\",\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.selection_error.title\", \"Erreur de sélection\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.selection_error.description\",\n \"Aucun type de document sélectionné. Veuillez revenir à l'étape précédente.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(2)}\n >\n {t(\n \"document_check.selection_error.back\",\n \"Retour à la sélection\",\n )}\n </ButtonDesktop>\n </div>\n );\n }\n\n if (isPictureAllowed && isDownloadAllowed && !selectedMethod) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={handleBack}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"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 {t(\n \"document_check.method_selection.title\",\n \"Choisissez une méthode\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\n \"document_check.method_selection.subtitle\",\n \"Comment souhaitez-vous ajouter votre document ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"grid gap-4\">\n <button\n onClick={() => { setSelectedMethod(\"picture\"); logCaptureModeSelected(sessionId, \"picture\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Camera size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.picture_title\",\n \"Prendre une photo\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.picture_desc\",\n \"Utilisez l'appareil photo de votre appareil\",\n )}\n </p>\n </div>\n </button>\n\n <button\n onClick={() => { setSelectedMethod(\"download\"); logCaptureModeSelected(sessionId, \"upload\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Upload size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.download_title\",\n \"Téléverser un fichier\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.download_desc\",\n \"Sélectionnez un fichier sur votre appareil\",\n )}\n </p>\n </div>\n </button>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n }\n\n const activeMethod =\n selectedMethod ||\n (isPictureAllowed && isMobileCapture ? \"picture\" : \"download\");\n\n if (activeMethod === \"picture\" && isPictureAllowed) {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n const onConfirm = node.withVideo\n ? handlePhotoConfirmedForVideo\n : handlePhotoConfirmation;\n\n if (node.withVideo && videoFlowPhase === \"video\") {\n return (\n <DocumentVideoCapture\n selectedDocumentType={selectedDocumentType}\n onComplete={handleDocumentVideoComplete}\n onBack={() => {\n setVideoFlowPhase(\"photo\");\n setCurrentPhotoStep(\"confirmation\");\n }}\n nodeId={node.id}\n sessionId={sessionId}\n previewOverrides={{\n recto: capturedImages.recto,\n verso: capturedImages.verso,\n }}\n />\n );\n }\n\n if (currentPhotoStep === \"before-recto\") {\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n if (currentPhotoStep === \"recto\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"recto\")}\n />\n );\n }\n if (currentPhotoStep === \"before-verso\") {\n return (\n <BeforeVersoPhoto setStep={() => setCurrentPhotoStep(\"verso\")} />\n );\n }\n if (currentPhotoStep === \"verso\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"verso\")}\n />\n );\n }\n if (currentPhotoStep === \"confirmation\") {\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto || \"\"}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={!!capturedImages.verso}\n onConfirm={onConfirm}\n onRetry={() => setCurrentPhotoStep(\"before-recto\")}\n onRetryAfterProcessing={() => setCurrentPhotoStep(\"before-recto\")}\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n }\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n } else {\n return (\n <JDIDocumentUpload\n documentType={selectedDocumentType?.id || documentTypeId}\n documentTypeId={documentTypeId}\n documentLabel={selectedDocumentType?.label}\n onUpload={handleDocumentUpload}\n onBack={() => {\n if (isPictureAllowed && isDownloadAllowed) {\n setSelectedMethod(null);\n } else {\n setDocStep(2);\n }\n }}\n initialFront={errorCode === \"2.5\" ? fileUploaded?.front : null}\n initialBack={errorCode === \"2.5\" ? fileUploaded?.back : null}\n sessionId={sessionId}\n />\n );\n }\n case 4:\n return (\n <JDIProcessing\n documentType={selectedDocumentType?.id || documentTypeId}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={documentTypeId}\n retryCount={retryCount}\n documentTemplateId={selectedDocumentType?.documentTemplateId}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <JDISuccess\n documentType={selectedDocumentType?.id || documentTypeId}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n />\n );\n case 6:\n return (\n <JDIError\n documentType={selectedDocumentType?.id || documentTypeId}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n case 7:\n if (nfcPreparationError) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={() => setDocStep(2)}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"nfc_scan.preparation_error_title\", \"Erreur de préparation NFC\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{nfcPreparationError}</p>\n </div>\n </MobilePageLayout>\n );\n }\n return (\n <NfcScanStep\n sessionId={sessionId}\n nodeId={node.id}\n stepObject={stepObject}\n template={template}\n />\n );\n default:\n console.error(`Invalid docStep: ${docStep}`);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.navigation_error.description\",\n \"Étape non valide. Veuillez recommencer.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(0)}\n >\n {t(\"document_check.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCheck;\n"],"names":["useI18n","getSession","useState","useEffect","__awaiter","getAllDocumentTemplates","getNodeRetryCount","useDocumentContext","useMemo","EUROPEAN_COUNTRY_CODES","__assign","ISO_COUNTRY_CODES","getDocTypeKey","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","logPhotoCaptured","logPhotosValidated","logDocumentTypeSelected","getDocumentTemplateId","updateSessionUserInput","logDocumentLoaded","logDocumentsValidated","incrementNodeRetryCount","skipNfcWithReason","_jsx","NfcChipGate","NfcFallbackSurvey","_jsxs","ButtonDesktop","JDIPreIntroduction","JDICountrySelection","JDIDocumentSelection","MobilePageLayout","Title","Subtitle","logCaptureModeSelected","Camera","Upload","DocumentVideoCapture","BeforePhoto","Photo","BeforeVersoPhoto","PhotoConfirmation","JDIDocumentUpload","JDIProcessing","JDISuccess","JDIError","NfcScanStep"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkHA,IAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC;IAC1C,UAAU;IACV,QAAQ;IACR,iBAAiB;AAClB,CAAA,CAAC;AAEF;;;;AAIG;AACH,IAAM,gBAAgB,GAAG,UAAC,IAAa,EAAA;AACrC,IAAA,OAAA,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY,GAAG,YAAY,GAAG,SAAS;AAAxE,CAAwE;AAE1E;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACH,IAAM,aAAa,GAAG,UAAC,EAWF,EAAA;;AAVnB,IAAA,IAAA,UAAU,GAAA,EAAA,CAAA,UAAA,CAAA,CACV,SAAS,GAAA,EAAA,CAAA,SAAA,CAAA,CACT,IAAI,GAAA,EAAA,CAAA,IAAA,CAAA,CAC2B,EAAA,CAAA,cAAA,CAAA,KAC/B,cAAc,oBAAA,CAAA,CACd,iBAAiB,GAAA,EAAA,CAAA,iBAAA,CAAA,CACjB,EAAA,GAAA,EAAA,CAAA,eAAuB,CAAA,CAAvB,eAAe,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,CAAA,CACvB,oBAAoB,GAAA,EAAA,CAAA,oBAAA,CAAA,CACpB,QAAQ,GAAA,EAAA,CAAA,QAAA,CAAA,CACR,YAAY,GAAA,EAAA,CAAA;AAEJ,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;AACD,IAAA,IAAA,OAAO,GAAKC,yBAAU,EAAE,QAAjB;IAET,IAAA,EAAA,GACJC,cAAQ,EAA4B,EAD/B,iBAAiB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,oBAAoB,GAAA,EAAA,CAAA,CAAA,CACR;IAChC,IAAA,EAAA,GAA0CA,cAAQ,CAAC,IAAI,CAAC,EAAvD,gBAAgB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAAkB;AAE9D,IAAAC,eAAS,CAAC,YAAA;QACR,CAAC,YAAA,EAAA,OAAAC,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;wBACC,mBAAmB,CAAC,IAAI,CAAC;wBACP,OAAA,CAAA,CAAA,YAAMC,wCAAuB,EAAE,CAAA;;AAA3C,wBAAA,SAAS,GAAG,EAAA,CAAA,IAAA,EAA+B;wBACjD,oBAAoB,CAAC,SAAS,CAAC;wBAC/B,mBAAmB,CAAC,KAAK,CAAC;;;;AAC3B,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAG;IACN,CAAC,EAAE,EAAE,CAAC;IAEN,IAAM,iBAAiB,GAAGC,8BAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;IACvD,IAAA,EAAA,GAAsCJ,cAAQ,CAElD,IAAI,CAAC,EAFA,cAAc,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,iBAAiB,GAAA,EAAA,CAAA,CAAA,CAEjC;AAEP,IAAA,IAAM,gBAAgB,GAAG,CAAA,EAAA,GAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,QAAQ,CAAC,SAAS,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;AAC1E,IAAA,IAAM,iBAAiB,GAAG,CAAA,EAAA,GAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,QAAQ,CAAC,UAAU,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;;AAG5E,IAAA,IAAM,qBAAqB,GAAG,YAAA;;QAE5B,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,IAAI,iBAAiB,GAAG,CAAC,EAAE;AAC7D,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;QACrD,IAAI,CAAC,IAAI,CAAC,iBAAiB;AAAE,YAAA,OAAO,KAAK;AACzC,QAAA,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS,EAAE;AAC9C,YAAA,OAAO,iBAAiB,IAAI,IAAI,CAAC,uBAAuB;QAC1D;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;;IAGK,IAAA,EAAA,GAAwBA,cAAQ,CAAC,YAAA;QACrC,IAAI,iBAAiB,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE;YACrD,OAAO,CAAC,CAAC;QACX;QACA,OAAO,CAAC,CAAC;AACX,IAAA,CAAC,CAAC,EALK,OAAO,QAAA,EAAE,UAAU,QAKxB;AACI,IAAA,IAAA,EAAA,GAAwCA,cAAQ,CACpD,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,IAAI,CACpD,EAFM,eAAe,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAEzC;IACK,IAAA,EAAA,GAAkCA,cAAQ,CAAuB,IAAI,CAAC,EAArE,YAAY,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,eAAe,GAAA,EAAA,CAAA,CAAA,CAAwC;IACtE,IAAA,EAAA,GAAkCA,cAAQ,CAAsB,IAAI,CAAC,EAApE,YAAY,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,eAAe,GAAA,EAAA,CAAA,CAAA,CAAuC;IACrE,IAAA,EAAA,GAA4BA,cAAQ,CAAgB,IAAI,CAAC,EAAxD,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,GAAA,EAAA,CAAA,CAAA,CAAiC;IACzD,IAAA,EAAA,GAAgDA,cAAQ,CAAgB,IAAI,CAAC,EAA5E,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,sBAAsB,GAAA,EAAA,CAAA,CAAA,CAAiC;;;IAG7E,IAAA,EAAA,GAA8BA,cAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAAmB;;IAG7C,IAAA,EAAA,GAA8BA,cAAQ,CAAC,YAAA;QAC3C,OAAOI,8BAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAC5C,IAAA,CAAC,CAAC,EAFK,UAAU,QAAA,EAAE,aAAa,QAE9B;;AAGF,IAAAH,eAAS,CAAC,YAAA;QACR,IAAI,OAAO,EAAE;YACX,IAAM,iBAAiB,GAAGG,8BAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;YAC7D,aAAa,CAAC,iBAAiB,CAAC;QAClC;IACF,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;;AAGtB,IAAAH,eAAS,CAAC,YAAA;;QAER,IAAI,IAAI,CAAC,iBAAiB,KAAK,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE;YACtD,UAAU,CAAC,CAAC,CAAC;YACb;QACF;;;AAIA,QAAA,IAAM,eAAe,GAAG,YAAA;;AAEtB,YAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE;AACxC,gBAAA,OAAO,IAAI;YACb;;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,gBAAA,OAAO,KAAK;YACd;;AAEA,YAAA,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS,EAAE;AAC9C,gBAAA,OAAO,UAAU,IAAI,IAAI,CAAC,uBAAuB;YACnD;;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;;;QAID,IAAI,UAAU,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;;YAExC,UAAU,CAAC,CAAC,CAAC;QACf;AACF,IAAA,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAEhE,IAAA,EAAA,GAAsCD,cAAQ,CAClD,EAAE,CACH,EAFM,cAAc,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,iBAAiB,GAAA,EAAA,CAAA,CAAA,CAEvC;IACK,IAAA,EAAA,GAA0CA,cAAQ,CACtD,cAKgB,CACjB,EAPM,gBAAgB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAO3C;IACK,IAAA,EAAA,GAAsCA,cAAQ,CAClD,OAAO,CACR,EAFM,cAAc,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,iBAAiB,GAAA,EAAA,CAAA,CAAA,CAEvC;IAEK,IAAA,EAAA,GACJK,kCAAkB,EAAE,EADd,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EAAE,uBAAuB,GAAA,EAAA,CAAA,uBAC/B;IAEtB,IAAM,sBAAsB,GAAGC,aAAO,CAAC,YAAA;AACrC,QAAA,IAAI,gBAAgB;AAAE,YAAA,OAAO,iBAAiB;QAC9C,IAAM,MAAM,GAAsB,EAAE;QACpC,IAAM,gBAAgB,GAAG,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,CAAC,UAAA,CAAC,EAAA,EAAI,OAAA,CAAC,CAAC,IAAI,KAAK,KAAK,CAAA,CAAhB,CAAgB,CAAC;QACvE,IAAM,SAAS,GAAG,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,CAAC,UAAA,CAAC,EAAA,EAAI,OAAA,CAAC,CAAC,IAAI,KAAK,IAAI,CAAA,CAAf,CAAe,CAAC;AAE/D,QAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,iBAAiB;QAE7D,IAAM,gBAAgB,GAAG,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,CAAC,UAAA,CAAC,EAAA,EAAI,OAAA,CAAC,CAAC,IAAI,KAAK,KAAK,CAAA,CAAhB,CAAgB,CAAC;QACvE,IAAM,SAAS,GAAG,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,CAAC,UAAA,CAAC,EAAA,EAAI,OAAA,CAAC,CAAC,IAAI,KAAK,IAAI,CAAA,CAAf,CAAe,CAAC;gCAEpD,OAAO,EAAA;AAChB,YAAA,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI;AAAW,gBAAA,OAAA,UAAA;YAEpD,IAAM,eAAe,GAAG,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,CAAC,UAAA,CAAC,EAAA,EAAA,IAAA,EAAA,CAAA,CAAI,OAAA,CAAA,CAAA,EAAA,GAAA,CAAC,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,MAAK,OAAO,CAAA,CAAA,CAAA,CAAC;YACvF,IAAM,UAAU,GAAGC,wCAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC;;;;;YAM3D,IAAI,WAAW,GAAgC,eAAe;YAE9D,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,IAAI,UAAU,IAAI,SAAS,EAAE;oBAC3B,WAAW,GAAG,SAAS;gBACzB;qBAAO,IAAI,gBAAgB,EAAE;oBAC3B,WAAW,GAAG,gBAAgB;gBAChC;YACF;YAEA,IAAI,WAAW,EAAE;AACf,gBAAA,IAAM,SAAS,GAAiC;AAC9C,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,MAAM,EAAE,EAAE;AACV,oBAAA,aAAa,EAAE,EAAE;AACjB,oBAAA,eAAe,EAAE,EAAE;AACnB,oBAAA,iBAAiB,EAAE,EAAE;iBACtB;AACD,gBAAA,KAAkB,UAAkC,EAAlC,EAAA,GAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAlC,EAAA,GAAA,EAAA,CAAA,MAAkC,EAAlC,EAAA,EAAkC,EAAE;AAAjD,oBAAA,IAAM,GAAG,GAAA,EAAA,CAAA,EAAA,CAAA;oBACZ,IAAM,MAAM,GAAG,GAAyC;AACxD,oBAAA,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC;wBAAE;oBAC/C,SAAS,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;gBACnD;AACA,gBAAA,IACE,SAAS,CAAC,QAAQ,CAAC,MAAM;oBACzB,SAAS,CAAC,MAAM,CAAC,MAAM;oBACvB,SAAS,CAAC,aAAa,CAAC,MAAM;oBAC9B,SAAS,CAAC,eAAe,CAAC,MAAM;AAChC,oBAAA,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAClC;AACA,oBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAAC,kBAAA,CAAA,EAAA,EAAO,SAAS,CAAE,EAAE,CAAC;gBAC7D;YACF;;AA1CF,QAAA,KAAsB,UAAiB,EAAjB,mBAAA,GAAAC,iCAAiB,EAAjB,EAAA,GAAA,mBAAA,CAAA,MAAiB,EAAjB,EAAA,EAAiB,EAAA;AAAlC,YAAA,IAAM,OAAO,GAAA,mBAAA,CAAA,EAAA,CAAA;oBAAP,OAAO,CAAA;AA2CjB,QAAA;AACD,QAAA,OAAO,MAAM;IACf,CAAC,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;;AAG5D,IAAA,SAAS,uBAAuB,CAC9B,WAAmB,EACnB,YAAgD,EAAA;;AAEhD,QAAA,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AAC9D,QAAA,IAAM,UAAU,GAAG,CAAC,CAAA,EAAA,GAAAC,8BAAa,CAAC,YAAY,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAE,WAAW,EAAE;AACpE,QAAA,OAAO,CAAA,EAAA,GAAA,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,CAClC,UAAC,GAAqB,EAAA;;AACpB,YAAA,OAAA,GAAG,CAAC,WAAW,KAAK,WAAW;AAC/B,gBAAA,CAAC,CAAA,CAAA,EAAA,GAAA,GAAG,CAAC,IAAI,0CAAE,WAAW,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,QAAA,CAAA,CACvD;IACH;AAEA,IAAAT,eAAS,CAAC,YAAA;;AACR,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC;AAC3E,QAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,IAAI,CAAC;;AAGpD,QAAA,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB;QACF;;AAGA,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;AAC5B,YAAA,UAAU,CAAC,EAAE,CAAC;YACd;QACF;QAEA,IACE,CAAA,MAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,MAAK,SAAS;YAC1C,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,WAAW,MAAK,SAAS,EAChD;YACA,UAAU,CAAC,CAAC,CAAC;QACf;aAAO;YACL,UAAU,CAAC,CAAC,CAAC;QACf;IACF,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEhD,IAAM,mBAAmB,GAAG,UAAC,SAAiB,EAAA;AAC5C,QAAA,OAAO,CAAC,KAAK,CACX,kDAAkD,EAClD,SAAS,CACV;AACD,QAAA,YAAY,CAAC,UAAC,IAAI,IAAK,QAAAO,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,KAAG,CAAnD,CAAmD,CAAC;AAC3E,QAAA,kBAAkB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC3C,uBAAuB,CAAC,IAAI,CAAC;QAC7B,eAAe,CAAC,IAAI,CAAC;QACrB,eAAe,CAAC,IAAI,CAAC;QACrB,YAAY,CAAC,IAAI,CAAC;QAClB,sBAAsB,CAAC,IAAI,CAAC;;QAE5B,aAAa,CAAC,CAAC,CAAC;QAChB,iBAAiB,CAAC,EAAE,CAAC;QACrB,mBAAmB,CAAC,cAAc,CAAC;QACnC,iBAAiB,CAAC,OAAO,CAAC;QAC1B,UAAU,CAAC,CAAC,CAAC;AACf,IAAA,CAAC;AAED,IAAA,IAAM,kBAAkB,GAAG,UACzB,SAAiB,EACjB,IAAuB,EAAA,EAAA,OAAAN,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;AAIf,oBAAA,SAAS,GAAGS,6BAAa,CAAC,SAAS,CAAC;AAGpB,oBAAA,OAAA,CAAA,CAAA,YAAMC,kCAAkB,CAAC,SAAS,CAAC,CAAA;;AAAnD,oBAAA,aAAa,GAAG,EAAA,CAAA,IAAA,EAAmC;AAGhC,oBAAA,OAAA,CAAA,CAAA,YAAMC,6BAAa,CAAC,aAAa,CAAC,CAAA;;AAArD,oBAAA,kBAAA,GAAmB,EAAA,CAAA,IAAA,EAAkC;AAE3D,oBAAA,OAAO,CAAC,KAAK,CAAC,sCAAA,CAAA,MAAA,CAAuC,IAAI,CAAE,EAAE;wBAC3D,YAAY,EAAE,SAAS,CAAC,IAAI;wBAC5B,aAAa,EAAE,aAAa,CAAC,IAAI;wBACjC,YAAY,EAAE,SAAS,CAAC,IAAI;wBAC5B,aAAa,EAAE,aAAa,CAAC,IAAI;AAClC,qBAAA,CAAC;oBAEF,iBAAiB,CAAC,UAAC,IAAI,EAAA;;AAAK,wBAAA,kDAAM,IAAI,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,IAAI,CAAA,GAAG,kBAAgB,EAAA,EAAA,EAAA;AAApC,oBAAA,CAAuC,CAAC;AACpE,oBAAAC,kCAAgB,CAAC,SAAS,EAAE,IAAI,CAAC;AAEjC,oBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;wBACd,aAAa,GACjB,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,uBAApB,oBAAoB,CAAE,EAAE,MAAK,UAAU;4BACvC,CAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,MAAK,mBAAmB;wBAClD,mBAAmB,CAAC,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;oBACtE;yBAAO;wBACL,mBAAmB,CAAC,cAAc,CAAC;oBACrC;;;;oBAEA,OAAO,CAAC,KAAK,CACX,8CAAA,CAAA,MAAA,CAA+C,IAAI,EAAA,GAAA,CAAG,EACtD,OAAK,CACN;;oBAED,iBAAiB,CAAC,UAAC,IAAI,EAAA;;AAAK,wBAAA,kDAAM,IAAI,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,IAAI,CAAA,GAAG,SAAS,EAAA,EAAA,EAAA;AAA7B,oBAAA,CAAgC,CAAC;AAC7D,oBAAAA,kCAAgB,CAAC,SAAS,EAAE,IAAI,CAAC;AAEjC,oBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;wBACd,aAAa,GACjB,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,uBAApB,oBAAoB,CAAE,EAAE,MAAK,UAAU;4BACvC,CAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,MAAK,mBAAmB;wBAClD,mBAAmB,CAAC,aAAa,GAAG,cAAc,GAAG,cAAc,CAAC;oBACtE;yBAAO;wBACL,mBAAmB,CAAC,cAAc,CAAC;oBACrC;;;;;SAEH;AAED,IAAA,IAAM,uBAAuB,GAAG,YAAA;AAC9B,QAAA,IAAI,cAAc,CAAC,KAAK,EAAE;YACxBC,oCAAkB,CAAC,SAAS,CAAC;AAC7B,YAAA,eAAe,CAAC;gBACd,KAAK,EAAE,cAAc,CAAC,KAAK;AAC3B,gBAAA,IAAI,EAAE,cAAc,CAAC,KAAK,IAAI,IAAI;AACnC,aAAA,CAAC;YACF,UAAU,CAAC,CAAC,CAAC;QACf;AACF,IAAA,CAAC;AAED,IAAA,IAAM,4BAA4B,GAAG,YAAA;QACnC,iBAAiB,CAAC,OAAO,CAAC;AAC5B,IAAA,CAAC;AAED,IAAA,IAAM,2BAA2B,GAAG,UAClC,OAAgB,EAChB,WAA0B,EAC1B,SAAkB,EAAA;AAElB,QAAA,IAAM,YAAY,GAChB,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,GAAG,IAAI;QAC5D,IAAI,YAAY,EAAE;YAChB,eAAe,CAAC,YAAY,CAAC;QAC/B;QACA,IAAI,SAAS,EAAE;YACb,YAAY,CAAC,SAAS,CAAC;QACzB;AACA,QAAA,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;AAC5D,IAAA,CAAC;IAED,IAAM,wBAAwB,GAAG,UAAO,UAAkB,EAAA,EAAA,OAAAb,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;oBAClD,aAAa,GAAG,CAAC,CAAC,gBAAA,CAAA,MAAA,CAAiB,UAAU,CAAE,EAAE,UAAU,CAAC;AAClE,oBAAAc,yCAAuB,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;AACvD,oBAAA,kBAAkB,GAAG;AACzB,0BAAE;0BACAC,sCAAqB,CAAC;AACtB,4BAAA,iBAAiB,EAAE,sBAAsB;AACzC,4BAAA,WAAW,EAAE,eAAe;AAC5B,4BAAA,UAAU,EAAA,UAAA;AACV,4BAAA,iBAAiB,EAAA,iBAAA;AAClB,yBAAA,CAAC;AAEE,oBAAA,WAAW,GAAG;AAClB,wBAAA,EAAE,EAAE,UAAU;AACd,wBAAA,KAAK,EAAE,CAAC,CAAC,gBAAA,CAAA,MAAA,CAAiB,UAAU,CAAE,CAAC;AACvC,wBAAA,WAAW,EACT,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,mBAAmB;AACjE,wBAAA,kBAAkB,EAAE,kBAAkB;qBACvC;AAEK,oBAAA,mBAAmB,GAAG,eAAe,CAAC,WAAW,EAAE;AACnD,oBAAA,qBAAqB,GAAG;AAC5B,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,oBAAoB,EAAE,UAAU;AAChC,wBAAA,0BAA0B,EAAE,kBAAkB;qBAC/C;oBAED,uBAAuB,CAAC,WAAW,CAAC;AACpC,oBAAA,YAAY,CAAC,UAAC,IAAI,EAAA,EAAK,QAAAT,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAK,qBAAqB,CAAA,EAAG,CAAvC,CAAuC,CAAC;oBAC/D,eAAe,CAAC,IAAI,CAAC;oBACrB,eAAe,CAAC,IAAI,CAAC;oBACrB,YAAY,CAAC,IAAI,CAAC;oBAClB,sBAAsB,CAAC,IAAI,CAAC;oBAC5B,iBAAiB,CAAC,EAAE,CAAC;oBACrB,mBAAmB,CAAC,cAAc,CAAC;oBACnC,iBAAiB,CAAC,OAAO,CAAC;AAGxB,oBAAA,IAAA,EAAA,IAAI,CAAC,UAAU,KAAK,IAAI;AACxB,wBAAA,CAAC,UAAU;AACX,wBAAA,2BAA2B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA,EAF3C,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AAIM,oBAAA,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;;;;AAE5C,oBAAA,OAAA,CAAA,CAAA,YAAMU,qCAAsB,CAAC,SAAS,6CAChC,CAAA,EAAA,GAAC,OAAO,KAAA,IAAA,IAAP,OAAO,uBAAP,OAAO,CAAE,SAAiD,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAC,EACnE,qBAAqB,EACxB,CAAA;;AAHF,oBAAA,EAAA,CAAA,IAAA,EAGE;;;;AAEF,oBAAA,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,OAAK,CAAC;oBACjE,sBAAsB,CACpB,CAAC,CACC,6BAA6B,EAC7B,yDAAyD,CAC1D,CACF;;;AAEH,oBAAA,UAAU,CAAC,OAAO,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC5C,OAAA,CAAA,CAAA,YAAA;;oBAGF,UAAU,CAAC,CAAC,CAAC;;;;SACd;IAED,IAAM,oBAAoB,GAAG,UAAC,KAAoB,EAAA;AAChD,QAAAC,mCAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;AACrC,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,YAAAA,mCAAiB,CAAC,SAAS,EAAE,OAAO,CAAC;QACvC;QACAC,uCAAqB,CAAC,SAAS,CAAC;QAEhC,eAAe,CAAC,KAAK,CAAC;;QAGtB,IAAI,CAAC,cAAc,EAAE,IAAI,UAAU,GAAG,CAAC,EAAE;;YAEvC,UAAU,CAAC,CAAC,CAAC;QACf;aAAO;;YAEL,UAAU,CAAC,CAAC,CAAC;QACf;AACF,IAAA,CAAC;AAED,IAAA,IAAM,wBAAwB,GAAG,UAC/B,OAAgB,EAChB,WAAoB,EACpB,eAAqC,EAAA;QAErC,IAAI,eAAe,EAAE;YACnB,eAAe,CAAC,eAAe,CAAC;;AAGhC,YAAA,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,IAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI;gBACpC,YAAY,CAAC,IAAI,CAAC;YACpB;QACF;QAEA,IAAI,OAAO,EAAE;AACX,YAAA,IAAM,oBAAoB,GACxB,IAAI,CAAC,UAAU,KAAK,IAAI;AACxB,gBAAA,CAAC,UAAU;AACX,gBAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,YAAY;gBAC/C,CAAC,EAAC,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,CAAA;AAC1B,gBAAA,2BAA2B,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAE1D,IAAI,oBAAoB,EAAE;gBACxB,UAAU,CAAC,CAAC,CAAC;gBACb;YACF;;;YAIA,IAAI,QAAQ,EAAE;gBACZ,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;YAC5C;iBAAO;gBACL,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;YACzC;YACA,UAAU,CAAC,CAAC,CAAC;QACf;aAAO;;YAEL,aAAa,CAAC,UAAC,IAAI,EAAA;AACjB,gBAAA,IAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;;AAEzB,gBAAAC,oCAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,UAAC,KAAK,EAAA;AAC5D,oBAAA,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC;AAClE,gBAAA,CAAC,CAAC;AACF,gBAAA,OAAO,QAAQ;AACjB,YAAA,CAAC,CAAC;YACF,UAAU,CAAC,CAAC,CAAC;QACf;AACF,IAAA,CAAC;AAED,IAAA,IAAM,oBAAoB,GAAG,YAAA;;;;;AAK3B,QAAA,IAAI,SAAS,KAAK,KAAK,EAAE;YACvB,eAAe,CAAC,IAAI,CAAC;QACvB;;;;;;QAMA,UAAU,CAAC,CAAC,CAAC;AACf,IAAA,CAAC;;AAGD,IAAA,IAAM,cAAc,GAAG,YAAA;AACrB,QAAA,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE;YACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;AACrD,YAAA,UAAU,EAAA,UAAA;AACX,SAAA,CAAC;;QAEF,IAAI,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9B,YAAA,OAAO,KAAK;QACd;;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,EAAE;AACxC,YAAA,OAAO,IAAI;QACb;;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC3B,YAAA,OAAO,KAAK;QACd;;AAEA,QAAA,IAAI,IAAI,CAAC,uBAAuB,KAAK,SAAS,EAAE;AAC9C,YAAA,OAAO,UAAU,IAAI,IAAI,CAAC,uBAAuB;QACnD;;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,IAAM,oBAAoB,GAAG,YAAA;QAC3B,IAAI,QAAQ,EAAE;YACZ,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC5C;aAAO;YACL,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QACzC;QACA,UAAU,CAAC,CAAC,CAAC;AACf,IAAA,CAAC;AAED,IAAA,IAAM,qBAAqB,GAAG,YAAA;QAC5B,IAAI,QAAQ,EAAE;YACZ,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC5C;aAAO;YACL,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QACzC;QACA,UAAU,CAAC,CAAC,CAAC;AACf,IAAA,CAAC;;;;;AAMD,IAAA,IAAM,iBAAiB,GAAG,UACxB,MAAc,EACd,KAAa,EACb,OAAgB,EAAA,EAAA,OAAAnB,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;oBAEhB,aAAa,CAAC,IAAI,CAAC;;;;AAEjB,oBAAA,OAAA,CAAA,CAAA,YAAMoB,gCAAiB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAA,MAAA,EAAE,KAAK,OAAA,EAAE,OAAO,EAAA,OAAA,EAAE,CAAC,CAAA;;AAA9D,oBAAA,EAAA,CAAA,IAAA,EAA8D;;;;AAE9D,oBAAA,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,OAAK,CAAC;;;AAG1D,oBAAA,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9C,oBAAA,IAAI,OAAO,KAAK,YAAY,EAAE;wBACtB,eAAe,GACnB,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,MAAK,SAAS;4BAC1C,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,WAAW,MAAK,SAAS;wBAClD,UAAU,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC;wBACnC,OAAA,CAAA,CAAA,YAAA;oBACF;oBAEA,IAAI,QAAQ,EAAE;wBACZ,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;oBAC5C;yBAAO;wBACL,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;oBACzC;;;;SACD;AAED,IAAA,IAAM,UAAU,GAAG,YAAA;;QACjB,IAAM,eAAe,GACnB,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,MAAK,SAAS;YAC1C,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,WAAW,MAAK,SAAS;;AAGlD,QAAA,IAAI,OAAO,KAAK,EAAE,EAAE;AAClB,YAAA,UAAU,CAAC,EAAE,CAAC;YACd;QACF;;AAGA,QAAA,IACE,IAAI,CAAC,UAAU,KAAK,IAAI;AACxB,YAAA,OAAO,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,CAAC,EACrC;AACA,YAAA,UAAU,CAAC,EAAE,CAAC;YACd;QACF;AAEA,QAAA,IAAI,OAAO,KAAK,CAAC,EAAE;YACjB,UAAU,CAAC,MAAM,EAAE;QACrB;aAAO;YACL,UAAU,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,GAAG,CAAC,CAAA,CAAR,CAAQ,CAAC;QAChC;AACF,IAAA,CAAC;IAED,QAAQ,OAAO;AACb,QAAA,KAAK,EAAE,EAAE;YACP,IAAM,iBAAe,GACnB,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,MAAK,SAAS;gBAC1C,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,WAAW,MAAK,SAAS;YAClD,QACEC,eAACC,mBAAW,EAAA,EACV,SAAS,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,iBAAe,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAnC,CAAmC;;AAEpD,gBAAA,QAAQ,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,EAAE,CAAC,CAAA,CAAd,CAAc,EAAA,CAC9B;QAEN;AACA,QAAA,KAAK,EAAE;AACL,YAAA,OAAOD,eAACE,yBAAiB,EAAA,EAAC,QAAQ,EAAE,iBAAiB,GAAI;AAC3D,QAAA,KAAK,CAAC;YACJ,IAAI,CAAC,cAAc,EAAE;AACnB,gBAAA,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC;gBAChE,QACEC,yBAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CACA,mCAAmC,EACnC,yBAAyB,CAC1B,EAAA,CACE,EACLA,sBAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC9B,CAAC,CACA,yCAAyC,EACzC,gCAAgC,CACjC,EAAA,CACC,EACJA,eAACI,qBAAa,EAAA,EACZ,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,iFAAiF,EAC3F,OAAO,EAAE,YAAA;AACP,gCAAA,OAAA,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;4BAApD,CAAoD,EAAA,QAAA,EAGrD,CAAC,CAAC,kCAAkC,EAAE,QAAQ,CAAC,EAAA,CAClC,CAAA,EAAA,CACZ;YAEV;YACA,QACEJ,eAACK,0BAAkB,EAAA,EACjB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,cAAM,OAAA,UAAU,CAAC,CAAC,CAAC,EAAb,CAAa,EAC/B,MAAM,EAAE,UAAU,EAClB,cAAc,EACZ,CAAA,MAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,KAAI,CAAC,CAAC,4BAA4B,CAAC,EAEjE,aAAa,EACX,CAAA,MAAA,IAAI,CAAC,gBAAgB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW;AAClC,oBAAA,CAAC,CAAC,kCAAkC,CAAC,EAAA,CAEvC;AAEN,QAAA,KAAK,CAAC;AACJ,YAAA,QACEL,cAAA,CAACM,2BAAmB,IAClB,eAAe,EAAE,mBAAmB,EACpC,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,sBAAsB,EACzC,gBAAgB,EACd,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,KAAK,KAAI,CAAC,CAAC,6BAA6B,CAAC,EAElE,eAAe,EACb,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,gBAAgB,0CAAE,WAAW;AAClC,oBAAA,CAAC,CAAC,mCAAmC,CAAC,EAAA,CAExC;AAEN,QAAA,KAAK,CAAC;AACJ,YAAA,QACEN,cAAA,CAACO,4BAAoB,IACnB,gBAAgB,EAAE,wBAAwB,EAC1C,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,EACX,CAAA,sBAAsB,KAAA,IAAA,IAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,IAAI,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,CAAC,IAAI,KAAK,eAAe,CAAA,CAA1B,CAA0B,CAAC;AAC/D,oBAAA,SAAS,EAEX,sBAAsB,EACpB,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,iBAAiB,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,KAAI,CAAC,CAAC,8BAA8B,CAAC,EAEpE,4BAA4B;;;gBAG1B,IAAI,CAAC,UAAU,KAAK;AAClB,sBAAE;AACF,sBAAE,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,iBAAiB,0CAAE,WAAW;AACnC,wBAAA,CAAC,CAAC,oCAAoC,CAAC,EAE7C,UAAU,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI,EAAA,CACpC;AAEN,QAAA,KAAK,CAAC;YACJ,IAAI,CAAC,oBAAoB,EAAE;AACzB,gBAAA,OAAO,CAAC,KAAK,CACX,yDAAyD,CAC1D;AACD,gBAAA,QACEJ,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CAAC,sCAAsC,EAAE,qBAAqB,CAAC,EAAA,CAC9D,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC9B,CAAC,CACA,4CAA4C,EAC5C,4EAA4E,CAC7E,EAAA,CACC,EACJA,cAAA,CAACI,qBAAa,IACZ,SAAS,EAAC,iFAAiF,EAC3F,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,CAAC,CAAC,CAAA,CAAb,CAAa,EAAA,QAAA,EAE3B,CAAC,CACA,qCAAqC,EACrC,uBAAuB,CACxB,EAAA,CACa,CAAA,EAAA,CACZ;YAEV;AAEA,YAAA,IAAI,gBAAgB,IAAI,iBAAiB,IAAI,CAAC,cAAc,EAAE;gBAC5D,QACEJ,cAAA,CAACQ,wBAAgB,EAAA,EACf,MAAM,EACJR,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EACtCA,cAAA,CAACI,qBAAa,EAAA,EACZ,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,yFAAyF,EAAA,QAAA,EAElG,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAA,CACd,GACZ,EAAA,QAAA,EAGRJ,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CG,yBAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCH,cAAA,CAACS,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,CAAC,CACA,uCAAuC,EACvC,wBAAwB,CACzB,EAAA,CACK,EACRT,cAAA,CAACU,gBAAQ,EAAA,EAAC,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACxD,CAAC,CACA,0CAA0C,EAC1C,iDAAiD,CAClD,EAAA,CACQ,CAAA,EAAA,CACP,EAENP,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,YAAY,EAAA,QAAA,EAAA,CACzBA,eAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,YAAA,EAAQ,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAACQ,wCAAsB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAC9F,SAAS,EAAC,4HAA4H,EAAA,QAAA,EAAA,CAEtIX,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+HAA+H,EAAA,QAAA,EAC5IA,cAAA,CAACY,kBAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EAAA,CAChB,EACNT,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEH,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,6BAA6B,EAAA,QAAA,EACvC,CAAC,CACA,+CAA+C,EAC/C,mBAAmB,CACpB,EAAA,CACC,EACJA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACjC,CAAC,CACA,8CAA8C,EAC9C,6CAA6C,CAC9C,EAAA,CACC,CAAA,EAAA,CACA,CAAA,EAAA,CACC,EAETG,eAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,YAAA,EAAQ,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAACQ,wCAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC9F,SAAS,EAAC,4HAA4H,aAEtIX,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+HAA+H,EAAA,QAAA,EAC5IA,cAAA,CAACa,kBAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EAAA,CAChB,EACNV,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEH,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,6BAA6B,EAAA,QAAA,EACvC,CAAC,CACA,gDAAgD,EAChD,uBAAuB,CACxB,EAAA,CACC,EACJA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACjC,CAAC,CACA,+CAA+C,EAC/C,4CAA4C,CAC7C,EAAA,CACC,CAAA,EAAA,CACA,CAAA,EAAA,CACC,CAAA,EAAA,CACL,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;YAEvB;YAEA,IAAM,YAAY,GAChB,cAAc;AACd,iBAAC,gBAAgB,IAAI,eAAe,GAAG,SAAS,GAAG,UAAU,CAAC;AAEhE,YAAA,IAAI,YAAY,KAAK,SAAS,IAAI,gBAAgB,EAAE;gBAClD,IAAM,aAAa,GACjB,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,MAAK,UAAU;oBACvC,CAAA,oBAAoB,aAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,MAAK,mBAAmB;AAClD,gBAAA,IAAM,SAAS,GAAG,IAAI,CAAC;AACrB,sBAAE;sBACA,uBAAuB;gBAE3B,IAAI,IAAI,CAAC,SAAS,IAAI,cAAc,KAAK,OAAO,EAAE;AAChD,oBAAA,QACEA,cAAA,CAACc,4BAAoB,EAAA,EACnB,oBAAoB,EAAE,oBAAoB,EAC1C,UAAU,EAAE,2BAA2B,EACvC,MAAM,EAAE,YAAA;4BACN,iBAAiB,CAAC,OAAO,CAAC;4BAC1B,mBAAmB,CAAC,cAAc,CAAC;AACrC,wBAAA,CAAC,EACD,MAAM,EAAE,IAAI,CAAC,EAAE,EACf,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE;4BAChB,KAAK,EAAE,cAAc,CAAC,KAAK;4BAC3B,KAAK,EAAE,cAAc,CAAC,KAAK;AAC5B,yBAAA,EAAA,CACD;gBAEN;AAEA,gBAAA,IAAI,gBAAgB,KAAK,cAAc,EAAE;AACvC,oBAAA,QACEd,cAAA,CAACe,mBAAW,EAAA,EACV,OAAO,EAAE,YAAA,EAAM,OAAA,mBAAmB,CAAC,OAAO,CAAC,EAA5B,CAA4B,EAC3C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,cAAM,OAAA,UAAU,CAAC,CAAC,CAAC,CAAA,CAAb,CAAa,EAAA,CAC3B;gBAEN;AACA,gBAAA,IAAI,gBAAgB,KAAK,OAAO,EAAE;oBAChC,QACEf,eAACgB,aAAK,EAAA,EACJ,SAAS,EAAE,UAAC,SAAS,EAAA,EAAK,OAAA,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAtC,CAAsC,EAAA,CAChE;gBAEN;AACA,gBAAA,IAAI,gBAAgB,KAAK,cAAc,EAAE;AACvC,oBAAA,QACEhB,cAAA,CAACiB,wBAAgB,EAAA,EAAC,OAAO,EAAE,YAAA,EAAM,OAAA,mBAAmB,CAAC,OAAO,CAAC,CAAA,CAA5B,CAA4B,EAAA,CAAI;gBAErE;AACA,gBAAA,IAAI,gBAAgB,KAAK,OAAO,EAAE;oBAChC,QACEjB,eAACgB,aAAK,EAAA,EACJ,SAAS,EAAE,UAAC,SAAS,EAAA,EAAK,OAAA,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAtC,CAAsC,EAAA,CAChE;gBAEN;AACA,gBAAA,IAAI,gBAAgB,KAAK,cAAc,EAAE;AACvC,oBAAA,QACEhB,cAAA,CAACkB,yBAAiB,EAAA,EAChB,QAAQ,EAAE,cAAc,CAAC,KAAK,IAAI,EAAE,EACpC,aAAa,EAAE,cAAc,CAAC,KAAK,EACnC,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EACxC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAA,EAAM,OAAA,mBAAmB,CAAC,cAAc,CAAC,CAAA,CAAnC,CAAmC,EAClD,sBAAsB,EAAE,YAAA,EAAM,OAAA,mBAAmB,CAAC,cAAc,CAAC,CAAA,CAAnC,CAAmC,EACjE,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAAA,CAC5B;gBAEN;AACA,gBAAA,QACElB,cAAA,CAACe,mBAAW,EAAA,EACV,OAAO,EAAE,YAAA,EAAM,OAAA,mBAAmB,CAAC,OAAO,CAAC,EAA5B,CAA4B,EAC3C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,cAAM,OAAA,UAAU,CAAC,CAAC,CAAC,CAAA,CAAb,CAAa,EAAA,CAC3B;YAEN;iBAAO;AACL,gBAAA,QACEf,cAAA,CAACmB,yBAAiB,EAAA,EAChB,YAAY,EAAE,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,uBAApB,oBAAoB,CAAE,EAAE,KAAI,cAAc,EACxD,cAAc,EAAE,cAAc,EAC9B,aAAa,EAAE,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,KAAK,EAC1C,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,YAAA;AACN,wBAAA,IAAI,gBAAgB,IAAI,iBAAiB,EAAE;4BACzC,iBAAiB,CAAC,IAAI,CAAC;wBACzB;6BAAO;4BACL,UAAU,CAAC,CAAC,CAAC;wBACf;oBACF,CAAC,EACD,YAAY,EAAE,SAAS,KAAK,KAAK,GAAG,YAAY,aAAZ,YAAY,KAAA,MAAA,GAAA,MAAA,GAAZ,YAAY,CAAE,KAAK,GAAG,IAAI,EAC9D,WAAW,EAAE,SAAS,KAAK,KAAK,GAAG,YAAY,KAAA,IAAA,IAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,GAAG,IAAI,EAC5D,SAAS,EAAE,SAAS,EAAA,CACpB;YAEN;AACF,QAAA,KAAK,CAAC;YACJ,QACEnB,eAACoB,qBAAa,EAAA,EACZ,YAAY,EAAE,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,KAAI,cAAc,EACxD,oBAAoB,EAAE,wBAAwB,EAC9C,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,uBAApB,oBAAoB,CAAE,kBAAkB,EAC5D,MAAM,EAAE,IAAI,CAAC,EAAE,EAAA,CACf;AAEN,QAAA,KAAK,CAAC;AACJ,YAAA,QACEpB,cAAA,CAACqB,kBAAU,EAAA,EACT,YAAY,EAAE,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,KAAI,cAAc,EACxD,UAAU,EAAE,qBAAqB,EACjC,SAAS,EAAE,SAAS,IAAI,SAAS,EAAA,CACjC;AAEN,QAAA,KAAK,CAAC;YACJ,QACErB,cAAA,CAACsB,gBAAQ,EAAA,EACP,YAAY,EAAE,CAAA,oBAAoB,KAAA,IAAA,IAApB,oBAAoB,KAAA,MAAA,GAAA,MAAA,GAApB,oBAAoB,CAAE,EAAE,KAAI,cAAc,EACxD,OAAO,EAAE,oBAAoB,EAC7B,gBAAgB,EAAE,oBAAoB,EACtC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,YAAY,IAAI,SAAS,EACtC,SAAS,EAAE,SAAS,IAAI,SAAS,EACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB,EACrD,cAAc,EAAE,cAAc,EAAE,EAAA,CAChC;AAEN,QAAA,KAAK,CAAC;YACJ,IAAI,mBAAmB,EAAE;AACvB,gBAAA,QACEtB,cAAA,CAACQ,wBAAgB,EAAA,EACf,MAAM,EACJR,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,YACtCA,cAAA,CAACI,qBAAa,EAAA,EACZ,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,cAAM,OAAA,UAAU,CAAC,CAAC,CAAC,CAAA,CAAb,CAAa,EAC5B,SAAS,EAAC,yFAAyF,EAAA,QAAA,EAElG,CAAC,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAA,CACd,GACZ,EAAA,QAAA,EAGRD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CAAC,kCAAkC,EAAE,2BAA2B,CAAC,EAAA,CAChE,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,YAAE,mBAAmB,EAAA,CAAK,CAAA,EAAA,CACvD,EAAA,CACW;YAEvB;YACA,QACEA,eAACuB,mBAAW,EAAA,EACV,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,IAAI,CAAC,EAAE,EACf,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAAA,CAClB;AAEN,QAAA;AACE,YAAA,OAAO,CAAC,KAAK,CAAC,2BAAoB,OAAO,CAAE,CAAC;AAC5C,YAAA,QACEpB,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC/EH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,cAAA,EAAA,CAAS,EACpDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,CAAC,CAAC,uCAAuC,EAAE,sBAAsB,CAAC,EAAA,CAChE,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAC9B,CAAC,CACA,6CAA6C,EAC7C,yCAAyC,CAC1C,EAAA,CACC,EACJA,cAAA,CAACI,qBAAa,IACZ,SAAS,EAAC,iFAAiF,EAC3F,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,CAAC,CAAC,CAAA,CAAb,CAAa,EAAA,QAAA,EAE3B,CAAC,CAAC,sCAAsC,EAAE,iBAAiB,CAAC,EAAA,CAC/C,CAAA,EAAA,CACZ;;AAGd;;;;"}
|
|
1
|
+
{"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo, useRef } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n} from \"../../types/session\";\nimport JDIPreIntroduction from \"../jdi/JDIPreIntroduction\";\nimport JDICountrySelection from \"../jdi/JDICountrySelection\";\nimport JDIDocumentSelection from \"../jdi/JDIDocumentSelection\";\nimport JDIDocumentUpload from \"../jdi/JDIDocumentUpload\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport DocumentVideoCapture from \"../document-video/DocumentVideoCapture\";\nimport { Camera, Upload } from \"lucide-react\";\nimport { useDocumentContext } from \"../../context/DocumentContext\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n logDocumentTypeSelected,\n logCaptureModeSelected,\n logPhotoCaptured,\n logPhotosValidated,\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { ISO_COUNTRY_CODES } from \"../../utils/isoCountryCodes\";\nimport {\n DocumentTemplate,\n FetchedDocumentTemplates,\n getAllDocumentTemplates,\n getDocTypeKey,\n getDocumentTemplateId,\n} from \"../../services/documentTemplate\";\nimport { UserInput } from \"../../types/userInput\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n updateSessionUserInput,\n skipNfcWithReason,\n} from \"../../services/sessionService\";\nimport NfcScanStep from \"../nfc-scan/NfcScanNode\";\nimport NfcChipGate from \"../nfc-scan/NfcChipGate\";\nimport NfcFallbackSurvey from \"../nfc-scan/NfcFallbackSurvey\";\n\nexport interface CountryDocuments {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n residencePermit: string[];\n driverLicense: string[];\n pinkDriverLicense: string[];\n };\n}\n\nexport interface NodeIdentityControl {\n id: string;\n acceptedCountries: CountryDocuments[];\n automaticPhotoCapture?: boolean;\n withVideo?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy), normalisé via normalizeNfcMode.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n allowedAddingMethods?: string[];\n introductionPage?: {\n title: string;\n description: string;\n };\n countrySelection?: {\n title: string;\n description: string;\n };\n documentSelection?: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\ninterface DocumentCheckProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeIdentityControl;\n onContinueOnPC?: () => void;\n documentTypeId: string;\n acceptedCountries?: AcceptedCountry[];\n isMobileCapture?: boolean;\n allowedAddingMethods?: string[];\n template?: SessionTemplate;\n templateIndex?: number;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n}\n\nimport { EUROPEAN_COUNTRY_CODES } from \"../../utils/europeanCountries\";\n\nconst NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([\n \"passport\",\n \"idCard\",\n \"residencePermit\",\n]);\n\n/**\n * Normalise le mode NFC vers les valeurs courantes.\n * Rétrocompat : les parcours enregistrés avant le renommage portent encore\n * `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).\n */\nconst normalizeNfcMode = (mode?: string): \"nfcOnly\" | \"nfcOrPhoto\" =>\n mode === \"nfcAndApi\" || mode === \"nfcOrPhoto\" ? \"nfcOrPhoto\" : \"nfcOnly\";\n\n/**\n * DocumentCheck component manages the multi-step document verification flow for a session.\n * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.\n * The component adapts its flow for mobile capture and supports custom session templates.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC (used for mobile capture fallback).\n * @param {string} props.documentTypeId - The ID of the required document type for verification (e.g., \"jdi-2\" for ID card).\n * @param {AcceptedCountry[]} [props.acceptedCountries] - Optional list of countries accepted for the document type. If not provided, resolved from the session template.\n * @param {boolean} [props.isMobileCapture=false] - If true, enables mobile photo capture flow instead of file upload.\n * @param {SessionTemplate} [props.template] - Optional session template object, used to resolve accepted countries and flow configuration.\n * @param {number} [props.templateIndex] - Optional index of the current template node, used for navigation and retry logic.\n *\n * @returns {JSX.Element} Multi-step document verification UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Handles both desktop and mobile flows, including photo capture and file upload.\n * - Integrates with context for selected document type and manages internal state for step navigation, country selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for misconfiguration or invalid navigation.\n * - Uses hooks for translation, retry navigation, and context management.\n */\nconst DocumentCheck = ({\n stepObject,\n sessionId,\n node,\n onContinueOnPC: _onContinueOnPC,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [documentTemplates, setDocumentTemplates] =\n useState<FetchedDocumentTemplates>();\n const [loadingTemplates, setLoadingTemplates] = useState(true);\n\n useEffect(() => {\n (async () => {\n setLoadingTemplates(true);\n const templates = await getAllDocumentTemplates();\n setDocumentTemplates(templates);\n setLoadingTemplates(false);\n })();\n }, []);\n\n const initialRetryCount = getNodeRetryCount(session, node.id);\n const [selectedMethod, setSelectedMethod] = useState<\n \"download\" | \"picture\" | null\n >(null);\n\n const isPictureAllowed = allowedAddingMethods?.includes(\"picture\") ?? true;\n const isDownloadAllowed = allowedAddingMethods?.includes(\"download\") ?? true;\n\n // Check if retry is allowed based on initial retry count\n const isInitialRetryAllowed = () => {\n // Special case: if allowResubmission is false and retryCount > 0, no retries allowed\n if (node.allowResubmission === false && initialRetryCount > 0) {\n return false;\n }\n\n if (node.allowResubmission === undefined) return true;\n if (!node.allowResubmission) return false;\n if (node.maxResubmissionAttempts !== undefined) {\n return initialRetryCount <= node.maxResubmissionAttempts;\n }\n return true;\n };\n\n // Initialize docStep - if retries exhausted, start at error page (step 6)\n const [docStep, setDocStep] = useState(() => {\n if (initialRetryCount > 0 && !isInitialRetryAllowed()) {\n return 6; // Error page\n }\n return 0; // Normal flow - start with introduction\n });\n const [selectedCountry, setSelectedCountry] = useState(\n acceptedCountries?.[0]?.code?.toUpperCase() || \"FR\",\n );\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [nfcPreparationError, setNfcPreparationError] = useState<string | null>(null);\n // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),\n // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).\n const [nfcSkipped, setNfcSkipped] = useState(false);\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Restauration après refresh : si le NFC est en cours côté backend (l'utilisateur attendait sur\n // l'écran QR), revenir directement à cet écran (docStep 7) au lieu de repartir au début du nœud.\n // `docStep` est en mémoire et serait sinon perdu au rechargement.\n const hasRestoredNfcStep = useRef(false);\n useEffect(() => {\n if (hasRestoredNfcStep.current) return;\n if (node.nfcEnabled !== true) return;\n const status = session?.nfcStatus;\n if (status === \"pending\" || status === \"opened\") {\n hasRestoredNfcStep.current = true;\n setDocStep(7);\n }\n }, [session, node.nfcEnabled]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page immediately\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (node.allowResubmission === false && retryCount > 0) {\n setDocStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n // Inline retry check to avoid dependency issues\n const checkRetryLimit = () => {\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n // Check immediately on mount if retries are exhausted\n // This redirects to error page before showing any JDI steps\n if (retryCount > 0 && !checkRetryLimit()) {\n // User has exhausted retries, redirect to error page immediately\n setDocStep(6);\n }\n }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);\n\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>(\n {},\n );\n const [currentPhotoStep, setCurrentPhotoStep] = useState(\n \"before-recto\" as\n | \"before-recto\"\n | \"recto\"\n | \"before-verso\"\n | \"verso\"\n | \"confirmation\",\n );\n const [videoFlowPhase, setVideoFlowPhase] = useState<\"photo\" | \"video\">(\n \"photo\",\n );\n\n const { selectedDocumentType, setSelectedDocumentType } =\n useDocumentContext();\n\n const finalAcceptedCountries = useMemo(() => {\n if (loadingTemplates) return acceptedCountries;\n const result: AcceptedCountry[] = [];\n const hasInternational = acceptedCountries?.some(c => c.code === \"INT\");\n const hasEurope = acceptedCountries?.some(c => c.code === \"EU\");\n\n if (!hasInternational && !hasEurope) return acceptedCountries;\n\n const internationalDoc = acceptedCountries?.find(c => c.code === \"INT\");\n const europeDoc = acceptedCountries?.find(c => c.code === \"EU\");\n\n for (const ISOCode of ISO_COUNTRY_CODES) {\n if (ISOCode === \"INT\" || ISOCode === \"EU\") continue;\n\n const countryDocInput = acceptedCountries?.find(c => c.code?.toUpperCase() === ISOCode);\n const isEuropean = EUROPEAN_COUNTRY_CODES.includes(ISOCode);\n\n // Determine which configuration to use for this country\n // 1. Specific country config\n // 2. EU group config (if European)\n // 3. INT group config\n let configToUse: AcceptedCountry | undefined = countryDocInput;\n\n if (!configToUse) {\n if (isEuropean && europeDoc) {\n configToUse = europeDoc;\n } else if (internationalDoc) {\n configToUse = internationalDoc;\n }\n }\n\n if (configToUse) {\n const documents: AcceptedCountry['documents'] = {\n passport: [],\n idCard: [],\n driverLicense: [],\n residencePermit: [],\n pinkDriverLicense: [],\n };\n for (const key of Object.keys(configToUse.documents)) {\n const docKey = key as keyof AcceptedCountry['documents'];\n if (!isDocumentTypeAvailable(ISOCode, docKey)) continue;\n documents[docKey] = configToUse.documents[docKey];\n }\n if (\n documents.passport.length ||\n documents.idCard.length ||\n documents.driverLicense.length ||\n documents.residencePermit.length ||\n documents.pinkDriverLicense.length\n ) {\n result.push({ code: ISOCode, documents: { ...documents } });\n }\n }\n }\n return result;\n }, [acceptedCountries, documentTemplates, loadingTemplates]);\n\n // Helper to check if a document type is available for a country\n function isDocumentTypeAvailable(\n countryCode: string,\n documentType: keyof AcceptedCountry[\"documents\"],\n ) {\n if (countryCode === 'INT' || countryCode === 'EU') return true;\n const docTypeKey = (getDocTypeKey(documentType) ?? \"\").toLowerCase();\n return documentTemplates?.data?.some(\n (tpl: DocumentTemplate) =>\n tpl.countryCode === countryCode &&\n (tpl.name?.toLowerCase() || \"\").includes(docTypeKey),\n );\n }\n\n useEffect(() => {\n if (!documentTypeId) console.error(\"DocumentCheck: Missing documentTypeId\");\n console.debug(\"[DocumentCheck] node content:\", node);\n\n // Don't reset docStep if we're already on error page (step 6) due to exhausted retries\n if (docStep === 6) {\n return;\n }\n\n // En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1)\n if (node.nfcEnabled === true) {\n setDocStep(-1);\n return;\n }\n\n if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\n }, [documentTypeId, sessionId, isMobileCapture]);\n\n const handleCountrySelect = (countryId: string) => {\n console.debug(\n \"[DocumentCheck] handleCountrySelect - countryId:\",\n countryId,\n );\n setUserInput((prev) => ({ ...prev, countryCode: countryId.toUpperCase() }));\n setSelectedCountry(countryId.toUpperCase());\n setSelectedDocumentType(null);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n // Reset retry count to 0 (will be synced to session)\n setRetryCount(0);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(2);\n };\n\n const handlePhotoCapture = async (\n imageData: string,\n side: \"recto\" | \"verso\",\n ) => {\n try {\n // Convert data URL to Blob for processing\n const imageBlob = dataUrlToBlob(imageData);\n\n // Resize and optimize the image (only on mobile)\n const processedBlob = await resizeAfterCapture(imageBlob);\n\n // Convert back to data URL for storage and display\n const processedDataUrl = await blobToDataUrl(processedBlob);\n\n console.debug(`[DocumentCheck] Photo processed for ${side}`, {\n originalSize: imageBlob.size,\n processedSize: processedBlob.size,\n originalType: imageBlob.type,\n processedType: processedBlob.type,\n });\n\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n } catch (error) {\n console.error(\n `[DocumentCheck] Failed to process photo for ${side}:`,\n error,\n );\n // Fallback: use original image if processing fails\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n }\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n logPhotosValidated(sessionId);\n setFileUploaded({\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n });\n setDocStep(4);\n }\n };\n\n const handlePhotoConfirmedForVideo = () => {\n setVideoFlowPhase(\"video\");\n };\n\n const handleDocumentVideoComplete = (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n const analysisData =\n predictions && predictions.length > 0 ? predictions : null;\n if (analysisData) {\n setAnalysisData(analysisData);\n }\n if (errorCode) {\n setErrorCode(errorCode);\n }\n handleProcessingComplete(success, undefined, analysisData);\n };\n\n const handleDocumentTypeSelect = async (documentId: string) => {\n const documentLabel = t(`documentTypes.${documentId}`, documentId);\n logDocumentTypeSelected(sessionId, documentId, documentLabel);\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n const selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n const selectedCountryCode = selectedCountry.toUpperCase();\n const selectedDocumentInput = {\n countryCode: selectedCountryCode,\n identityDocumentType: documentId,\n identityDocumentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setUserInput((prev) => ({ ...prev, ...selectedDocumentInput }));\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n\n if (\n node.nfcEnabled === true &&\n !nfcSkipped &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId)\n ) {\n const nfcMode = normalizeNfcMode(node.nfcMode);\n try {\n await updateSessionUserInput(sessionId, {\n ...((session?.userInput as Record<string, unknown> | undefined) ?? {}),\n ...selectedDocumentInput,\n });\n } catch (error) {\n console.error(\"Failed to persist NFC document selection:\", error);\n setNfcPreparationError(\n t(\n \"nfc_scan.preparation_failed\",\n \"Impossible de préparer le scan NFC. Veuillez réessayer.\",\n ),\n );\n }\n setDocStep(nfcMode === \"nfcOrPhoto\" ? 3 : 7);\n return;\n }\n\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n logDocumentLoaded(sessionId, \"recto\");\n if (files.back) {\n logDocumentLoaded(sessionId, \"verso\");\n }\n logDocumentsValidated(sessionId);\n\n setFileUploaded(files);\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setDocStep(6);\n } else {\n // Proceed to processing\n setDocStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n _retryCount?: number,\n apiAnalysisData?: Prediction[] | null,\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n\n // Extract and store the error code\n if (apiAnalysisData.length > 0) {\n const code = apiAnalysisData[0].code;\n setErrorCode(code);\n }\n }\n\n if (success) {\n const shouldRunNfcAfterApi =\n node.nfcEnabled === true &&\n !nfcSkipped &&\n normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\" &&\n !!selectedDocumentType?.id &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);\n\n if (shouldRunNfcAfterApi) {\n setDocStep(7);\n return;\n }\n\n // Increment currentStep in database immediately after successful analysis\n // This prevents double analysis if the user refreshes the page\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(5);\n } else {\n // Increment retry count both in state and session\n setRetryCount((prev) => {\n const newCount = prev + 1;\n // Update session asynchronously\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setDocStep(6);\n }\n };\n\n const handleRetryFromError = () => {\n // Note: retry count is already incremented in handleProcessingComplete\n // This function just handles navigation\n // Pour l'erreur 2.5 (face manquante), on conserve fileUploaded pour pré-remplir\n // l'upload avec la face déjà déposée. Pour les autres erreurs, on repart de zéro.\n if (errorCode !== \"2.5\") {\n setFileUploaded(null);\n }\n // Always stay on the current node and go back to upload step.\n // Never navigate to a different global step: if this node was reached via a\n // condition branch (e.g. \"true\"), navigating away would land on the other\n // branch (\"false\"). The retry means \"re-submit on THIS node\", not \"go back\n // in the journey\".\n setDocStep(3);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n console.log(\"isRetryAllowed - Props:\", {\n allowResubmission: node.allowResubmission,\n maxResubmissionAttempts: node.maxResubmissionAttempts,\n retryCount,\n });\n // Specimen documents (code 8.x) block retry — user can only continue anyway\n if (errorCode?.startsWith(\"8\")) {\n return false;\n }\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n // Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.\n // On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :\n // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC\n // - nfcOnly → on saute le nœud (nœud suivant)\n const handleNfcFallback = async (\n reason: string,\n label: string,\n comment?: string,\n ) => {\n setNfcSkipped(true);\n try {\n await skipNfcWithReason(sessionId, { reason, label, comment });\n } catch (error) {\n console.error(\"Failed to persist NFC fallback reason:\", error);\n }\n\n const nfcMode = normalizeNfcMode(node.nfcMode);\n if (nfcMode === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n return;\n }\n\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n\n // Le questionnaire de fallback (-2) revient au gate (-1)\n if (docStep === -2) {\n setDocStep(-1);\n return;\n }\n\n // En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)\n if (\n node.nfcEnabled === true &&\n docStep === (hasIntroduction ? 0 : 1)\n ) {\n setDocStep(-1);\n return;\n }\n\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\n case -1: {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n return (\n <NfcChipGate\n onConfirm={() => setDocStep(hasIntroduction ? 0 : 1)}\n // Pas de puce → questionnaire de fallback pour recueillir la raison\n onNoChip={() => setDocStep(-2)}\n />\n );\n }\n case -2:\n return <NfcFallbackSurvey onSubmit={handleNfcFallback} />;\n case 0:\n if (!documentTypeId) {\n console.error(\"DocumentCheck: Missing documentTypeId in step 0\");\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\n \"document_check.config_error.title\",\n \"Erreur de configuration\",\n )}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.config_error.description\",\n \"Type de document non spécifié.\",\n )}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() =>\n stepObject.setStep(Math.max(0, stepObject.step - 1))\n }\n >\n {t(\"document_check.config_error.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n );\n }\n return (\n <JDIPreIntroduction\n documentTypeId={documentTypeId}\n onContinue={() => setDocStep(1)}\n onBack={handleBack}\n introTitleText={\n node.introductionPage?.title || t(\"jdi.pre_introduction.title\")\n }\n introDescText={\n node.introductionPage?.description ||\n t(\"jdi.pre_introduction.description\")\n }\n />\n );\n case 1:\n return (\n <JDICountrySelection\n onCountrySelect={handleCountrySelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n acceptedCountries={finalAcceptedCountries}\n countryIntroText={\n node.countrySelection?.title || t(\"jdi.country_selection.title\")\n }\n countryDescText={\n node.countrySelection?.description ||\n t(\"jdi.country_selection.description\")\n }\n />\n );\n case 2:\n return (\n <JDIDocumentSelection\n onDocumentSelect={handleDocumentTypeSelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n sessionId={sessionId}\n chosenCountry={\n finalAcceptedCountries?.find((c) => c.code === selectedCountry) ||\n undefined\n }\n documentSelectionTitle={\n node.documentSelection?.title || t(\"jdi.document_selection.title\")\n }\n documentSelectionDescription={\n // En NFC, on laisse JDIDocumentSelection choisir le wording adapté\n // (subtitle_identity_nfc) plutôt que l'override \"téléverser\" du nœud.\n node.nfcEnabled === true\n ? undefined\n : node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\n nfcEnabled={node.nfcEnabled === true}\n />\n );\n case 3:\n if (!selectedDocumentType) {\n console.error(\n \"DocumentCheck: selectedDocumentType is null for step 3!\",\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.selection_error.title\", \"Erreur de sélection\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.selection_error.description\",\n \"Aucun type de document sélectionné. Veuillez revenir à l'étape précédente.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(2)}\n >\n {t(\n \"document_check.selection_error.back\",\n \"Retour à la sélection\",\n )}\n </ButtonDesktop>\n </div>\n );\n }\n\n if (isPictureAllowed && isDownloadAllowed && !selectedMethod) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={handleBack}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"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 {t(\n \"document_check.method_selection.title\",\n \"Choisissez une méthode\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\n \"document_check.method_selection.subtitle\",\n \"Comment souhaitez-vous ajouter votre document ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"grid gap-4\">\n <button\n onClick={() => { setSelectedMethod(\"picture\"); logCaptureModeSelected(sessionId, \"picture\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Camera size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.picture_title\",\n \"Prendre une photo\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.picture_desc\",\n \"Utilisez l'appareil photo de votre appareil\",\n )}\n </p>\n </div>\n </button>\n\n <button\n onClick={() => { setSelectedMethod(\"download\"); logCaptureModeSelected(sessionId, \"upload\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Upload size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.download_title\",\n \"Téléverser un fichier\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.download_desc\",\n \"Sélectionnez un fichier sur votre appareil\",\n )}\n </p>\n </div>\n </button>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n }\n\n const activeMethod =\n selectedMethod ||\n (isPictureAllowed && isMobileCapture ? \"picture\" : \"download\");\n\n if (activeMethod === \"picture\" && isPictureAllowed) {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n const onConfirm = node.withVideo\n ? handlePhotoConfirmedForVideo\n : handlePhotoConfirmation;\n\n if (node.withVideo && videoFlowPhase === \"video\") {\n return (\n <DocumentVideoCapture\n selectedDocumentType={selectedDocumentType}\n onComplete={handleDocumentVideoComplete}\n onBack={() => {\n setVideoFlowPhase(\"photo\");\n setCurrentPhotoStep(\"confirmation\");\n }}\n nodeId={node.id}\n sessionId={sessionId}\n previewOverrides={{\n recto: capturedImages.recto,\n verso: capturedImages.verso,\n }}\n />\n );\n }\n\n if (currentPhotoStep === \"before-recto\") {\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n if (currentPhotoStep === \"recto\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"recto\")}\n />\n );\n }\n if (currentPhotoStep === \"before-verso\") {\n return (\n <BeforeVersoPhoto setStep={() => setCurrentPhotoStep(\"verso\")} />\n );\n }\n if (currentPhotoStep === \"verso\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"verso\")}\n />\n );\n }\n if (currentPhotoStep === \"confirmation\") {\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto || \"\"}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={!!capturedImages.verso}\n onConfirm={onConfirm}\n onRetry={() => setCurrentPhotoStep(\"before-recto\")}\n onRetryAfterProcessing={() => setCurrentPhotoStep(\"before-recto\")}\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n }\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n } else {\n return (\n <JDIDocumentUpload\n documentType={selectedDocumentType?.id || documentTypeId}\n documentTypeId={documentTypeId}\n documentLabel={selectedDocumentType?.label}\n onUpload={handleDocumentUpload}\n onBack={() => {\n if (isPictureAllowed && isDownloadAllowed) {\n setSelectedMethod(null);\n } else {\n setDocStep(2);\n }\n }}\n initialFront={errorCode === \"2.5\" ? fileUploaded?.front : null}\n initialBack={errorCode === \"2.5\" ? fileUploaded?.back : null}\n sessionId={sessionId}\n />\n );\n }\n case 4:\n return (\n <JDIProcessing\n documentType={selectedDocumentType?.id || documentTypeId}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={documentTypeId}\n retryCount={retryCount}\n documentTemplateId={selectedDocumentType?.documentTemplateId}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <JDISuccess\n documentType={selectedDocumentType?.id || documentTypeId}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n />\n );\n case 6:\n return (\n <JDIError\n documentType={selectedDocumentType?.id || documentTypeId}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n case 7:\n if (nfcPreparationError) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={() => setDocStep(2)}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"nfc_scan.preparation_error_title\", \"Erreur de préparation NFC\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{nfcPreparationError}</p>\n </div>\n </MobilePageLayout>\n );\n }\n return (\n <NfcScanStep\n sessionId={sessionId}\n nodeId={node.id}\n stepObject={stepObject}\n template={template}\n onBack={() => {\n // Retour vers la sélection du document (corriger un mauvais choix). Le démontage de\n // NfcScanStep ferme le SSE via le cleanup du hook (pas d'appel backend nécessaire).\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n hasRestoredNfcStep.current = true; // ne pas re-restaurer l'étape QR après ce retour\n setDocStep(hasIntroduction ? 0 : 1);\n }}\n />\n );\n default:\n console.error(`Invalid docStep: ${docStep}`);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.navigation_error.description\",\n \"Étape non valide. Veuillez recommencer.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(0)}\n >\n {t(\"document_check.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCheck;\n"],"names":["useI18n","getSession","useState","useEffect","__awaiter","getAllDocumentTemplates","getNodeRetryCount","useRef","useDocumentContext","useMemo","EUROPEAN_COUNTRY_CODES","__assign","ISO_COUNTRY_CODES","getDocTypeKey","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","logPhotoCaptured","logPhotosValidated","logDocumentTypeSelected","getDocumentTemplateId","updateSessionUserInput","logDocumentLoaded","logDocumentsValidated","incrementNodeRetryCount","skipNfcWithReason","_jsx","NfcChipGate","NfcFallbackSurvey","_jsxs","ButtonDesktop","JDIPreIntroduction","JDICountrySelection","JDIDocumentSelection","MobilePageLayout","Title","Subtitle","logCaptureModeSelected","Camera","Upload","DocumentVideoCapture","BeforePhoto","Photo","BeforeVersoPhoto","PhotoConfirmation","JDIDocumentUpload","JDIProcessing","JDISuccess","JDIError","NfcScanStep"],"mappings":"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"}
|
|
@@ -35,7 +35,19 @@ function useNfcSseStatus(_a) {
|
|
|
35
35
|
source.onerror = function () {
|
|
36
36
|
// EventSource reconnecte automatiquement — pas d'action requise
|
|
37
37
|
};
|
|
38
|
+
// Fermer le flux quand l'onglet/app se ferme ou passe en arrière-plan, sinon le SSE reste
|
|
39
|
+
// ouvert côté serveur (heartbeat + listener qui fuient). `pagehide` couvre la fermeture
|
|
40
|
+
// (plus fiable que `beforeunload` sur mobile) ; `visibilitychange` couvre le passage en fond.
|
|
41
|
+
var closeSource = function () { return source.close(); };
|
|
42
|
+
var closeOnHide = function () {
|
|
43
|
+
if (document.visibilityState === "hidden")
|
|
44
|
+
source.close();
|
|
45
|
+
};
|
|
46
|
+
window.addEventListener("pagehide", closeSource);
|
|
47
|
+
document.addEventListener("visibilitychange", closeOnHide);
|
|
38
48
|
return function () {
|
|
49
|
+
window.removeEventListener("pagehide", closeSource);
|
|
50
|
+
document.removeEventListener("visibilitychange", closeOnHide);
|
|
39
51
|
source.close();
|
|
40
52
|
};
|
|
41
53
|
}, [sessionId, apiBaseUrl]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNfcSseStatus.js","sources":["../../../../src/hooks/useNfcSseStatus.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nexport type NfcStatus = \"pending\" | \"opened\" | \"success\" | \"completed\" | \"failed\";\n\nconst SUCCESS_DISPLAY_DURATION_MS = 2500;\n\ninterface UseNfcSseStatusOptions {\n sessionId: string;\n apiBaseUrl: string;\n onCompleted: () => void;\n}\n\nexport function useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted,\n}: UseNfcSseStatusOptions) {\n const [status, setStatus] = useState<NfcStatus>(\"pending\");\n const onCompletedRef = useRef(onCompleted);\n onCompletedRef.current = onCompleted;\n\n useEffect(() => {\n if (!sessionId || !apiBaseUrl) return;\n\n const url = `${apiBaseUrl}/session/sdk/${sessionId}/nfc-status`;\n const source = new EventSource(url);\n\n source.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data) as { status: NfcStatus };\n if (data.status === \"completed\") {\n source.close();\n setStatus(\"success\");\n setTimeout(() => {\n setStatus(\"completed\");\n onCompletedRef.current();\n }, SUCCESS_DISPLAY_DURATION_MS);\n } else {\n setStatus(data.status);\n }\n } catch {\n // message malformé, on ignore\n }\n };\n\n source.onerror = () => {\n // EventSource reconnecte automatiquement — pas d'action requise\n };\n\n return () => {\n source.close();\n };\n }, [sessionId, apiBaseUrl]);\n\n return { status };\n}\n"],"names":["useState","useRef","useEffect"],"mappings":";;;;AAIA,IAAM,2BAA2B,GAAG,IAAI;AAQlC,SAAU,eAAe,CAAC,EAIP,EAAA;AAHvB,IAAA,IAAA,SAAS,eAAA,EACT,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,WAAW,GAAA,EAAA,CAAA,WAAA;IAEL,IAAA,EAAA,GAAsBA,cAAQ,CAAY,SAAS,CAAC,EAAnD,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAAkC;AAC1D,IAAA,IAAM,cAAc,GAAGC,YAAM,CAAC,WAAW,CAAC;AAC1C,IAAA,cAAc,CAAC,OAAO,GAAG,WAAW;AAEpC,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;YAAE;AAE/B,QAAA,IAAM,GAAG,GAAG,EAAA,CAAA,MAAA,CAAG,UAAU,EAAA,eAAA,CAAA,CAAA,MAAA,CAAgB,SAAS,gBAAa;AAC/D,QAAA,IAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC;AAEnC,QAAA,MAAM,CAAC,SAAS,GAAG,UAAC,KAAK,EAAA;AACvB,YAAA,IAAI;gBACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAA0B;AAC5D,gBAAA,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;oBAC/B,MAAM,CAAC,KAAK,EAAE;oBACd,SAAS,CAAC,SAAS,CAAC;AACpB,oBAAA,UAAU,CAAC,YAAA;wBACT,SAAS,CAAC,WAAW,CAAC;wBACtB,cAAc,CAAC,OAAO,EAAE;oBAC1B,CAAC,EAAE,2BAA2B,CAAC;gBACjC;qBAAO;AACL,oBAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxB;YACF;AAAE,YAAA,OAAA,EAAA,EAAM;;YAER;AACF,QAAA,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,YAAA;;AAEjB,QAAA,CAAC;
|
|
1
|
+
{"version":3,"file":"useNfcSseStatus.js","sources":["../../../../src/hooks/useNfcSseStatus.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\n\nexport type NfcStatus = \"pending\" | \"opened\" | \"success\" | \"completed\" | \"failed\";\n\nconst SUCCESS_DISPLAY_DURATION_MS = 2500;\n\ninterface UseNfcSseStatusOptions {\n sessionId: string;\n apiBaseUrl: string;\n onCompleted: () => void;\n}\n\nexport function useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted,\n}: UseNfcSseStatusOptions) {\n const [status, setStatus] = useState<NfcStatus>(\"pending\");\n const onCompletedRef = useRef(onCompleted);\n onCompletedRef.current = onCompleted;\n\n useEffect(() => {\n if (!sessionId || !apiBaseUrl) return;\n\n const url = `${apiBaseUrl}/session/sdk/${sessionId}/nfc-status`;\n const source = new EventSource(url);\n\n source.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data) as { status: NfcStatus };\n if (data.status === \"completed\") {\n source.close();\n setStatus(\"success\");\n setTimeout(() => {\n setStatus(\"completed\");\n onCompletedRef.current();\n }, SUCCESS_DISPLAY_DURATION_MS);\n } else {\n setStatus(data.status);\n }\n } catch {\n // message malformé, on ignore\n }\n };\n\n source.onerror = () => {\n // EventSource reconnecte automatiquement — pas d'action requise\n };\n\n // Fermer le flux quand l'onglet/app se ferme ou passe en arrière-plan, sinon le SSE reste\n // ouvert côté serveur (heartbeat + listener qui fuient). `pagehide` couvre la fermeture\n // (plus fiable que `beforeunload` sur mobile) ; `visibilitychange` couvre le passage en fond.\n const closeSource = () => source.close();\n const closeOnHide = () => {\n if (document.visibilityState === \"hidden\") source.close();\n };\n window.addEventListener(\"pagehide\", closeSource);\n document.addEventListener(\"visibilitychange\", closeOnHide);\n\n return () => {\n window.removeEventListener(\"pagehide\", closeSource);\n document.removeEventListener(\"visibilitychange\", closeOnHide);\n source.close();\n };\n }, [sessionId, apiBaseUrl]);\n\n return { status };\n}\n"],"names":["useState","useRef","useEffect"],"mappings":";;;;AAIA,IAAM,2BAA2B,GAAG,IAAI;AAQlC,SAAU,eAAe,CAAC,EAIP,EAAA;AAHvB,IAAA,IAAA,SAAS,eAAA,EACT,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,WAAW,GAAA,EAAA,CAAA,WAAA;IAEL,IAAA,EAAA,GAAsBA,cAAQ,CAAY,SAAS,CAAC,EAAnD,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAAkC;AAC1D,IAAA,IAAM,cAAc,GAAGC,YAAM,CAAC,WAAW,CAAC;AAC1C,IAAA,cAAc,CAAC,OAAO,GAAG,WAAW;AAEpC,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;YAAE;AAE/B,QAAA,IAAM,GAAG,GAAG,EAAA,CAAA,MAAA,CAAG,UAAU,EAAA,eAAA,CAAA,CAAA,MAAA,CAAgB,SAAS,gBAAa;AAC/D,QAAA,IAAM,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC;AAEnC,QAAA,MAAM,CAAC,SAAS,GAAG,UAAC,KAAK,EAAA;AACvB,YAAA,IAAI;gBACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAA0B;AAC5D,gBAAA,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE;oBAC/B,MAAM,CAAC,KAAK,EAAE;oBACd,SAAS,CAAC,SAAS,CAAC;AACpB,oBAAA,UAAU,CAAC,YAAA;wBACT,SAAS,CAAC,WAAW,CAAC;wBACtB,cAAc,CAAC,OAAO,EAAE;oBAC1B,CAAC,EAAE,2BAA2B,CAAC;gBACjC;qBAAO;AACL,oBAAA,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;gBACxB;YACF;AAAE,YAAA,OAAA,EAAA,EAAM;;YAER;AACF,QAAA,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,YAAA;;AAEjB,QAAA,CAAC;;;;QAKD,IAAM,WAAW,GAAG,YAAA,EAAM,OAAA,MAAM,CAAC,KAAK,EAAE,CAAA,CAAd,CAAc;AACxC,QAAA,IAAM,WAAW,GAAG,YAAA;AAClB,YAAA,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ;gBAAE,MAAM,CAAC,KAAK,EAAE;AAC3D,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,WAAW,CAAC;AAChD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,WAAW,CAAC;QAE1D,OAAO,YAAA;AACL,YAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC;AACnD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,WAAW,CAAC;YAC7D,MAAM,CAAC,KAAK,EAAE;AAChB,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAE3B,IAAA,OAAO,EAAE,MAAM,EAAA,MAAA,EAAE;AACnB;;;;"}
|