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.
Files changed (53) hide show
  1. package/dist/cjs/components/DatakeenSession.js +32 -23
  2. package/dist/cjs/components/DatakeenSession.js.map +1 -1
  3. package/dist/cjs/components/jdi/JDIDocumentSelection.js +9 -6
  4. package/dist/cjs/components/jdi/JDIDocumentSelection.js.map +1 -1
  5. package/dist/cjs/components/nfc-scan/BiometricSymbol.js +22 -0
  6. package/dist/cjs/components/nfc-scan/BiometricSymbol.js.map +1 -0
  7. package/dist/cjs/components/nfc-scan/NfcChipGate.js +36 -0
  8. package/dist/cjs/components/nfc-scan/NfcChipGate.js.map +1 -0
  9. package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js +70 -0
  10. package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
  11. package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js +44 -0
  12. package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
  13. package/dist/cjs/components/nfc-scan/NfcScanNode.js +2 -2
  14. package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -1
  15. package/dist/cjs/components/nfc-scan/PuceCniSymbol.js +22 -0
  16. package/dist/cjs/components/nfc-scan/PuceCniSymbol.js.map +1 -0
  17. package/dist/cjs/components/session/DocumentCheck.js +123 -35
  18. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  19. package/dist/cjs/i18n/en.json.js +37 -4
  20. package/dist/cjs/i18n/en.json.js.map +1 -1
  21. package/dist/cjs/i18n/fr.json.js +37 -4
  22. package/dist/cjs/i18n/fr.json.js.map +1 -1
  23. package/dist/cjs/index.css.js +1 -1
  24. package/dist/cjs/services/sessionService.js +19 -0
  25. package/dist/cjs/services/sessionService.js.map +1 -1
  26. package/dist/cjs/types/session.js.map +1 -1
  27. package/dist/esm/components/DatakeenSession.js +32 -23
  28. package/dist/esm/components/DatakeenSession.js.map +1 -1
  29. package/dist/esm/components/jdi/JDIDocumentSelection.js +9 -6
  30. package/dist/esm/components/jdi/JDIDocumentSelection.js.map +1 -1
  31. package/dist/esm/components/nfc-scan/BiometricSymbol.js +18 -0
  32. package/dist/esm/components/nfc-scan/BiometricSymbol.js.map +1 -0
  33. package/dist/esm/components/nfc-scan/NfcChipGate.js +32 -0
  34. package/dist/esm/components/nfc-scan/NfcChipGate.js.map +1 -0
  35. package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js +66 -0
  36. package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
  37. package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js +40 -0
  38. package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
  39. package/dist/esm/components/nfc-scan/NfcScanNode.js +2 -2
  40. package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -1
  41. package/dist/esm/components/nfc-scan/PuceCniSymbol.js +18 -0
  42. package/dist/esm/components/nfc-scan/PuceCniSymbol.js.map +1 -0
  43. package/dist/esm/components/session/DocumentCheck.js +124 -36
  44. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  45. package/dist/esm/i18n/en.json.js +37 -4
  46. package/dist/esm/i18n/en.json.js.map +1 -1
  47. package/dist/esm/i18n/fr.json.js +37 -4
  48. package/dist/esm/i18n/fr.json.js.map +1 -1
  49. package/dist/esm/index.css.js +1 -1
  50. package/dist/esm/services/sessionService.js +19 -1
  51. package/dist/esm/services/sessionService.js.map +1 -1
  52. package/dist/esm/types/session.js.map +1 -1
  53. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NfcOnboardingNotice.js","sources":["../../../../../src/components/nfc-scan/NfcOnboardingNotice.tsx"],"sourcesContent":["import React from \"react\";\nimport { Wallet, QrCode, Smartphone } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\n/**\n * Encart pédagogique affiché sur la page de choix de document lorsque le parcours\n * utilise l'option NFC. Il prépare l'utilisateur aux étapes inhabituelles à venir\n * (document physique en main, scan d'un QR code, ouverture d'une application externe)\n * afin de limiter la rupture de flux et l'abandon.\n *\n * Affiché uniquement quand `nfcEnabled` est vrai côté nœud — sinon la page de choix\n * de document conserve son affichage classique.\n */\nconst NfcOnboardingNotice: React.FC = () => {\n const { t } = useI18n();\n\n const steps = [\n {\n Icon: Wallet,\n title: t(\n \"nfc_scan.onboarding.step_document_title\",\n \"Préparez votre document\",\n ),\n description: t(\n \"nfc_scan.onboarding.step_document_description\",\n \"Sortez votre document d'identité physique, vous en aurez besoin pour la lecture de la puce électronique.\",\n ),\n },\n {\n Icon: QrCode,\n title: t(\"nfc_scan.onboarding.step_qr_title\", \"Scannez un QR code\"),\n description: t(\n \"nfc_scan.onboarding.step_qr_description\",\n \"Après votre choix, un QR code s'affichera : scannez-le avec votre smartphone.\",\n ),\n },\n {\n Icon: Smartphone,\n title: t(\n \"nfc_scan.onboarding.step_app_title\",\n \"Ouvrez l'application sécurisée\",\n ),\n description: t(\n \"nfc_scan.onboarding.step_app_description\",\n \"Le QR code ouvre une application externe dédiée pour scanner et lire la puce électronique de votre document.\",\n ),\n },\n ];\n\n return (\n <div className=\"rounded-2xl border border-teal-200 bg-teal-50 p-4 md:p-5\">\n <h3 className=\"mb-3 flex items-center gap-2 text-sm font-semibold text-teal-900\">\n <QrCode size={18} aria-hidden=\"true\" className=\"shrink-0\" />\n {t(\"nfc_scan.onboarding.title\", \"Lecture sans contact (NFC)\")}\n </h3>\n <p className=\"mb-4 text-sm leading-relaxed text-teal-800\">\n {t(\n \"nfc_scan.onboarding.intro\",\n \"Ce parcours utilise la lecture sans contact de la puce électronique de votre document. Voici les étapes à venir :\",\n )}\n </p>\n <ol className=\"space-y-3\">\n {steps.map(({ Icon, title, description }, index) => (\n <li key={index} className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-white text-teal-600 shadow-sm\">\n <Icon size={18} aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-gray-900\">{title}</p>\n <p className=\"text-sm leading-relaxed text-gray-600\">\n {description}\n </p>\n </div>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport default NfcOnboardingNotice;\n"],"names":["useI18n","Wallet","QrCode","Smartphone","_jsxs","_jsx"],"mappings":";;;;;;;;AAIA;;;;;;;;AAQG;AACH,IAAM,mBAAmB,GAAa,YAAA;AAC5B,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;AAET,IAAA,IAAM,KAAK,GAAG;AACZ,QAAA;AACE,YAAA,IAAI,EAAEC,kBAAM;AACZ,YAAA,KAAK,EAAE,CAAC,CACN,yCAAyC,EACzC,yBAAyB,CAC1B;AACD,YAAA,WAAW,EAAE,CAAC,CACZ,+CAA+C,EAC/C,0GAA0G,CAC3G;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAEC,kBAAM;AACZ,YAAA,KAAK,EAAE,CAAC,CAAC,mCAAmC,EAAE,oBAAoB,CAAC;AACnE,YAAA,WAAW,EAAE,CAAC,CACZ,yCAAyC,EACzC,+EAA+E,CAChF;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAEC,sBAAU;AAChB,YAAA,KAAK,EAAE,CAAC,CACN,oCAAoC,EACpC,gCAAgC,CACjC;AACD,YAAA,WAAW,EAAE,CAAC,CACZ,0CAA0C,EAC1C,8GAA8G,CAC/G;AACF,SAAA;KACF;IAED,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0DAA0D,EAAA,QAAA,EAAA,CACvEA,eAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC9EC,cAAA,CAACH,kBAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,aAAA,EAAc,MAAM,EAAC,SAAS,EAAC,UAAU,EAAA,CAAG,EAC3D,CAAC,CAAC,2BAA2B,EAAE,4BAA4B,CAAC,CAAA,EAAA,CAC1D,EACLG,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACtD,CAAC,CACA,2BAA2B,EAC3B,mHAAmH,CACpH,EAAA,CACC,EACJA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,WAAW,EAAA,QAAA,EACtB,KAAK,CAAC,GAAG,CAAC,UAAC,EAA4B,EAAE,KAAK,EAAA;AAAjC,oBAAA,IAAA,IAAI,UAAA,EAAE,KAAK,GAAA,EAAA,CAAA,KAAA,EAAE,WAAW,GAAA,EAAA,CAAA,WAAA;oBAAc,QAClDD,wBAAgB,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,CAChDC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,wGAAwG,YACtHA,cAAA,CAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAA,aAAA,EAAc,MAAM,EAAA,CAAG,EAAA,CAChC,EACPD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,SAAS,aACtBC,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,KAAK,EAAA,CAAK,EAC5DA,sBAAG,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACjD,WAAW,GACV,CAAA,EAAA,CACA,CAAA,EAAA,EATC,KAAK,CAUT;AAX6C,gBAAA,CAYnD,CAAC,EAAA,CACC,CAAA,EAAA,CACD;AAEV;;;;"}
