datakeen-session-react 1.1.140-dev.90 → 1.1.140-dev.92
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/DatakeenSession.js +32 -23
- package/dist/cjs/components/DatakeenSession.js.map +1 -1
- package/dist/cjs/components/jdi/JDIDocumentSelection.js +9 -6
- package/dist/cjs/components/jdi/JDIDocumentSelection.js.map +1 -1
- package/dist/cjs/components/nfc-scan/BiometricSymbol.js +22 -0
- package/dist/cjs/components/nfc-scan/BiometricSymbol.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcChipGate.js +36 -0
- package/dist/cjs/components/nfc-scan/NfcChipGate.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js +70 -0
- package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js +44 -0
- package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcScanNode.js +2 -2
- package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/cjs/components/nfc-scan/PuceCniSymbol.js +22 -0
- package/dist/cjs/components/nfc-scan/PuceCniSymbol.js.map +1 -0
- package/dist/cjs/components/session/DocumentCheck.js +123 -35
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +37 -4
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +37 -4
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/services/sessionService.js +19 -0
- package/dist/cjs/services/sessionService.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/esm/components/DatakeenSession.js +32 -23
- package/dist/esm/components/DatakeenSession.js.map +1 -1
- package/dist/esm/components/jdi/JDIDocumentSelection.js +9 -6
- package/dist/esm/components/jdi/JDIDocumentSelection.js.map +1 -1
- package/dist/esm/components/nfc-scan/BiometricSymbol.js +18 -0
- package/dist/esm/components/nfc-scan/BiometricSymbol.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcChipGate.js +32 -0
- package/dist/esm/components/nfc-scan/NfcChipGate.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js +66 -0
- package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js +40 -0
- package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcScanNode.js +2 -2
- package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/esm/components/nfc-scan/PuceCniSymbol.js +18 -0
- package/dist/esm/components/nfc-scan/PuceCniSymbol.js.map +1 -0
- package/dist/esm/components/session/DocumentCheck.js +124 -36
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/i18n/en.json.js +37 -4
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +37 -4
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/services/sessionService.js +19 -1
- package/dist/esm/services/sessionService.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/package.json +1 -1
|
@@ -34,7 +34,7 @@ var NfcScanStep = function (_a) {
|
|
|
34
34
|
}).status;
|
|
35
35
|
var title = pageTitle || t("nfc_scan.page_title", "Scan NFC de votre document");
|
|
36
36
|
var subtitle = pageDescription ||
|
|
37
|
-
t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre
|
|
37
|
+
t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.");
|
|
38
38
|
useEffect(function () {
|
|
39
39
|
if (status !== "pending")
|
|
40
40
|
return;
|
|
@@ -78,7 +78,7 @@ var NfcScanStep = function (_a) {
|
|
|
78
78
|
}); };
|
|
79
79
|
generate();
|
|
80
80
|
}, [nfcUrl, status, t]);
|
|
81
|
-
return (jsx(MobilePageLayout, { footer: null, children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4 mt-16 md:mt-20", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsx(Subtitle, { className: "text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line", children: subtitle })] }), jsx("div", { className: "flex-1 flex justify-center items-center", children: status === "success" ? (jsx(NfcSuccessAnimation, {})) : status === "completed" ? (jsxs("div", { className: "flex flex-col items-center gap-4 p-8", children: [jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsx("p", { className: "text-sm text-gray-600", children: t("nfc_scan.verifying", "Vérification en cours…") })] })) : status === "opened" ? (jsxs("div", { className: "w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm", children: [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: 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: jsx("path", { d: "M20 6 9 17l-5-5" }) }) }), jsx("p", { className: "text-base font-semibold text-gray-900", children: t("nfc_scan.qr_opened_title", "QR code scanné") }), 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
|
|
81
|
+
return (jsx(MobilePageLayout, { footer: null, children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4 mt-16 md:mt-20", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsx(Subtitle, { className: "text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line", children: subtitle })] }), jsx("div", { className: "flex-1 flex justify-center items-center", children: status === "success" ? (jsx(NfcSuccessAnimation, {})) : status === "completed" ? (jsxs("div", { className: "flex flex-col items-center gap-4 p-8", children: [jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsx("p", { className: "text-sm text-gray-600", children: t("nfc_scan.verifying", "Vérification en cours…") })] })) : status === "opened" ? (jsxs("div", { className: "w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm", children: [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: 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: jsx("path", { d: "M20 6 9 17l-5-5" }) }) }), jsx("p", { className: "text-base font-semibold text-gray-900", children: t("nfc_scan.qr_opened_title", "QR code scanné") }), 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.") }), jsxs("div", { className: "mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700", children: [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 ? (jsx("div", { className: "text-red-500 text-center p-4", children: qrError })) : (jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", children: jsx("canvas", { ref: canvasRef }) })) })] }) }) }));
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
export { NfcScanStep as default };
|
|
@@ -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 iPhone pour lire la puce NFC 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 l'iPhone. Continuez le scan sur le 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":["_jsx","_jsxs"],"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 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":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Pictogramme de la puce de contact d'une carte d'identité (contacts dorés type
|
|
5
|
+
* carte bancaire), repris de assets/puce-cni.svg mais teinté avec la couleur
|
|
6
|
+
* primaire du SDK (var(--uni-primary-color)) pour rester aligné sur l'identité
|
|
7
|
+
* visuelle, en cohérence avec BiometricSymbol.
|
|
8
|
+
*
|
|
9
|
+
* Affiché à côté du symbole biométrique pour aider l'utilisateur à reconnaître la
|
|
10
|
+
* puce sur sa carte d'identité.
|
|
11
|
+
*/
|
|
12
|
+
var PuceCniSymbol = function (_a) {
|
|
13
|
+
var className = _a.className;
|
|
14
|
+
return (jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 200 125", className: className, role: "img", "aria-label": "Puce d'une carte d'identit\u00E9", fill: "none", stroke: "var(--uni-primary-color, #11e5c5)", strokeWidth: "4", children: [jsx("rect", { x: "10", y: "10", width: "180", height: "105", rx: "10", ry: "10" }), jsxs("g", { transform: "translate(30, 45)", children: [jsx("rect", { width: "35", height: "30", rx: "4", ry: "4", fill: "var(--uni-primary-color, #11e5c5)", fillOpacity: "0.12", strokeWidth: "2.5" }), jsx("path", { d: "M0 10h35M0 20h35M12 0v30M23 0v30", strokeWidth: "1", strokeOpacity: "0.6" })] })] }));
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { PuceCniSymbol as default };
|
|
18
|
+
//# sourceMappingURL=PuceCniSymbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PuceCniSymbol.js","sources":["../../../../../src/components/nfc-scan/PuceCniSymbol.tsx"],"sourcesContent":["interface PuceCniSymbolProps {\n className?: string;\n}\n\n/**\n * Pictogramme de la puce de contact d'une carte d'identité (contacts dorés type\n * carte bancaire), repris de assets/puce-cni.svg mais teinté avec la couleur\n * primaire du SDK (var(--uni-primary-color)) pour rester aligné sur l'identité\n * visuelle, en cohérence avec BiometricSymbol.\n *\n * Affiché à côté du symbole biométrique pour aider l'utilisateur à reconnaître la\n * puce sur sa carte d'identité.\n */\nconst PuceCniSymbol = ({ className }: PuceCniSymbolProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 125\"\n className={className}\n role=\"img\"\n aria-label=\"Puce d'une carte d'identité\"\n fill=\"none\"\n stroke=\"var(--uni-primary-color, #11e5c5)\"\n strokeWidth=\"4\"\n >\n <rect x=\"10\" y=\"10\" width=\"180\" height=\"105\" rx=\"10\" ry=\"10\" />\n\n <g transform=\"translate(30, 45)\">\n <rect\n width=\"35\"\n height=\"30\"\n rx=\"4\"\n ry=\"4\"\n fill=\"var(--uni-primary-color, #11e5c5)\"\n fillOpacity=\"0.12\"\n strokeWidth=\"2.5\"\n />\n <path\n d=\"M0 10h35M0 20h35M12 0v30M23 0v30\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.6\"\n />\n </g>\n </svg>\n );\n};\n\nexport default PuceCniSymbol;\n"],"names":["_jsxs","_jsx"],"mappings":";;AAIA;;;;;;;;AAQG;AACH,IAAM,aAAa,GAAG,UAAC,EAAiC,EAAA;AAA/B,IAAA,IAAA,SAAS,GAAA,EAAA,CAAA,SAAA;IAChC,QACEA,IAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,aAAa,EACrB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,KAAK,EAAA,YAAA,EACC,kCAA6B,EACxC,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,mCAAmC,EAC1C,WAAW,EAAC,GAAG,EAAA,QAAA,EAAA,CAEfC,GAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAA,CAAG,EAE/DD,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,CAC9BC,GAAA,CAAA,MAAA,EAAA,EACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,EAAE,EAAC,GAAG,EACN,EAAE,EAAC,GAAG,EACN,IAAI,EAAC,mCAAmC,EACxC,WAAW,EAAC,MAAM,EAClB,WAAW,EAAC,KAAK,EAAA,CACjB,EACFA,GAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,kCAAkC,EACpC,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,KAAK,EAAA,CACnB,CAAA,EAAA,CACA,CAAA,EAAA,CACA;AAEV;;;;"}
|
|
@@ -26,8 +26,10 @@ import { getAllDocumentTemplates, getDocumentTemplateId, getDocTypeKey } from '.
|
|
|
26
26
|
import { blobToDataUrl, dataUrlToBlob, resizeAfterCapture } from '../../utils/imageProcessing.js';
|
|
27
27
|
import { getNodeRetryCount, incrementNodeRetryCount } from '../../services/retryService.js';
|
|
28
28
|
import { getSession } from '../../context/SessionContext.js';
|
|
29
|
-
import { updateSessionUserInput } from '../../services/sessionService.js';
|
|
29
|
+
import { updateSessionUserInput, skipNfcWithReason } from '../../services/sessionService.js';
|
|
30
30
|
import NfcScanStep from '../nfc-scan/NfcScanNode.js';
|
|
31
|
+
import NfcChipGate from '../nfc-scan/NfcChipGate.js';
|
|
32
|
+
import NfcFallbackSurvey from '../nfc-scan/NfcFallbackSurvey.js';
|
|
31
33
|
import { EUROPEAN_COUNTRY_CODES } from '../../utils/europeanCountries.js';
|
|
32
34
|
|
|
33
35
|
var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
|
|
@@ -35,6 +37,14 @@ var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
|
|
|
35
37
|
"idCard",
|
|
36
38
|
"residencePermit",
|
|
37
39
|
]);
|
|
40
|
+
/**
|
|
41
|
+
* Normalise le mode NFC vers les valeurs courantes.
|
|
42
|
+
* Rétrocompat : les parcours enregistrés avant le renommage portent encore
|
|
43
|
+
* `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).
|
|
44
|
+
*/
|
|
45
|
+
var normalizeNfcMode = function (mode) {
|
|
46
|
+
return mode === "nfcAndApi" || mode === "nfcOrPhoto" ? "nfcOrPhoto" : "nfcOnly";
|
|
47
|
+
};
|
|
38
48
|
/**
|
|
39
49
|
* DocumentCheck component manages the multi-step document verification flow for a session.
|
|
40
50
|
* It handles country and document type selection, document upload or photo capture, processing, and error/success handling.
|
|
@@ -60,12 +70,12 @@ var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
|
|
|
60
70
|
* - Uses hooks for translation, retry navigation, and context management.
|
|
61
71
|
*/
|
|
62
72
|
var DocumentCheck = function (_a) {
|
|
63
|
-
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
64
|
-
var stepObject = _a.stepObject, sessionId = _a.sessionId, node = _a.node; _a.onContinueOnPC; var documentTypeId = _a.documentTypeId, acceptedCountries = _a.acceptedCountries,
|
|
73
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
74
|
+
var stepObject = _a.stepObject, sessionId = _a.sessionId, node = _a.node; _a.onContinueOnPC; var documentTypeId = _a.documentTypeId, acceptedCountries = _a.acceptedCountries, _p = _a.isMobileCapture, isMobileCapture = _p === void 0 ? false : _p, allowedAddingMethods = _a.allowedAddingMethods, template = _a.template, setUserInput = _a.setUserInput;
|
|
65
75
|
var t = useI18n().t;
|
|
66
76
|
var session = getSession().session;
|
|
67
|
-
var
|
|
68
|
-
var
|
|
77
|
+
var _q = useState(), documentTemplates = _q[0], setDocumentTemplates = _q[1];
|
|
78
|
+
var _r = useState(true), loadingTemplates = _r[0], setLoadingTemplates = _r[1];
|
|
69
79
|
useEffect(function () {
|
|
70
80
|
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
71
81
|
var templates;
|
|
@@ -84,7 +94,7 @@ var DocumentCheck = function (_a) {
|
|
|
84
94
|
}); })();
|
|
85
95
|
}, []);
|
|
86
96
|
var initialRetryCount = getNodeRetryCount(session, node.id);
|
|
87
|
-
var
|
|
97
|
+
var _s = useState(null), selectedMethod = _s[0], setSelectedMethod = _s[1];
|
|
88
98
|
var isPictureAllowed = (_b = allowedAddingMethods === null || allowedAddingMethods === void 0 ? void 0 : allowedAddingMethods.includes("picture")) !== null && _b !== void 0 ? _b : true;
|
|
89
99
|
var isDownloadAllowed = (_c = allowedAddingMethods === null || allowedAddingMethods === void 0 ? void 0 : allowedAddingMethods.includes("download")) !== null && _c !== void 0 ? _c : true;
|
|
90
100
|
// Check if retry is allowed based on initial retry count
|
|
@@ -103,21 +113,24 @@ var DocumentCheck = function (_a) {
|
|
|
103
113
|
return true;
|
|
104
114
|
};
|
|
105
115
|
// Initialize docStep - if retries exhausted, start at error page (step 6)
|
|
106
|
-
var
|
|
116
|
+
var _t = useState(function () {
|
|
107
117
|
if (initialRetryCount > 0 && !isInitialRetryAllowed()) {
|
|
108
118
|
return 6; // Error page
|
|
109
119
|
}
|
|
110
120
|
return 0; // Normal flow - start with introduction
|
|
111
|
-
}), docStep =
|
|
112
|
-
var
|
|
113
|
-
var
|
|
114
|
-
var
|
|
115
|
-
var
|
|
116
|
-
var
|
|
121
|
+
}), docStep = _t[0], setDocStep = _t[1];
|
|
122
|
+
var _u = useState(((_e = (_d = acceptedCountries === null || acceptedCountries === void 0 ? void 0 : acceptedCountries[0]) === null || _d === void 0 ? void 0 : _d.code) === null || _e === void 0 ? void 0 : _e.toUpperCase()) || "FR"), selectedCountry = _u[0], setSelectedCountry = _u[1];
|
|
123
|
+
var _v = useState(null), fileUploaded = _v[0], setFileUploaded = _v[1];
|
|
124
|
+
var _w = useState(null), analysisData = _w[0], setAnalysisData = _w[1];
|
|
125
|
+
var _x = useState(null), errorCode = _x[0], setErrorCode = _x[1];
|
|
126
|
+
var _y = useState(null), nfcPreparationError = _y[0], setNfcPreparationError = _y[1];
|
|
127
|
+
// Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),
|
|
128
|
+
// on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).
|
|
129
|
+
var _z = useState(false), nfcSkipped = _z[0], setNfcSkipped = _z[1];
|
|
117
130
|
// Initialize retry count from session data
|
|
118
|
-
var
|
|
131
|
+
var _0 = useState(function () {
|
|
119
132
|
return getNodeRetryCount(session, node.id);
|
|
120
|
-
}), retryCount =
|
|
133
|
+
}), retryCount = _0[0], setRetryCount = _0[1];
|
|
121
134
|
// Update retry count when session loads/changes
|
|
122
135
|
useEffect(function () {
|
|
123
136
|
if (session) {
|
|
@@ -157,10 +170,10 @@ var DocumentCheck = function (_a) {
|
|
|
157
170
|
setDocStep(6);
|
|
158
171
|
}
|
|
159
172
|
}, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);
|
|
160
|
-
var
|
|
161
|
-
var
|
|
162
|
-
var
|
|
163
|
-
var
|
|
173
|
+
var _1 = useState({}), capturedImages = _1[0], setCapturedImages = _1[1];
|
|
174
|
+
var _2 = useState("before-recto"), currentPhotoStep = _2[0], setCurrentPhotoStep = _2[1];
|
|
175
|
+
var _3 = useState("photo"), videoFlowPhase = _3[0], setVideoFlowPhase = _3[1];
|
|
176
|
+
var _4 = useDocumentContext(), selectedDocumentType = _4.selectedDocumentType, setSelectedDocumentType = _4.setSelectedDocumentType;
|
|
164
177
|
var finalAcceptedCountries = useMemo(function () {
|
|
165
178
|
if (loadingTemplates)
|
|
166
179
|
return acceptedCountries;
|
|
@@ -240,6 +253,11 @@ var DocumentCheck = function (_a) {
|
|
|
240
253
|
if (docStep === 6) {
|
|
241
254
|
return;
|
|
242
255
|
}
|
|
256
|
+
// En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1)
|
|
257
|
+
if (node.nfcEnabled === true) {
|
|
258
|
+
setDocStep(-1);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
243
261
|
if (((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) === undefined &&
|
|
244
262
|
((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) === undefined) {
|
|
245
263
|
setDocStep(1);
|
|
@@ -344,9 +362,9 @@ var DocumentCheck = function (_a) {
|
|
|
344
362
|
};
|
|
345
363
|
var handleDocumentTypeSelect = function (documentId) { return __awaiter(void 0, void 0, void 0, function () {
|
|
346
364
|
var documentLabel, documentTemplateID, selectedDoc, selectedCountryCode, selectedDocumentInput, nfcMode, error_2;
|
|
347
|
-
var _a
|
|
348
|
-
return __generator(this, function (
|
|
349
|
-
switch (
|
|
365
|
+
var _a;
|
|
366
|
+
return __generator(this, function (_b) {
|
|
367
|
+
switch (_b.label) {
|
|
350
368
|
case 0:
|
|
351
369
|
documentLabel = t("documentTypes.".concat(documentId), documentId);
|
|
352
370
|
logDocumentTypeSelected(sessionId, documentId, documentLabel);
|
|
@@ -379,22 +397,24 @@ var DocumentCheck = function (_a) {
|
|
|
379
397
|
setCapturedImages({});
|
|
380
398
|
setCurrentPhotoStep("before-recto");
|
|
381
399
|
setVideoFlowPhase("photo");
|
|
382
|
-
if (!(node.nfcEnabled === true &&
|
|
383
|
-
|
|
384
|
-
|
|
400
|
+
if (!(node.nfcEnabled === true &&
|
|
401
|
+
!nfcSkipped &&
|
|
402
|
+
NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId))) return [3 /*break*/, 5];
|
|
403
|
+
nfcMode = normalizeNfcMode(node.nfcMode);
|
|
404
|
+
_b.label = 1;
|
|
385
405
|
case 1:
|
|
386
|
-
|
|
387
|
-
return [4 /*yield*/, updateSessionUserInput(sessionId, __assign(__assign({}, ((
|
|
406
|
+
_b.trys.push([1, 3, , 4]);
|
|
407
|
+
return [4 /*yield*/, updateSessionUserInput(sessionId, __assign(__assign({}, ((_a = session === null || session === void 0 ? void 0 : session.userInput) !== null && _a !== void 0 ? _a : {})), selectedDocumentInput))];
|
|
388
408
|
case 2:
|
|
389
|
-
|
|
409
|
+
_b.sent();
|
|
390
410
|
return [3 /*break*/, 4];
|
|
391
411
|
case 3:
|
|
392
|
-
error_2 =
|
|
412
|
+
error_2 = _b.sent();
|
|
393
413
|
console.error("Failed to persist NFC document selection:", error_2);
|
|
394
414
|
setNfcPreparationError(t("nfc_scan.preparation_failed", "Impossible de préparer le scan NFC. Veuillez réessayer."));
|
|
395
415
|
return [3 /*break*/, 4];
|
|
396
416
|
case 4:
|
|
397
|
-
setDocStep(nfcMode === "
|
|
417
|
+
setDocStep(nfcMode === "nfcOrPhoto" ? 3 : 7);
|
|
398
418
|
return [2 /*return*/];
|
|
399
419
|
case 5:
|
|
400
420
|
setDocStep(3);
|
|
@@ -420,7 +440,6 @@ var DocumentCheck = function (_a) {
|
|
|
420
440
|
}
|
|
421
441
|
};
|
|
422
442
|
var handleProcessingComplete = function (success, _retryCount, apiAnalysisData) {
|
|
423
|
-
var _a;
|
|
424
443
|
if (apiAnalysisData) {
|
|
425
444
|
setAnalysisData(apiAnalysisData);
|
|
426
445
|
// Extract and store the error code
|
|
@@ -431,7 +450,8 @@ var DocumentCheck = function (_a) {
|
|
|
431
450
|
}
|
|
432
451
|
if (success) {
|
|
433
452
|
var shouldRunNfcAfterApi = node.nfcEnabled === true &&
|
|
434
|
-
|
|
453
|
+
!nfcSkipped &&
|
|
454
|
+
normalizeNfcMode(node.nfcMode) === "nfcOrPhoto" &&
|
|
435
455
|
!!(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) &&
|
|
436
456
|
NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);
|
|
437
457
|
if (shouldRunNfcAfterApi) {
|
|
@@ -520,7 +540,61 @@ var DocumentCheck = function (_a) {
|
|
|
520
540
|
}
|
|
521
541
|
setDocStep(0);
|
|
522
542
|
};
|
|
543
|
+
// Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.
|
|
544
|
+
// On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :
|
|
545
|
+
// - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC
|
|
546
|
+
// - nfcOnly → on saute le nœud (nœud suivant)
|
|
547
|
+
var handleNfcFallback = function (reason, label, comment) { return __awaiter(void 0, void 0, void 0, function () {
|
|
548
|
+
var error_3, nfcMode, hasIntroduction;
|
|
549
|
+
var _a, _b;
|
|
550
|
+
return __generator(this, function (_c) {
|
|
551
|
+
switch (_c.label) {
|
|
552
|
+
case 0:
|
|
553
|
+
setNfcSkipped(true);
|
|
554
|
+
_c.label = 1;
|
|
555
|
+
case 1:
|
|
556
|
+
_c.trys.push([1, 3, , 4]);
|
|
557
|
+
return [4 /*yield*/, skipNfcWithReason(sessionId, { reason: reason, label: label, comment: comment })];
|
|
558
|
+
case 2:
|
|
559
|
+
_c.sent();
|
|
560
|
+
return [3 /*break*/, 4];
|
|
561
|
+
case 3:
|
|
562
|
+
error_3 = _c.sent();
|
|
563
|
+
console.error("Failed to persist NFC fallback reason:", error_3);
|
|
564
|
+
return [3 /*break*/, 4];
|
|
565
|
+
case 4:
|
|
566
|
+
nfcMode = normalizeNfcMode(node.nfcMode);
|
|
567
|
+
if (nfcMode === "nfcOrPhoto") {
|
|
568
|
+
hasIntroduction = ((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) !== undefined ||
|
|
569
|
+
((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) !== undefined;
|
|
570
|
+
setDocStep(hasIntroduction ? 0 : 1);
|
|
571
|
+
return [2 /*return*/];
|
|
572
|
+
}
|
|
573
|
+
if (template) {
|
|
574
|
+
stepObject.goToNextStep(node.id, template);
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
stepObject.setStep(stepObject.step + 1);
|
|
578
|
+
}
|
|
579
|
+
return [2 /*return*/];
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
}); };
|
|
523
583
|
var handleBack = function () {
|
|
584
|
+
var _a, _b;
|
|
585
|
+
var hasIntroduction = ((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) !== undefined ||
|
|
586
|
+
((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) !== undefined;
|
|
587
|
+
// Le questionnaire de fallback (-2) revient au gate (-1)
|
|
588
|
+
if (docStep === -2) {
|
|
589
|
+
setDocStep(-1);
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
// En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)
|
|
593
|
+
if (node.nfcEnabled === true &&
|
|
594
|
+
docStep === (hasIntroduction ? 0 : 1)) {
|
|
595
|
+
setDocStep(-1);
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
524
598
|
if (docStep === 0) {
|
|
525
599
|
stepObject.goBack();
|
|
526
600
|
}
|
|
@@ -529,6 +603,15 @@ var DocumentCheck = function (_a) {
|
|
|
529
603
|
}
|
|
530
604
|
};
|
|
531
605
|
switch (docStep) {
|
|
606
|
+
case -1: {
|
|
607
|
+
var hasIntroduction_1 = ((_f = node.introductionPage) === null || _f === void 0 ? void 0 : _f.title) !== undefined ||
|
|
608
|
+
((_g = node.introductionPage) === null || _g === void 0 ? void 0 : _g.description) !== undefined;
|
|
609
|
+
return (jsx(NfcChipGate, { onConfirm: function () { return setDocStep(hasIntroduction_1 ? 0 : 1); },
|
|
610
|
+
// Pas de puce → questionnaire de fallback pour recueillir la raison
|
|
611
|
+
onNoChip: function () { return setDocStep(-2); } }));
|
|
612
|
+
}
|
|
613
|
+
case -2:
|
|
614
|
+
return jsx(NfcFallbackSurvey, { onSubmit: handleNfcFallback });
|
|
532
615
|
case 0:
|
|
533
616
|
if (!documentTypeId) {
|
|
534
617
|
console.error("DocumentCheck: Missing documentTypeId in step 0");
|
|
@@ -536,15 +619,20 @@ var DocumentCheck = function (_a) {
|
|
|
536
619
|
return stepObject.setStep(Math.max(0, stepObject.step - 1));
|
|
537
620
|
}, children: t("document_check.config_error.back", "Retour") })] }));
|
|
538
621
|
}
|
|
539
|
-
return (jsx(JDIPreIntroduction, { documentTypeId: documentTypeId, onContinue: function () { return setDocStep(1); }, onBack: handleBack, introTitleText: ((
|
|
622
|
+
return (jsx(JDIPreIntroduction, { documentTypeId: documentTypeId, onContinue: function () { return setDocStep(1); }, onBack: handleBack, introTitleText: ((_h = node.introductionPage) === null || _h === void 0 ? void 0 : _h.title) || t("jdi.pre_introduction.title"), introDescText: ((_j = node.introductionPage) === null || _j === void 0 ? void 0 : _j.description) ||
|
|
540
623
|
t("jdi.pre_introduction.description") }));
|
|
541
624
|
case 1:
|
|
542
|
-
return (jsx(JDICountrySelection, { onCountrySelect: handleCountrySelect, onBack: handleBack, documentTypeId: documentTypeId, acceptedCountries: finalAcceptedCountries, countryIntroText: ((
|
|
625
|
+
return (jsx(JDICountrySelection, { onCountrySelect: handleCountrySelect, onBack: handleBack, documentTypeId: documentTypeId, acceptedCountries: finalAcceptedCountries, countryIntroText: ((_k = node.countrySelection) === null || _k === void 0 ? void 0 : _k.title) || t("jdi.country_selection.title"), countryDescText: ((_l = node.countrySelection) === null || _l === void 0 ? void 0 : _l.description) ||
|
|
543
626
|
t("jdi.country_selection.description") }));
|
|
544
627
|
case 2:
|
|
545
628
|
return (jsx(JDIDocumentSelection, { onDocumentSelect: handleDocumentTypeSelect, onBack: handleBack, documentTypeId: documentTypeId, sessionId: sessionId, chosenCountry: (finalAcceptedCountries === null || finalAcceptedCountries === void 0 ? void 0 : finalAcceptedCountries.find(function (c) { return c.code === selectedCountry; })) ||
|
|
546
|
-
undefined, documentSelectionTitle: ((
|
|
547
|
-
|
|
629
|
+
undefined, documentSelectionTitle: ((_m = node.documentSelection) === null || _m === void 0 ? void 0 : _m.title) || t("jdi.document_selection.title"), documentSelectionDescription:
|
|
630
|
+
// En NFC, on laisse JDIDocumentSelection choisir le wording adapté
|
|
631
|
+
// (subtitle_identity_nfc) plutôt que l'override "téléverser" du nœud.
|
|
632
|
+
node.nfcEnabled === true
|
|
633
|
+
? undefined
|
|
634
|
+
: ((_o = node.documentSelection) === null || _o === void 0 ? void 0 : _o.description) ||
|
|
635
|
+
t("jdi.document_selection.description"), nfcEnabled: node.nfcEnabled === true }));
|
|
548
636
|
case 3:
|
|
549
637
|
if (!selectedDocumentType) {
|
|
550
638
|
console.error("DocumentCheck: selectedDocumentType is null for step 3!");
|