@@ -38,7 +38,7 @@ var NfcScanStep = function (_a) {
38
38
  }).status;
39
39
  var title = pageTitle || t("nfc_scan.page_title", "Scan NFC de votre document");
40
40
  var subtitle = pageDescription ||
41
- t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre iPhone pour lire la puce NFC de votre document d'identité.");
41
+ t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.");
42
42
  React.useEffect(function () {
43
43
  if (status !== "pending")
44
44
  return;
@@ -82,7 +82,7 @@ var NfcScanStep = function (_a) {
82
82
  }); };
83
83
  generate();
84
84
  }, [nfcUrl, status, t]);
85
- return (jsxRuntime.jsx(MobilePageLayout.default, { footer: null, 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 l'iPhone. Continuez le scan sur le 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 })) : (jsxRuntime.jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", children: jsxRuntime.jsx("canvas", { ref: canvasRef }) })) })] }) }) }));
85
+ return (jsxRuntime.jsx(MobilePageLayout.default, { footer: null, 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 })) : (jsxRuntime.jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", children: jsxRuntime.jsx("canvas", { ref: canvasRef }) })) })] }) }) }));
86
86
  };
87
87
 
88
88
  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 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":["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 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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"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ /**
8
+ * Pictogramme de la puce de contact d'une carte d'identité (contacts dorés type
9
+ * carte bancaire), repris de assets/puce-cni.svg mais teinté avec la couleur
10
+ * primaire du SDK (var(--uni-primary-color)) pour rester aligné sur l'identité
11
+ * visuelle, en cohérence avec BiometricSymbol.
12
+ *
13
+ * Affiché à côté du symbole biométrique pour aider l'utilisateur à reconnaître la
14
+ * puce sur sa carte d'identité.
15
+ */
16
+ var PuceCniSymbol = function (_a) {
17
+ var className = _a.className;
18
+ return (jsxRuntime.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: [jsxRuntime.jsx("rect", { x: "10", y: "10", width: "180", height: "105", rx: "10", ry: "10" }), jsxRuntime.jsxs("g", { transform: "translate(30, 45)", children: [jsxRuntime.jsx("rect", { width: "35", height: "30", rx: "4", ry: "4", fill: "var(--uni-primary-color, #11e5c5)", fillOpacity: "0.12", strokeWidth: "2.5" }), jsxRuntime.jsx("path", { d: "M0 10h35M0 20h35M12 0v30M23 0v30", strokeWidth: "1", strokeOpacity: "0.6" })] })] }));
19
+ };
20
+
21
+ exports.default = PuceCniSymbol;
22
+ //# 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,eAAA,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,cAAA,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,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,CAC9BC,cAAA,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,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,kCAAkC,EACpC,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,KAAK,EAAA,CACnB,CAAA,EAAA,CACA,CAAA,EAAA,CACA;AAEV;;;;"}
@@ -32,6 +32,8 @@ var retryService = require('../../services/retryService.js');
32
32
  var SessionContext = require('../../context/SessionContext.js');
33
33
  var sessionService = require('../../services/sessionService.js');
34
34
  var NfcScanNode = require('../nfc-scan/NfcScanNode.js');
35
+ var NfcChipGate = require('../nfc-scan/NfcChipGate.js');
36
+ var NfcFallbackSurvey = require('../nfc-scan/NfcFallbackSurvey.js');
35
37
  var europeanCountries = require('../../utils/europeanCountries.js');
36
38
 
37
39
  var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
@@ -39,6 +41,14 @@ var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
39
41
  "idCard",
40
42
  "residencePermit",
41
43
  ]);
44
+ /**
45
+ * Normalise le mode NFC vers les valeurs courantes.
46
+ * Rétrocompat : les parcours enregistrés avant le renommage portent encore
47
+ * `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).
48
+ */
49
+ var normalizeNfcMode = function (mode) {
50
+ return mode === "nfcAndApi" || mode === "nfcOrPhoto" ? "nfcOrPhoto" : "nfcOnly";
51
+ };
42
52
  /**
43
53
  * DocumentCheck component manages the multi-step document verification flow for a session.
44
54
  * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.
@@ -64,12 +74,12 @@ var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
64
74
  * - Uses hooks for translation, retry navigation, and context management.
65
75
  */
66
76
  var DocumentCheck = function (_a) {
67
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
68
- var stepObject = _a.stepObject, sessionId = _a.sessionId, node = _a.node; _a.onContinueOnPC; var documentTypeId = _a.documentTypeId, acceptedCountries = _a.acceptedCountries, _m = _a.isMobileCapture, isMobileCapture = _m === void 0 ? false : _m, allowedAddingMethods = _a.allowedAddingMethods, template = _a.template, setUserInput = _a.setUserInput;
77
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
78
+ 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;
69
79
  var t = useI18n.useI18n().t;
70
80
  var session = SessionContext.getSession().session;
71
- var _o = React.useState(), documentTemplates = _o[0], setDocumentTemplates = _o[1];
72
- var _p = React.useState(true), loadingTemplates = _p[0], setLoadingTemplates = _p[1];
81
+ var _q = React.useState(), documentTemplates = _q[0], setDocumentTemplates = _q[1];
82
+ var _r = React.useState(true), loadingTemplates = _r[0], setLoadingTemplates = _r[1];
73
83
  React.useEffect(function () {
74
84
  (function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
75
85
  var templates;
@@ -88,7 +98,7 @@ var DocumentCheck = function (_a) {
88
98
  }); })();
89
99
  }, []);
90
100
  var initialRetryCount = retryService.getNodeRetryCount(session, node.id);
91
- var _q = React.useState(null), selectedMethod = _q[0], setSelectedMethod = _q[1];
101
+ var _s = React.useState(null), selectedMethod = _s[0], setSelectedMethod = _s[1];
92
102
  var isPictureAllowed = (_b = allowedAddingMethods === null || allowedAddingMethods === void 0 ? void 0 : allowedAddingMethods.includes("picture")) !== null && _b !== void 0 ? _b : true;
93
103
  var isDownloadAllowed = (_c = allowedAddingMethods === null || allowedAddingMethods === void 0 ? void 0 : allowedAddingMethods.includes("download")) !== null && _c !== void 0 ? _c : true;
94
104
  // Check if retry is allowed based on initial retry count
@@ -107,21 +117,24 @@ var DocumentCheck = function (_a) {
107
117
  return true;
108
118
  };
109
119
  // Initialize docStep - if retries exhausted, start at error page (step 6)
110
- var _r = React.useState(function () {
120
+ var _t = React.useState(function () {
111
121
  if (initialRetryCount > 0 && !isInitialRetryAllowed()) {
112
122
  return 6; // Error page
113
123
  }
114
124
  return 0; // Normal flow - start with introduction
115
- }), docStep = _r[0], setDocStep = _r[1];
116
- var _s = React.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 = _s[0], setSelectedCountry = _s[1];
117
- var _t = React.useState(null), fileUploaded = _t[0], setFileUploaded = _t[1];
118
- var _u = React.useState(null), analysisData = _u[0], setAnalysisData = _u[1];
119
- var _v = React.useState(null), errorCode = _v[0], setErrorCode = _v[1];
120
- var _w = React.useState(null), nfcPreparationError = _w[0], setNfcPreparationError = _w[1];
125
+ }), docStep = _t[0], setDocStep = _t[1];
126
+ var _u = React.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];
127
+ var _v = React.useState(null), fileUploaded = _v[0], setFileUploaded = _v[1];
128
+ var _w = React.useState(null), analysisData = _w[0], setAnalysisData = _w[1];
129
+ var _x = React.useState(null), errorCode = _x[0], setErrorCode = _x[1];
130
+ var _y = React.useState(null), nfcPreparationError = _y[0], setNfcPreparationError = _y[1];
131
+ // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),
132
+ // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).
133
+ var _z = React.useState(false), nfcSkipped = _z[0], setNfcSkipped = _z[1];
121
134
  // Initialize retry count from session data
122
- var _x = React.useState(function () {
135
+ var _0 = React.useState(function () {
123
136
  return retryService.getNodeRetryCount(session, node.id);
124
- }), retryCount = _x[0], setRetryCount = _x[1];
137
+ }), retryCount = _0[0], setRetryCount = _0[1];
125
138
  // Update retry count when session loads/changes
126
139
  React.useEffect(function () {
127
140
  if (session) {
@@ -161,10 +174,10 @@ var DocumentCheck = function (_a) {
161
174
  setDocStep(6);
162
175
  }
163
176
  }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);
164
- var _y = React.useState({}), capturedImages = _y[0], setCapturedImages = _y[1];
165
- var _z = React.useState("before-recto"), currentPhotoStep = _z[0], setCurrentPhotoStep = _z[1];
166
- var _0 = React.useState("photo"), videoFlowPhase = _0[0], setVideoFlowPhase = _0[1];
167
- var _1 = DocumentContext.useDocumentContext(), selectedDocumentType = _1.selectedDocumentType, setSelectedDocumentType = _1.setSelectedDocumentType;
177
+ var _1 = React.useState({}), capturedImages = _1[0], setCapturedImages = _1[1];
178
+ var _2 = React.useState("before-recto"), currentPhotoStep = _2[0], setCurrentPhotoStep = _2[1];
179
+ var _3 = React.useState("photo"), videoFlowPhase = _3[0], setVideoFlowPhase = _3[1];
180
+ var _4 = DocumentContext.useDocumentContext(), selectedDocumentType = _4.selectedDocumentType, setSelectedDocumentType = _4.setSelectedDocumentType;
168
181
  var finalAcceptedCountries = React.useMemo(function () {
169
182
  if (loadingTemplates)
170
183
  return acceptedCountries;
@@ -244,6 +257,11 @@ var DocumentCheck = function (_a) {
244
257
  if (docStep === 6) {
245
258
  return;
246
259
  }
260
+ // En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1)
261
+ if (node.nfcEnabled === true) {
262
+ setDocStep(-1);
263
+ return;
264
+ }
247
265
  if (((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) === undefined &&
248
266
  ((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) === undefined) {
249
267
  setDocStep(1);
@@ -348,9 +366,9 @@ var DocumentCheck = function (_a) {
348
366
  };
349
367
  var handleDocumentTypeSelect = function (documentId) { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
350
368
  var documentLabel, documentTemplateID, selectedDoc, selectedCountryCode, selectedDocumentInput, nfcMode, error_2;
351
- var _a, _b;
352
- return tslib_es6.__generator(this, function (_c) {
353
- switch (_c.label) {
369
+ var _a;
370
+ return tslib_es6.__generator(this, function (_b) {
371
+ switch (_b.label) {
354
372
  case 0:
355
373
  documentLabel = t("documentTypes.".concat(documentId), documentId);
356
374
  auditTrailService.logDocumentTypeSelected(sessionId, documentId, documentLabel);
@@ -383,22 +401,24 @@ var DocumentCheck = function (_a) {
383
401
  setCapturedImages({});
384
402
  setCurrentPhotoStep("before-recto");
385
403
  setVideoFlowPhase("photo");
386
- if (!(node.nfcEnabled === true && NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId))) return [3 /*break*/, 5];
387
- nfcMode = (_a = node.nfcMode) !== null && _a !== void 0 ? _a : "nfcOnly";
388
- _c.label = 1;
404
+ if (!(node.nfcEnabled === true &&
405
+ !nfcSkipped &&
406
+ NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId))) return [3 /*break*/, 5];
407
+ nfcMode = normalizeNfcMode(node.nfcMode);
408
+ _b.label = 1;
389
409
  case 1:
390
- _c.trys.push([1, 3, , 4]);
391
- return [4 /*yield*/, sessionService.updateSessionUserInput(sessionId, tslib_es6.__assign(tslib_es6.__assign({}, ((_b = session === null || session === void 0 ? void 0 : session.userInput) !== null && _b !== void 0 ? _b : {})), selectedDocumentInput))];
410
+ _b.trys.push([1, 3, , 4]);
411
+ return [4 /*yield*/, sessionService.updateSessionUserInput(sessionId, tslib_es6.__assign(tslib_es6.__assign({}, ((_a = session === null || session === void 0 ? void 0 : session.userInput) !== null && _a !== void 0 ? _a : {})), selectedDocumentInput))];
392
412
  case 2:
393
- _c.sent();
413
+ _b.sent();
394
414
  return [3 /*break*/, 4];
395
415
  case 3:
396
- error_2 = _c.sent();
416
+ error_2 = _b.sent();
397
417
  console.error("Failed to persist NFC document selection:", error_2);
398
418
  setNfcPreparationError(t("nfc_scan.preparation_failed", "Impossible de préparer le scan NFC. Veuillez réessayer."));
399
419
  return [3 /*break*/, 4];
400
420
  case 4:
401
- setDocStep(nfcMode === "nfcAndApi" ? 3 : 7);
421
+ setDocStep(nfcMode === "nfcOrPhoto" ? 3 : 7);
402
422
  return [2 /*return*/];
403
423
  case 5:
404
424
  setDocStep(3);
@@ -424,7 +444,6 @@ var DocumentCheck = function (_a) {
424
444
  }
425
445
  };
426
446
  var handleProcessingComplete = function (success, _retryCount, apiAnalysisData) {
427
- var _a;
428
447
  if (apiAnalysisData) {
429
448
  setAnalysisData(apiAnalysisData);
430
449
  // Extract and store the error code
@@ -435,7 +454,8 @@ var DocumentCheck = function (_a) {
435
454
  }
436
455
  if (success) {
437
456
  var shouldRunNfcAfterApi = node.nfcEnabled === true &&
438
- ((_a = node.nfcMode) !== null && _a !== void 0 ? _a : "nfcOnly") === "nfcAndApi" &&
457
+ !nfcSkipped &&
458
+ normalizeNfcMode(node.nfcMode) === "nfcOrPhoto" &&
439
459
  !!(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) &&
440
460
  NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);
441
461
  if (shouldRunNfcAfterApi) {
@@ -524,7 +544,61 @@ var DocumentCheck = function (_a) {
524
544
  }
525
545
  setDocStep(0);
526
546
  };
547
+ // Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.
548
+ // On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :
549
+ // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC
550
+ // - nfcOnly → on saute le nœud (nœud suivant)
551
+ var handleNfcFallback = function (reason, label, comment) { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
552
+ var error_3, nfcMode, hasIntroduction;
553
+ var _a, _b;
554
+ return tslib_es6.__generator(this, function (_c) {
555
+ switch (_c.label) {
556
+ case 0:
557
+ setNfcSkipped(true);
558
+ _c.label = 1;
559
+ case 1:
560
+ _c.trys.push([1, 3, , 4]);
561
+ return [4 /*yield*/, sessionService.skipNfcWithReason(sessionId, { reason: reason, label: label, comment: comment })];
562
+ case 2:
563
+ _c.sent();
564
+ return [3 /*break*/, 4];
565
+ case 3:
566
+ error_3 = _c.sent();
567
+ console.error("Failed to persist NFC fallback reason:", error_3);
568
+ return [3 /*break*/, 4];
569
+ case 4:
570
+ nfcMode = normalizeNfcMode(node.nfcMode);
571
+ if (nfcMode === "nfcOrPhoto") {
572
+ hasIntroduction = ((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) !== undefined ||
573
+ ((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) !== undefined;
574
+ setDocStep(hasIntroduction ? 0 : 1);
575
+ return [2 /*return*/];
576
+ }
577
+ if (template) {
578
+ stepObject.goToNextStep(node.id, template);
579
+ }
580
+ else {
581
+ stepObject.setStep(stepObject.step + 1);
582
+ }
583
+ return [2 /*return*/];
584
+ }
585
+ });
586
+ }); };
527
587
  var handleBack = function () {
588
+ var _a, _b;
589
+ var hasIntroduction = ((_a = node.introductionPage) === null || _a === void 0 ? void 0 : _a.title) !== undefined ||
590
+ ((_b = node.introductionPage) === null || _b === void 0 ? void 0 : _b.description) !== undefined;
591
+ // Le questionnaire de fallback (-2) revient au gate (-1)
592
+ if (docStep === -2) {
593
+ setDocStep(-1);
594
+ return;
595
+ }
596
+ // En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)
597
+ if (node.nfcEnabled === true &&
598
+ docStep === (hasIntroduction ? 0 : 1)) {
599
+ setDocStep(-1);
600
+ return;
601
+ }
528
602
  if (docStep === 0) {
529
603
  stepObject.goBack();
530
604
  }
@@ -533,6 +607,15 @@ var DocumentCheck = function (_a) {
533
607
  }
534
608
  };
535
609
  switch (docStep) {
610
+ case -1: {
611
+ var hasIntroduction_1 = ((_f = node.introductionPage) === null || _f === void 0 ? void 0 : _f.title) !== undefined ||
612
+ ((_g = node.introductionPage) === null || _g === void 0 ? void 0 : _g.description) !== undefined;
613
+ return (jsxRuntime.jsx(NfcChipGate.default, { onConfirm: function () { return setDocStep(hasIntroduction_1 ? 0 : 1); },
614
+ // Pas de puce → questionnaire de fallback pour recueillir la raison
615
+ onNoChip: function () { return setDocStep(-2); } }));
616
+ }
617
+ case -2:
618
+ return jsxRuntime.jsx(NfcFallbackSurvey.default, { onSubmit: handleNfcFallback });
536
619
  case 0:
537
620
  if (!documentTypeId) {
538
621
  console.error("DocumentCheck: Missing documentTypeId in step 0");
@@ -540,15 +623,20 @@ var DocumentCheck = function (_a) {
540
623
  return stepObject.setStep(Math.max(0, stepObject.step - 1));
541
624
  }, children: t("document_check.config_error.back", "Retour") })] }));
542
625
  }
543
- return (jsxRuntime.jsx(JDIPreIntroduction.default, { documentTypeId: documentTypeId, onContinue: function () { return setDocStep(1); }, onBack: handleBack, introTitleText: ((_f = node.introductionPage) === null || _f === void 0 ? void 0 : _f.title) || t("jdi.pre_introduction.title"), introDescText: ((_g = node.introductionPage) === null || _g === void 0 ? void 0 : _g.description) ||
626
+ return (jsxRuntime.jsx(JDIPreIntroduction.default, { 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) ||
544
627
  t("jdi.pre_introduction.description") }));
545
628
  case 1:
546
- return (jsxRuntime.jsx(JDICountrySelection.default, { onCountrySelect: handleCountrySelect, onBack: handleBack, documentTypeId: documentTypeId, acceptedCountries: finalAcceptedCountries, countryIntroText: ((_h = node.countrySelection) === null || _h === void 0 ? void 0 : _h.title) || t("jdi.country_selection.title"), countryDescText: ((_j = node.countrySelection) === null || _j === void 0 ? void 0 : _j.description) ||
629
+ return (jsxRuntime.jsx(JDICountrySelection.default, { 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) ||
547
630
  t("jdi.country_selection.description") }));
548
631
  case 2:
549
632
  return (jsxRuntime.jsx(JDIDocumentSelection.default, { onDocumentSelect: handleDocumentTypeSelect, onBack: handleBack, documentTypeId: documentTypeId, sessionId: sessionId, chosenCountry: (finalAcceptedCountries === null || finalAcceptedCountries === void 0 ? void 0 : finalAcceptedCountries.find(function (c) { return c.code === selectedCountry; })) ||
550
- undefined, documentSelectionTitle: ((_k = node.documentSelection) === null || _k === void 0 ? void 0 : _k.title) || t("jdi.document_selection.title"), documentSelectionDescription: ((_l = node.documentSelection) === null || _l === void 0 ? void 0 : _l.description) ||
551
- t("jdi.document_selection.description") }));
633
+ undefined, documentSelectionTitle: ((_m = node.documentSelection) === null || _m === void 0 ? void 0 : _m.title) || t("jdi.document_selection.title"), documentSelectionDescription:
634
+ // En NFC, on laisse JDIDocumentSelection choisir le wording adapté
635
+ // (subtitle_identity_nfc) plutôt que l'override "téléverser" du nœud.
636
+ node.nfcEnabled === true
637
+ ? undefined
638
+ : ((_o = node.documentSelection) === null || _o === void 0 ? void 0 : _o.description) ||
639
+ t("jdi.document_selection.description"), nfcEnabled: node.nfcEnabled === true }));
552
640
  case 3:
553
641
  if (!selectedDocumentType) {
554
642
  console.error("DocumentCheck: selectedDocumentType is null for step 3!");