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
@@ -45,16 +45,16 @@ var SessionContent = require('./session/SessionContent.js');
45
45
  */
46
46
  var DatakeenSession = function (_a) {
47
47
  var _b, _c, _d;
48
- var _e, _f, _g, _h, _j, _k, _l, _m;
48
+ var _e, _f, _g, _h, _j, _k, _l, _m, _o;
49
49
  var sessionId = _a.sessionId, sessionConfig = _a.sessionConfig, apiBaseUrl = _a.apiBaseUrl;
50
50
  var isMobile = useIsMobile.default();
51
- var _o = useClientInfo.useClientInfo(), clientInfo = _o.info, clientInfoLoaded = _o.isLoaded;
51
+ var _p = useClientInfo.useClientInfo(), clientInfo = _p.info, clientInfoLoaded = _p.isLoaded;
52
52
  // Load base CSS and UI components CSS that are always needed
53
53
  useRouteCSS.useRouteCSS("ui-components");
54
54
  // Session data management
55
- var _p = useSessionData.useSessionData(sessionId, clientInfo, clientInfoLoaded), session = _p.session, setSession = _p.setSession, loading = _p.loading, setLoading = _p.setLoading, error = _p.error, isExpired = _p.isExpired, userInput = _p.userInput, setUserInput = _p.setUserInput, contactInfo = _p.contactInfo, setContactInfo = _p.setContactInfo, loadSession = _p.loadSession, handleRetrySession = _p.handleRetrySession;
55
+ var _q = useSessionData.useSessionData(sessionId, clientInfo, clientInfoLoaded), session = _q.session, setSession = _q.setSession, loading = _q.loading, setLoading = _q.setLoading, error = _q.error, isExpired = _q.isExpired, userInput = _q.userInput, setUserInput = _q.setUserInput, contactInfo = _q.contactInfo, setContactInfo = _q.setContactInfo, loadSession = _q.loadSession, handleRetrySession = _q.handleRetrySession;
56
56
  // Step navigation management
57
- var _q = useStepNavigation.useStepNavigation(sessionId, session === null || session === void 0 ? void 0 : session.status, session === null || session === void 0 ? void 0 : session.currentStep, session === null || session === void 0 ? void 0 : session.template), step = _q.step, stepObject = _q.stepObject, history = _q.history;
57
+ var _r = useStepNavigation.useStepNavigation(sessionId, session === null || session === void 0 ? void 0 : session.status, session === null || session === void 0 ? void 0 : session.currentStep, session === null || session === void 0 ? void 0 : session.template), step = _r.step, stepObject = _r.stepObject, history = _r.history;
58
58
  // Load route-specific CSS based on current step
59
59
  useStepCSS.useStepCSS(step, session);
60
60
  // Template loading logic
@@ -76,21 +76,30 @@ var DatakeenSession = function (_a) {
76
76
  contactInfo: { email: "", phoneNumber: "" },
77
77
  });
78
78
  }, [session, loading, error, isExpired]);
79
- // Handle initial step setting when session loads
79
+ // Handle initial step setting when session loads.
80
+ // Quand la session est déjà terminée (ex: rechargement), on positionne le step
81
+ // sur le nœud `end`. On indexe sur getOrderedJourneySteps (start filtré + tri par
82
+ // `order`) — MÊME référentiel que TemplateNodeRenderer — sinon l'index calculé
83
+ // pointe sur un autre nœud que celui rendu (ex: external-verification, qui se
84
+ // ré-exécute et part en boucle).
85
+ // Idempotent : on ne re-navigue que si on n'est pas déjà sur le bon step, et on
86
+ // resserre les dépendances pour ne pas se re-déclencher à chaque mutation de session
87
+ // (userInput, retryCounts, polling…) — ce qui relançait la boucle.
80
88
  React.useEffect(function () {
81
- var _a;
82
- if (session && session.status === "ended") {
83
- // If session is ended, find the appropriate end step
84
- var templateNodes = ((_a = session.template) === null || _a === void 0 ? void 0 : _a.nodes) || [];
85
- var endNodeIndex = templateNodes.findIndex(function (node) { return node.type === "end"; });
86
- if (endNodeIndex !== -1) {
87
- stepObject.setStep(1 + endNodeIndex);
88
- }
89
- else {
90
- stepObject.setStep(1 + templateNodes.length);
91
- }
89
+ if ((session === null || session === void 0 ? void 0 : session.status) !== "ended" || !session.template) {
90
+ return;
91
+ }
92
+ var orderedSteps = sessionService.getOrderedJourneySteps(session.template);
93
+ var endNodeIndex = orderedSteps.findIndex(function (node) { return node.type === "end"; });
94
+ var targetStep = endNodeIndex !== -1 ? 1 + endNodeIndex : 1 + orderedSteps.length;
95
+ if (stepObject.step !== targetStep) {
96
+ // skipHistory: repositionnement technique, pas une étape utilisateur
97
+ // (évite aussi que goBack() ne ramène sur un nœud auto-exécutant).
98
+ stepObject.setStep(targetStep, true);
92
99
  }
93
- }, [session, stepObject]);
100
+ // Dépendances volontairement resserrées à status + template.id (cf. commentaire
101
+ // ci-dessus) : ne pas inclure `session`/`stepObject` qui relanceraient la boucle.
102
+ }, [session === null || session === void 0 ? void 0 : session.status, (_e = session === null || session === void 0 ? void 0 : session.template) === null || _e === void 0 ? void 0 : _e.id]);
94
103
  if (!sessionId) {
95
104
  return jsxRuntime.jsx(NoSessionIdState.default, {});
96
105
  }
@@ -99,7 +108,7 @@ var DatakeenSession = function (_a) {
99
108
  var showMobilePoweredBy = isMobile && (loading || !!error || isExpired);
100
109
  var showDesktopPoweredBy = !isMobile && !loading && !error && !isExpired;
101
110
  var poweredByRef = React.useRef(null);
102
- var _r = React.useState(0), poweredByHeight = _r[0], setPoweredByHeight = _r[1];
111
+ var _s = React.useState(0), poweredByHeight = _s[0], setPoweredByHeight = _s[1];
103
112
  React.useLayoutEffect(function () {
104
113
  if (typeof window === "undefined" || !showMobilePoweredBy) {
105
114
  setPoweredByHeight(0);
@@ -145,7 +154,7 @@ var DatakeenSession = function (_a) {
145
154
  var shouldUseWideDesktopLayout = (currentTemplateNode === null || currentTemplateNode === void 0 ? void 0 : currentTemplateNode.type) === "information-input" &&
146
155
  currentTemplateNode.informationType === "custom" &&
147
156
  (currentTemplateNode.customFields || []).some(function (field) { return field.valueType === "list"; });
148
- var _s = React.useState(false), isRecordingSelfie = _s[0], setIsRecordingSelfie = _s[1];
157
+ var _t = React.useState(false), isRecordingSelfie = _t[0], setIsRecordingSelfie = _t[1];
149
158
  React.useEffect(function () {
150
159
  if (typeof document === "undefined")
151
160
  return;
@@ -164,8 +173,8 @@ var DatakeenSession = function (_a) {
164
173
  (currentTemplateNode === null || currentTemplateNode === void 0 ? void 0 : currentTemplateNode.type) === "selfie-capture" ||
165
174
  (currentTemplateNode === null || currentTemplateNode === void 0 ? void 0 : currentTemplateNode.type) === "document-collection" || // Could be upload, but safer to allow full height
166
175
  (currentTemplateNode === null || currentTemplateNode === void 0 ? void 0 : currentTemplateNode.type) === "controle-jdi";
167
- var btnBg = (_f = (_e = session === null || session === void 0 ? void 0 : session.template) === null || _e === void 0 ? void 0 : _e.buttonBgColor) !== null && _f !== void 0 ? _f : "#11E5C5";
168
- var btnText = (_h = (_g = session === null || session === void 0 ? void 0 : session.template) === null || _g === void 0 ? void 0 : _g.buttonTextColor) !== null && _h !== void 0 ? _h : "#3C3C40";
176
+ var btnBg = (_g = (_f = session === null || session === void 0 ? void 0 : session.template) === null || _f === void 0 ? void 0 : _f.buttonBgColor) !== null && _g !== void 0 ? _g : "#11E5C5";
177
+ var btnText = (_j = (_h = session === null || session === void 0 ? void 0 : session.template) === null || _h === void 0 ? void 0 : _h.buttonTextColor) !== null && _j !== void 0 ? _j : "#3C3C40";
169
178
  return (jsxRuntime.jsx(ConfigContext.ConfigProvider, { apiBaseUrl: apiBaseUrl, children: jsxRuntime.jsx(DocumentContext.DocumentProvider, { children: jsxRuntime.jsx("div", { className: "sdk-session flex-1 flex flex-col", style: tslib_es6.__assign((_c = {}, _c["--dk-btn-bg"] = btnBg, _c["--dk-btn-text"] = btnText, _c), (isMobile
170
179
  ? (_d = {},
171
180
  _d["--dk-mobile-scroll-padding"] = mobileScrollPadding,
@@ -175,13 +184,13 @@ var DatakeenSession = function (_a) {
175
184
  : "var(--dk-mobile-scroll-padding, env(safe-area-inset-bottom, 0px))",
176
185
  }, children: jsxRuntime.jsx("div", { className: "flex flex-1 flex-col min-h-0", children: renderSessionContent() }) }), showMobilePoweredBy && (jsxRuntime.jsx("div", { className: "bg-white px-4 pt-3 pb-4 sm:px-6 sm:pt-6 sm:pb-6", style: {
177
186
  paddingBottom: "calc(env(safe-area-inset-bottom, 0px) + 0.5rem)",
178
- }, ref: poweredByRef, children: jsxRuntime.jsx(PoweredBy.default, { logo: (_j = session === null || session === void 0 ? void 0 : session.template) === null || _j === void 0 ? void 0 : _j.logo, text: ((_k = session === null || session === void 0 ? void 0 : session.template) === null || _k === void 0 ? void 0 : _k.logo) ? "par" : undefined }) }))] })) : (jsxRuntime.jsx("div", { className: "flex items-center justify-center w-full min-h-screen bg-gray-100 py-12", children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center", children: [jsxRuntime.jsx(Paper.default, { className: "dk-session-paper flex flex-col h-[800px] px-8 py-10 bg-white rounded-2xl shadow-xl z-10 ".concat(isRecordingSelfie
187
+ }, ref: poweredByRef, children: jsxRuntime.jsx(PoweredBy.default, { logo: (_k = session === null || session === void 0 ? void 0 : session.template) === null || _k === void 0 ? void 0 : _k.logo, text: ((_l = session === null || session === void 0 ? void 0 : session.template) === null || _l === void 0 ? void 0 : _l.logo) ? "par" : undefined }) }))] })) : (jsxRuntime.jsx("div", { className: "flex items-center justify-center w-full min-h-screen bg-gray-100 py-12", children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center", children: [jsxRuntime.jsx(Paper.default, { className: "dk-session-paper flex flex-col h-[800px] px-8 py-10 bg-white rounded-2xl shadow-xl z-10 ".concat(isRecordingSelfie
179
188
  ? ""
180
189
  : shouldUseWideDesktopLayout
181
190
  ? "w-[98vw] max-w-[1500px]"
182
191
  : "w-[600px]"), style: isRecordingSelfie
183
192
  ? { width: "min(66vw, 942px)" }
184
- : undefined, children: jsxRuntime.jsx("div", { className: "flex-1 w-full h-full overflow-y-auto", children: renderSessionContent() }) }), showDesktopPoweredBy && (jsxRuntime.jsx("div", { className: "pt-6 text-center", children: jsxRuntime.jsx(PoweredBy.default, { logo: (_l = session === null || session === void 0 ? void 0 : session.template) === null || _l === void 0 ? void 0 : _l.logo, text: ((_m = session === null || session === void 0 ? void 0 : session.template) === null || _m === void 0 ? void 0 : _m.logo) ? "par" : undefined }) }))] }) })) }) }) }));
193
+ : undefined, children: jsxRuntime.jsx("div", { className: "flex-1 w-full h-full overflow-y-auto", children: renderSessionContent() }) }), showDesktopPoweredBy && (jsxRuntime.jsx("div", { className: "pt-6 text-center", children: jsxRuntime.jsx(PoweredBy.default, { logo: (_m = session === null || session === void 0 ? void 0 : session.template) === null || _m === void 0 ? void 0 : _m.logo, text: ((_o = session === null || session === void 0 ? void 0 : session.template) === null || _o === void 0 ? void 0 : _o.logo) ? "par" : undefined }) }))] }) })) }) }) }));
185
194
  };
186
195
 
187
196
  exports.default = DatakeenSession;
@@ -1 +1 @@
1
- {"version":3,"file":"DatakeenSession.js","sources":["../../../../src/components/DatakeenSession.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { DatakeenSessionProps } from \"../types/session\";\nimport Paper from \"./ui/Paper\";\nimport useIsMobile from \"../hooks/useIsMobile\";\nimport PoweredBy from \"./ui/PoweredBy\";\nimport SessionExpired from \"./session/SessionExpired\";\nimport { useRouteCSS } from \"../hooks/useRouteCSS\";\nimport { DocumentProvider } from \"../context/DocumentContext\";\nimport { ConfigProvider } from \"../context/ConfigContext\";\nimport { setSessionStore } from \"../context/SessionContext\";\n\n// Hooks\nimport { useSessionData } from \"../hooks/useSessionData\";\nimport { useStepNavigation } from \"../hooks/useStepNavigation\";\nimport { useStepCSS } from \"../hooks/useStepCSS\";\nimport { useTemplateLoader } from \"../hooks/useTemplateLoader\";\nimport { useClientInfo } from \"../hooks/useClientInfo\";\nimport { getOrderedJourneySteps } from \"../services/sessionService\";\n\n// Components\nimport NoSessionIdState from \"./states/NoSessionIdState\";\nimport LoadingState from \"./states/LoadingState\";\nimport ErrorState from \"./states/ErrorState\";\nimport SessionContent from \"./session/SessionContent\";\n\n/**\n * DatakeenSession Component\n *\n * The main component of the Datakeen SDK that manages the multi-step verification flow.\n * This component handles the different steps of the session process, including:\n * - Initial welcome screen\n * - User information collection\n * - Country selection for JDI verification\n * - Mobile redirect when selfie is required\n *\n * The component maintains internal state for the current step and user input data,\n * progressing through the verification journey as the user completes each step.\n *\n * @param {DatakeenSessionProps} props - Component props\n * @param {string} props.sessionId - Unique identifier for the verification session\n * @param {SessionConfig} props.sessionConfig - Configuration for the session (e.g., selfie: true)\n * @param {string} props.apiBaseUrl - Optional API base URL for dynamic environment configuration\n * @returns {JSX.Element} A Paper-wrapped container with the appropriate step component based on current state\n */\nconst DatakeenSession = ({\n sessionId,\n sessionConfig,\n apiBaseUrl,\n}: DatakeenSessionProps) => {\n const isMobile = useIsMobile();\n const { info: clientInfo, isLoaded: clientInfoLoaded } = useClientInfo();\n\n // Load base CSS and UI components CSS that are always needed\n useRouteCSS(\"ui-components\");\n\n // Session data management\n const {\n session,\n setSession,\n loading,\n setLoading,\n error,\n isExpired,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n loadSession,\n handleRetrySession,\n } = useSessionData(sessionId, clientInfo, clientInfoLoaded);\n\n // Step navigation management\n const { step, stepObject, history } = useStepNavigation(\n sessionId,\n session?.status,\n session?.currentStep,\n session?.template,\n );\n\n // Load route-specific CSS based on current step\n useStepCSS(step, session);\n\n // Template loading logic\n useTemplateLoader(step, sessionId, session, loading, setSession, setLoading);\n\n // Load session data on component mount\n useEffect(() => {\n loadSession();\n }, [sessionId, sessionConfig]);\n\n // Update global session store whenever session data changes\n useEffect(() => {\n const sanitizedSessionForGlobalStore = session\n ? {\n ...session,\n token: \"\",\n userInput: {},\n contactInfo: undefined,\n }\n : null;\n\n setSessionStore({\n session: sanitizedSessionForGlobalStore,\n loading,\n error,\n isExpired,\n userInput: {},\n contactInfo: { email: \"\", phoneNumber: \"\" },\n });\n }, [session, loading, error, isExpired]);\n\n // Handle initial step setting when session loads\n useEffect(() => {\n if (session && session.status === \"ended\") {\n // If session is ended, find the appropriate end step\n const templateNodes = session.template?.nodes || [];\n const endNodeIndex = templateNodes.findIndex(\n (node) => node.type === \"end\",\n );\n\n if (endNodeIndex !== -1) {\n stepObject.setStep(1 + endNodeIndex);\n } else {\n stepObject.setStep(1 + templateNodes.length);\n }\n }\n }, [session, stepObject]);\n\n if (!sessionId) {\n return <NoSessionIdState />;\n }\n\n // PoweredBy de DatakeenSession : uniquement pour les états spéciaux (loading/error/expired)\n // Les pages normales utilisent MobilePageLayout qui gère son propre PoweredBy\n const showMobilePoweredBy = isMobile && (loading || !!error || isExpired);\n const showDesktopPoweredBy = !isMobile && !loading && !error && !isExpired;\n const poweredByRef = useRef<HTMLDivElement | null>(null);\n const [poweredByHeight, setPoweredByHeight] = useState(0);\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\" || !showMobilePoweredBy) {\n setPoweredByHeight(0);\n return;\n }\n\n const updateHeight = () => {\n if (poweredByRef.current) {\n setPoweredByHeight(poweredByRef.current.offsetHeight);\n }\n };\n\n updateHeight();\n window.addEventListener(\"resize\", updateHeight);\n\n return () => {\n window.removeEventListener(\"resize\", updateHeight);\n };\n }, [showMobilePoweredBy]);\n\n const mobileRootStyle: CSSProperties = {\n [\"--dk-mobile-footer-offset\" as any]: `${poweredByHeight}px`,\n };\n\n const renderSessionContent = () => {\n if (loading) {\n return <LoadingState />;\n }\n\n if (error) {\n return <ErrorState error={error} />;\n }\n\n if (isExpired) {\n return <SessionExpired onRetry={handleRetrySession} />;\n }\n\n return (\n <SessionContent\n step={step}\n loading={loading}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n stepHistory={history}\n userInput={userInput}\n setUserInput={setUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n />\n );\n };\n\n const mobileScrollPadding = showMobilePoweredBy\n ? `calc(${poweredByHeight}px + env(safe-area-inset-bottom, 0px))`\n : \"env(safe-area-inset-bottom, 0px)\";\n\n const currentTemplateNode = useMemo(() => {\n if (!session?.template || step < 1) {\n return null;\n }\n\n const templateIndex = Math.floor(step - 1);\n const orderedSteps = getOrderedJourneySteps(session.template);\n return orderedSteps[templateIndex] || null;\n }, [session?.template, step]);\n\n const shouldUseWideDesktopLayout =\n currentTemplateNode?.type === \"information-input\" &&\n currentTemplateNode.informationType === \"custom\" &&\n (currentTemplateNode.customFields || []).some(\n (field) => field.valueType === \"list\",\n );\n\n const [isRecordingSelfie, setIsRecordingSelfie] = useState(false);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const update = () =>\n setIsRecordingSelfie(\n document.body.classList.contains(\"recording-selfie\"),\n );\n update();\n const observer = new MutationObserver(update);\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const isCaptureStep =\n currentTemplateNode?.type === \"biometric-capture\" ||\n currentTemplateNode?.type === \"selfie-capture\" ||\n currentTemplateNode?.type === \"document-collection\" || // Could be upload, but safer to allow full height\n currentTemplateNode?.type === \"controle-jdi\";\n\n const btnBg = session?.template?.buttonBgColor ?? \"#11E5C5\";\n const btnText = session?.template?.buttonTextColor ?? \"#3C3C40\";\n\n return (\n <ConfigProvider apiBaseUrl={apiBaseUrl}>\n <DocumentProvider>\n <div\n className=\"sdk-session flex-1 flex flex-col\"\n style={\n {\n [\"--dk-btn-bg\" as string]: btnBg,\n [\"--dk-btn-text\" as string]: btnText,\n ...(isMobile\n ? {\n [\"--dk-mobile-scroll-padding\" as string]:\n mobileScrollPadding,\n }\n : undefined),\n } as CSSProperties\n }\n >\n {isMobile ? (\n <div\n className=\"flex h-full w-full flex-col bg-white\"\n style={mobileRootStyle}\n >\n <div\n className={`flex flex-1 min-h-0 flex-col ${isCaptureStep ? \"\" : \"overflow-y-auto\"}`}\n style={{\n paddingBottom: isCaptureStep\n ? \"0\"\n : \"var(--dk-mobile-scroll-padding, env(safe-area-inset-bottom, 0px))\",\n }}\n >\n <div className=\"flex flex-1 flex-col min-h-0\">\n {renderSessionContent()}\n </div>\n </div>\n {showMobilePoweredBy && (\n <div\n className=\"bg-white px-4 pt-3 pb-4 sm:px-6 sm:pt-6 sm:pb-6\"\n style={{\n paddingBottom:\n \"calc(env(safe-area-inset-bottom, 0px) + 0.5rem)\",\n }}\n ref={poweredByRef}\n >\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-center w-full min-h-screen bg-gray-100 py-12\">\n <div className=\"flex flex-col items-center justify-center\">\n <Paper\n className={`dk-session-paper flex flex-col h-[800px] px-8 py-10 bg-white rounded-2xl shadow-xl z-10 ${isRecordingSelfie\n ? \"\"\n : shouldUseWideDesktopLayout\n ? \"w-[98vw] max-w-[1500px]\"\n : \"w-[600px]\"\n }`}\n style={\n isRecordingSelfie\n ? { width: \"min(66vw, 942px)\" }\n : undefined\n }\n >\n <div className=\"flex-1 w-full h-full overflow-y-auto\">\n {renderSessionContent()}\n </div>\n </Paper>\n {showDesktopPoweredBy && (\n <div className=\"pt-6 text-center\">\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </DocumentProvider>\n </ConfigProvider>\n );\n};\n\nexport default DatakeenSession;\n"],"names":["useIsMobile","useClientInfo","useRouteCSS","useSessionData","useStepNavigation","useStepCSS","useTemplateLoader","useEffect","setSessionStore","_jsx","NoSessionIdState","useRef","useState","useLayoutEffect","LoadingState","ErrorState","SessionExpired","SessionContent","useMemo","getOrderedJourneySteps","ConfigProvider","DocumentProvider","__assign","_jsxs","PoweredBy","Paper"],"mappings":"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"}
1
+ {"version":3,"file":"DatakeenSession.js","sources":["../../../../src/components/DatakeenSession.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { DatakeenSessionProps } from \"../types/session\";\nimport Paper from \"./ui/Paper\";\nimport useIsMobile from \"../hooks/useIsMobile\";\nimport PoweredBy from \"./ui/PoweredBy\";\nimport SessionExpired from \"./session/SessionExpired\";\nimport { useRouteCSS } from \"../hooks/useRouteCSS\";\nimport { DocumentProvider } from \"../context/DocumentContext\";\nimport { ConfigProvider } from \"../context/ConfigContext\";\nimport { setSessionStore } from \"../context/SessionContext\";\n\n// Hooks\nimport { useSessionData } from \"../hooks/useSessionData\";\nimport { useStepNavigation } from \"../hooks/useStepNavigation\";\nimport { useStepCSS } from \"../hooks/useStepCSS\";\nimport { useTemplateLoader } from \"../hooks/useTemplateLoader\";\nimport { useClientInfo } from \"../hooks/useClientInfo\";\nimport { getOrderedJourneySteps } from \"../services/sessionService\";\n\n// Components\nimport NoSessionIdState from \"./states/NoSessionIdState\";\nimport LoadingState from \"./states/LoadingState\";\nimport ErrorState from \"./states/ErrorState\";\nimport SessionContent from \"./session/SessionContent\";\n\n/**\n * DatakeenSession Component\n *\n * The main component of the Datakeen SDK that manages the multi-step verification flow.\n * This component handles the different steps of the session process, including:\n * - Initial welcome screen\n * - User information collection\n * - Country selection for JDI verification\n * - Mobile redirect when selfie is required\n *\n * The component maintains internal state for the current step and user input data,\n * progressing through the verification journey as the user completes each step.\n *\n * @param {DatakeenSessionProps} props - Component props\n * @param {string} props.sessionId - Unique identifier for the verification session\n * @param {SessionConfig} props.sessionConfig - Configuration for the session (e.g., selfie: true)\n * @param {string} props.apiBaseUrl - Optional API base URL for dynamic environment configuration\n * @returns {JSX.Element} A Paper-wrapped container with the appropriate step component based on current state\n */\nconst DatakeenSession = ({\n sessionId,\n sessionConfig,\n apiBaseUrl,\n}: DatakeenSessionProps) => {\n const isMobile = useIsMobile();\n const { info: clientInfo, isLoaded: clientInfoLoaded } = useClientInfo();\n\n // Load base CSS and UI components CSS that are always needed\n useRouteCSS(\"ui-components\");\n\n // Session data management\n const {\n session,\n setSession,\n loading,\n setLoading,\n error,\n isExpired,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n loadSession,\n handleRetrySession,\n } = useSessionData(sessionId, clientInfo, clientInfoLoaded);\n\n // Step navigation management\n const { step, stepObject, history } = useStepNavigation(\n sessionId,\n session?.status,\n session?.currentStep,\n session?.template,\n );\n\n // Load route-specific CSS based on current step\n useStepCSS(step, session);\n\n // Template loading logic\n useTemplateLoader(step, sessionId, session, loading, setSession, setLoading);\n\n // Load session data on component mount\n useEffect(() => {\n loadSession();\n }, [sessionId, sessionConfig]);\n\n // Update global session store whenever session data changes\n useEffect(() => {\n const sanitizedSessionForGlobalStore = session\n ? {\n ...session,\n token: \"\",\n userInput: {},\n contactInfo: undefined,\n }\n : null;\n\n setSessionStore({\n session: sanitizedSessionForGlobalStore,\n loading,\n error,\n isExpired,\n userInput: {},\n contactInfo: { email: \"\", phoneNumber: \"\" },\n });\n }, [session, loading, error, isExpired]);\n\n // Handle initial step setting when session loads.\n // Quand la session est déjà terminée (ex: rechargement), on positionne le step\n // sur le nœud `end`. On indexe sur getOrderedJourneySteps (start filtré + tri par\n // `order`) — MÊME référentiel que TemplateNodeRenderer — sinon l'index calculé\n // pointe sur un autre nœud que celui rendu (ex: external-verification, qui se\n // ré-exécute et part en boucle).\n // Idempotent : on ne re-navigue que si on n'est pas déjà sur le bon step, et on\n // resserre les dépendances pour ne pas se re-déclencher à chaque mutation de session\n // (userInput, retryCounts, polling…) — ce qui relançait la boucle.\n useEffect(() => {\n if (session?.status !== \"ended\" || !session.template) {\n return;\n }\n const orderedSteps = getOrderedJourneySteps(session.template);\n const endNodeIndex = orderedSteps.findIndex(\n (node) => node.type === \"end\",\n );\n const targetStep =\n endNodeIndex !== -1 ? 1 + endNodeIndex : 1 + orderedSteps.length;\n\n if (stepObject.step !== targetStep) {\n // skipHistory: repositionnement technique, pas une étape utilisateur\n // (évite aussi que goBack() ne ramène sur un nœud auto-exécutant).\n stepObject.setStep(targetStep, true);\n }\n // Dépendances volontairement resserrées à status + template.id (cf. commentaire\n // ci-dessus) : ne pas inclure `session`/`stepObject` qui relanceraient la boucle.\n }, [session?.status, session?.template?.id]);\n\n if (!sessionId) {\n return <NoSessionIdState />;\n }\n\n // PoweredBy de DatakeenSession : uniquement pour les états spéciaux (loading/error/expired)\n // Les pages normales utilisent MobilePageLayout qui gère son propre PoweredBy\n const showMobilePoweredBy = isMobile && (loading || !!error || isExpired);\n const showDesktopPoweredBy = !isMobile && !loading && !error && !isExpired;\n const poweredByRef = useRef<HTMLDivElement | null>(null);\n const [poweredByHeight, setPoweredByHeight] = useState(0);\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\" || !showMobilePoweredBy) {\n setPoweredByHeight(0);\n return;\n }\n\n const updateHeight = () => {\n if (poweredByRef.current) {\n setPoweredByHeight(poweredByRef.current.offsetHeight);\n }\n };\n\n updateHeight();\n window.addEventListener(\"resize\", updateHeight);\n\n return () => {\n window.removeEventListener(\"resize\", updateHeight);\n };\n }, [showMobilePoweredBy]);\n\n const mobileRootStyle: CSSProperties = {\n [\"--dk-mobile-footer-offset\" as any]: `${poweredByHeight}px`,\n };\n\n const renderSessionContent = () => {\n if (loading) {\n return <LoadingState />;\n }\n\n if (error) {\n return <ErrorState error={error} />;\n }\n\n if (isExpired) {\n return <SessionExpired onRetry={handleRetrySession} />;\n }\n\n return (\n <SessionContent\n step={step}\n loading={loading}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n stepHistory={history}\n userInput={userInput}\n setUserInput={setUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n />\n );\n };\n\n const mobileScrollPadding = showMobilePoweredBy\n ? `calc(${poweredByHeight}px + env(safe-area-inset-bottom, 0px))`\n : \"env(safe-area-inset-bottom, 0px)\";\n\n const currentTemplateNode = useMemo(() => {\n if (!session?.template || step < 1) {\n return null;\n }\n\n const templateIndex = Math.floor(step - 1);\n const orderedSteps = getOrderedJourneySteps(session.template);\n return orderedSteps[templateIndex] || null;\n }, [session?.template, step]);\n\n const shouldUseWideDesktopLayout =\n currentTemplateNode?.type === \"information-input\" &&\n currentTemplateNode.informationType === \"custom\" &&\n (currentTemplateNode.customFields || []).some(\n (field) => field.valueType === \"list\",\n );\n\n const [isRecordingSelfie, setIsRecordingSelfie] = useState(false);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const update = () =>\n setIsRecordingSelfie(\n document.body.classList.contains(\"recording-selfie\"),\n );\n update();\n const observer = new MutationObserver(update);\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n return () => observer.disconnect();\n }, []);\n\n const isCaptureStep =\n currentTemplateNode?.type === \"biometric-capture\" ||\n currentTemplateNode?.type === \"selfie-capture\" ||\n currentTemplateNode?.type === \"document-collection\" || // Could be upload, but safer to allow full height\n currentTemplateNode?.type === \"controle-jdi\";\n\n const btnBg = session?.template?.buttonBgColor ?? \"#11E5C5\";\n const btnText = session?.template?.buttonTextColor ?? \"#3C3C40\";\n\n return (\n <ConfigProvider apiBaseUrl={apiBaseUrl}>\n <DocumentProvider>\n <div\n className=\"sdk-session flex-1 flex flex-col\"\n style={\n {\n [\"--dk-btn-bg\" as string]: btnBg,\n [\"--dk-btn-text\" as string]: btnText,\n ...(isMobile\n ? {\n [\"--dk-mobile-scroll-padding\" as string]:\n mobileScrollPadding,\n }\n : undefined),\n } as CSSProperties\n }\n >\n {isMobile ? (\n <div\n className=\"flex h-full w-full flex-col bg-white\"\n style={mobileRootStyle}\n >\n <div\n className={`flex flex-1 min-h-0 flex-col ${isCaptureStep ? \"\" : \"overflow-y-auto\"}`}\n style={{\n paddingBottom: isCaptureStep\n ? \"0\"\n : \"var(--dk-mobile-scroll-padding, env(safe-area-inset-bottom, 0px))\",\n }}\n >\n <div className=\"flex flex-1 flex-col min-h-0\">\n {renderSessionContent()}\n </div>\n </div>\n {showMobilePoweredBy && (\n <div\n className=\"bg-white px-4 pt-3 pb-4 sm:px-6 sm:pt-6 sm:pb-6\"\n style={{\n paddingBottom:\n \"calc(env(safe-area-inset-bottom, 0px) + 0.5rem)\",\n }}\n ref={poweredByRef}\n >\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-center w-full min-h-screen bg-gray-100 py-12\">\n <div className=\"flex flex-col items-center justify-center\">\n <Paper\n className={`dk-session-paper flex flex-col h-[800px] px-8 py-10 bg-white rounded-2xl shadow-xl z-10 ${isRecordingSelfie\n ? \"\"\n : shouldUseWideDesktopLayout\n ? \"w-[98vw] max-w-[1500px]\"\n : \"w-[600px]\"\n }`}\n style={\n isRecordingSelfie\n ? { width: \"min(66vw, 942px)\" }\n : undefined\n }\n >\n <div className=\"flex-1 w-full h-full overflow-y-auto\">\n {renderSessionContent()}\n </div>\n </Paper>\n {showDesktopPoweredBy && (\n <div className=\"pt-6 text-center\">\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </DocumentProvider>\n </ConfigProvider>\n );\n};\n\nexport default DatakeenSession;\n"],"names":["useIsMobile","useClientInfo","useRouteCSS","useSessionData","useStepNavigation","useStepCSS","useTemplateLoader","useEffect","setSessionStore","getOrderedJourneySteps","_jsx","NoSessionIdState","useRef","useState","useLayoutEffect","LoadingState","ErrorState","SessionExpired","SessionContent","useMemo","ConfigProvider","DocumentProvider","__assign","_jsxs","PoweredBy","Paper"],"mappings":"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"}
@@ -11,6 +11,7 @@ var PageActions = require('../ui/PageActions.js');
11
11
  var SelectComponent = require('../ui/SelectComponent.js');
12
12
  var useI18n = require('../../hooks/useI18n.js');
13
13
  var MobilePageLayout = require('../ui/MobilePageLayout.js');
14
+ var NfcOnboardingNotice = require('../nfc-scan/NfcOnboardingNotice.js');
14
15
 
15
16
  var DOCUMENT_KEYS = [
16
17
  {
@@ -45,10 +46,10 @@ var DOCUMENT_KEYS = [
45
46
  },
46
47
  ];
47
48
  var JDIDocumentSelection = function (_a) {
48
- var onDocumentSelect = _a.onDocumentSelect, onBack = _a.onBack, documentTypeId = _a.documentTypeId, sessionId = _a.sessionId, chosenCountry = _a.chosenCountry, documentSelectionTitle = _a.documentSelectionTitle, documentSelectionDescription = _a.documentSelectionDescription;
49
- var _b = React.useState(""), selectedDocument = _b[0], setSelectedDocument = _b[1];
50
- var _c = React.useState(""), error = _c[0], setError = _c[1];
51
- var _d = React.useState([]), documentOptions = _d[0], setDocumentOptions = _d[1];
49
+ var onDocumentSelect = _a.onDocumentSelect, onBack = _a.onBack, documentTypeId = _a.documentTypeId, sessionId = _a.sessionId, chosenCountry = _a.chosenCountry, documentSelectionTitle = _a.documentSelectionTitle, documentSelectionDescription = _a.documentSelectionDescription, _b = _a.nfcEnabled, nfcEnabled = _b === void 0 ? false : _b;
50
+ var _c = React.useState(""), selectedDocument = _c[0], setSelectedDocument = _c[1];
51
+ var _d = React.useState(""), error = _d[0], setError = _d[1];
52
+ var _e = React.useState([]), documentOptions = _e[0], setDocumentOptions = _e[1];
52
53
  var t = useI18n.useI18n().t;
53
54
  // Récupérer les options de documents spécifiques à la session
54
55
  React.useEffect(function () {
@@ -107,7 +108,9 @@ var JDIDocumentSelection = function (_a) {
107
108
  case "income-proof":
108
109
  return t("jdi.document_selection.subtitle_income_proof");
109
110
  default:
110
- return t("jdi.document_selection.subtitle_identity");
111
+ return nfcEnabled
112
+ ? t("jdi.document_selection.subtitle_identity_nfc")
113
+ : t("jdi.document_selection.subtitle_identity");
111
114
  }
112
115
  };
113
116
  var getLabel = function () {
@@ -173,7 +176,7 @@ var JDIDocumentSelection = function (_a) {
173
176
  return (jsxRuntime.jsx(MobilePageLayout.default, { contentClassName: "h-full", footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: handleContinue, disabled: !selectedDocument, children: t("jdi.document_selection.continue") }), secondary: jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onBack, children: t("jdi.document_selection.back") }) }), 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", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: documentSelectionTitle || getTitle() }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: documentSelectionDescription || getSubtitle() })] }), jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("label", { className: "block text-sm font-medium text-gray-700 mb-2", children: [getLabel(), " *"] }), jsxRuntime.jsx(SelectComponent.Select, { options: documentOptions, value: selectedDocument, onValueChange: function (value) {
174
177
  setSelectedDocument(value);
175
178
  setError("");
176
- }, placeholder: getPlaceholder() }), error && (jsxRuntime.jsxs("p", { className: "mt-1 text-sm text-red-600 flex items-center", children: [jsxRuntime.jsx("span", { className: "mr-1", children: "\u26A0" }), error] }))] }), selectedDocument && (jsxRuntime.jsxs("div", { className: "bg-gray-50 border border-gray-200 rounded-lg p-4", children: [jsxRuntime.jsx("h3", { className: "font-medium text-gray-900 mb-2", children: t("jdi.document_selection.info_title") }), jsxRuntime.jsx("div", { className: "text-sm text-gray-700 space-y-1", children: getInstructions().map(function (instruction, index) { return (jsxRuntime.jsx("p", { children: instruction }, index)); }) })] }))] })] }) }) }));
179
+ }, placeholder: getPlaceholder() }), error && (jsxRuntime.jsxs("p", { className: "mt-1 text-sm text-red-600 flex items-center", children: [jsxRuntime.jsx("span", { className: "mr-1", children: "\u26A0" }), error] }))] }), selectedDocument && !nfcEnabled && (jsxRuntime.jsxs("div", { className: "bg-gray-50 border border-gray-200 rounded-lg p-4", children: [jsxRuntime.jsx("h3", { className: "font-medium text-gray-900 mb-2", children: t("jdi.document_selection.info_title") }), jsxRuntime.jsx("div", { className: "text-sm text-gray-700 space-y-1", children: getInstructions().map(function (instruction, index) { return (jsxRuntime.jsx("p", { children: instruction }, index)); }) })] })), nfcEnabled && jsxRuntime.jsx(NfcOnboardingNotice.default, {})] })] }) }) }));
177
180
  };
178
181
 
179
182
  exports.default = JDIDocumentSelection;
@@ -1 +1 @@
1
- {"version":3,"file":"JDIDocumentSelection.js","sources":["../../../../../src/components/jdi/JDIDocumentSelection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Select } from \"../ui/SelectComponent\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { AcceptedCountry } from \"../../types/session\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst DOCUMENT_KEYS: Array<{\n key: keyof AcceptedCountry[\"documents\"];\n value: string;\n translationKey: string;\n fallbackLabel: string;\n}> = [\n {\n key: \"passport\",\n value: \"passport\",\n translationKey: \"documentTypes.Passport\",\n fallbackLabel: \"Passeport\",\n },\n {\n key: \"idCard\",\n value: \"idCard\",\n translationKey: \"documentTypes.IdCard\",\n fallbackLabel: \"Carte nationale d'identité\",\n },\n {\n key: \"driverLicense\",\n value: \"driverLicense\",\n translationKey: \"documentTypes.Driving_license\",\n fallbackLabel: \"Permis de conduire\",\n },\n {\n key: \"residencePermit\",\n value: \"residencePermit\",\n translationKey: \"documentTypes.Residence_permit\",\n fallbackLabel: \"Titre de séjour\",\n },\n {\n key: \"pinkDriverLicense\",\n value: \"pinkDriverLicense\",\n translationKey: \"documentTypes.Pink_driving_license\",\n fallbackLabel: \"Permis de conduire rose (ancien format)\",\n },\n ];\n\ninterface JDIDocumentSelectionProps {\n onDocumentSelect: (documentType: string) => void;\n onBack: () => void;\n documentTypeId?: string; // ID du type de document (jdd, income-proof, etc.)\n sessionId?: string; // Session ID pour récupérer les options stockées\n chosenCountry?: AcceptedCountry; // Pays choisi par l'utilisateur\n documentSelectionTitle?: string;\n documentSelectionDescription?: string;\n}\n\nconst JDIDocumentSelection = ({\n onDocumentSelect,\n onBack,\n documentTypeId,\n sessionId,\n chosenCountry,\n documentSelectionTitle,\n documentSelectionDescription,\n}: JDIDocumentSelectionProps) => {\n const [selectedDocument, setSelectedDocument] = useState<string>(\"\");\n const [error, setError] = useState<string>(\"\");\n const [documentOptions, setDocumentOptions] = useState<\n { value: string; label: string }[]\n >([]);\n\n const { t } = useI18n();\n\n // Récupérer les options de documents spécifiques à la session\n useEffect(() => {\n console.log(\"Retrieving document options for session:\", sessionId);\n console.log(\"Chosen country:\", chosenCountry);\n if (chosenCountry?.documents) {\n const options = DOCUMENT_KEYS.filter(({ key }) => {\n const docs = chosenCountry.documents[key];\n return Array.isArray(docs) && docs.length > 0;\n }).map(({ value, translationKey, fallbackLabel }) => ({\n value,\n label: t(translationKey, fallbackLabel),\n }));\n console.log(\"Available document options:\", options);\n setDocumentOptions(options);\n } else {\n setDocumentOptions([]);\n }\n }, []);\n\n // SKIPPED if only one option, select it by default and skip to next step\n // useEffect(() => {\n // if (documentOptions.length === 1) {\n // setSelectedDocument(documentOptions[0].value);\n // setError(\"\");\n // onDocumentSelect(documentOptions[0].value);\n // }\n // }, [documentOptions, onDocumentSelect]);\n\n const handleContinue = () => {\n if (!selectedDocument) {\n setError(t(\"jdi.document_selection.error_select_document\"));\n return;\n }\n setError(\"\");\n\n onDocumentSelect(selectedDocument);\n };\n\n // Déterminer le titre en fonction du type de document\n const getTitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.title_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.title_income_proof\");\n default:\n return t(\"jdi.document_selection.title_identity\");\n }\n };\n\n const getSubtitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.subtitle_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.subtitle_income_proof\");\n default:\n return t(\"jdi.document_selection.subtitle_identity\");\n }\n };\n\n const getLabel = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.label_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.label_income_proof\");\n default:\n return t(\"jdi.document_selection.label_identity\");\n }\n };\n\n const getPlaceholder = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.placeholder_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.placeholder_income_proof\");\n default:\n return t(\"jdi.document_selection.placeholder_identity\");\n }\n };\n\n const getInstructions = () => {\n // Identity documents\n switch (selectedDocument) {\n case \"idCard\":\n return [\n t(\"jdi.document_selection.instructions.idCard.recto_verso\"),\n t(\"jdi.document_selection.instructions.idCard.readable\"),\n t(\"jdi.document_selection.instructions.idCard.valid\"),\n ];\n case \"passport\":\n return [\n t(\"jdi.document_selection.instructions.passport.photo_page\"),\n t(\"jdi.document_selection.instructions.passport.valid\"),\n t(\"jdi.document_selection.instructions.passport.readable\"),\n ];\n case \"driverLicense\":\n return [\n t(\"jdi.document_selection.instructions.driverLicense.recto_verso\"),\n t(\"jdi.document_selection.instructions.driverLicense.not_expired\"),\n t(\"jdi.document_selection.instructions.driverLicense.all_visible\"),\n ];\n case \"pinkDriverLicense\":\n return [\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.recto_verso\",\n \"Assurez-vous que le document soit visible\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.not_expired\",\n \"Vérifiez que le permis n'est pas expiré\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.all_visible\",\n \"Toutes les informations doivent être lisibles\",\n ),\n ];\n case \"residencePermit\":\n return [\n t(\"jdi.document_selection.instructions.residencePermit.recto_verso\"),\n t(\"jdi.document_selection.instructions.residencePermit.valid\"),\n t(\"jdi.document_selection.instructions.residencePermit.readable\"),\n ];\n default:\n return [\n t(\"jdi.document_selection.instructions.default.valid\"),\n t(\"jdi.document_selection.instructions.default.readable\"),\n ];\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button onClick={handleContinue} disabled={!selectedDocument}>\n {t(\"jdi.document_selection.continue\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.document_selection.back\")}\n </Button>\n }\n />\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 {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {documentSelectionTitle || getTitle()}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {documentSelectionDescription || getSubtitle()}\n </Subtitle>\n </div>\n\n {/* Document selection */}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n {getLabel()} *\n </label>\n <Select\n options={documentOptions}\n value={selectedDocument}\n onValueChange={(value) => {\n setSelectedDocument(value);\n setError(\"\");\n }}\n placeholder={getPlaceholder()}\n />\n {error && (\n <p className=\"mt-1 text-sm text-red-600 flex items-center\">\n <span className=\"mr-1\">⚠</span>\n {error}\n </p>\n )}\n </div>\n\n {/* Information about selected document */}\n {selectedDocument && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2\">\n {t(\"jdi.document_selection.info_title\")}\n </h3>\n <div className=\"text-sm text-gray-700 space-y-1\">\n {getInstructions().map((instruction, index) => (\n <p key={index}>{instruction}</p>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentSelection;\n"],"names":["useState","useI18n","useEffect","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","Select"],"mappings":"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"}
1
+ {"version":3,"file":"JDIDocumentSelection.js","sources":["../../../../../src/components/jdi/JDIDocumentSelection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Select } from \"../ui/SelectComponent\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { AcceptedCountry } from \"../../types/session\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport NfcOnboardingNotice from \"../nfc-scan/NfcOnboardingNotice\";\n\nconst DOCUMENT_KEYS: Array<{\n key: keyof AcceptedCountry[\"documents\"];\n value: string;\n translationKey: string;\n fallbackLabel: string;\n}> = [\n {\n key: \"passport\",\n value: \"passport\",\n translationKey: \"documentTypes.Passport\",\n fallbackLabel: \"Passeport\",\n },\n {\n key: \"idCard\",\n value: \"idCard\",\n translationKey: \"documentTypes.IdCard\",\n fallbackLabel: \"Carte nationale d'identité\",\n },\n {\n key: \"driverLicense\",\n value: \"driverLicense\",\n translationKey: \"documentTypes.Driving_license\",\n fallbackLabel: \"Permis de conduire\",\n },\n {\n key: \"residencePermit\",\n value: \"residencePermit\",\n translationKey: \"documentTypes.Residence_permit\",\n fallbackLabel: \"Titre de séjour\",\n },\n {\n key: \"pinkDriverLicense\",\n value: \"pinkDriverLicense\",\n translationKey: \"documentTypes.Pink_driving_license\",\n fallbackLabel: \"Permis de conduire rose (ancien format)\",\n },\n ];\n\ninterface JDIDocumentSelectionProps {\n onDocumentSelect: (documentType: string) => void;\n onBack: () => void;\n documentTypeId?: string; // ID du type de document (jdd, income-proof, etc.)\n sessionId?: string; // Session ID pour récupérer les options stockées\n chosenCountry?: AcceptedCountry; // Pays choisi par l'utilisateur\n documentSelectionTitle?: string;\n documentSelectionDescription?: string;\n nfcEnabled?: boolean; // Affiche l'onboarding NFC quand le parcours utilise la lecture sans contact\n}\n\nconst JDIDocumentSelection = ({\n onDocumentSelect,\n onBack,\n documentTypeId,\n sessionId,\n chosenCountry,\n documentSelectionTitle,\n documentSelectionDescription,\n nfcEnabled = false,\n}: JDIDocumentSelectionProps) => {\n const [selectedDocument, setSelectedDocument] = useState<string>(\"\");\n const [error, setError] = useState<string>(\"\");\n const [documentOptions, setDocumentOptions] = useState<\n { value: string; label: string }[]\n >([]);\n\n const { t } = useI18n();\n\n // Récupérer les options de documents spécifiques à la session\n useEffect(() => {\n console.log(\"Retrieving document options for session:\", sessionId);\n console.log(\"Chosen country:\", chosenCountry);\n if (chosenCountry?.documents) {\n const options = DOCUMENT_KEYS.filter(({ key }) => {\n const docs = chosenCountry.documents[key];\n return Array.isArray(docs) && docs.length > 0;\n }).map(({ value, translationKey, fallbackLabel }) => ({\n value,\n label: t(translationKey, fallbackLabel),\n }));\n console.log(\"Available document options:\", options);\n setDocumentOptions(options);\n } else {\n setDocumentOptions([]);\n }\n }, []);\n\n // SKIPPED if only one option, select it by default and skip to next step\n // useEffect(() => {\n // if (documentOptions.length === 1) {\n // setSelectedDocument(documentOptions[0].value);\n // setError(\"\");\n // onDocumentSelect(documentOptions[0].value);\n // }\n // }, [documentOptions, onDocumentSelect]);\n\n const handleContinue = () => {\n if (!selectedDocument) {\n setError(t(\"jdi.document_selection.error_select_document\"));\n return;\n }\n setError(\"\");\n\n onDocumentSelect(selectedDocument);\n };\n\n // Déterminer le titre en fonction du type de document\n const getTitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.title_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.title_income_proof\");\n default:\n return t(\"jdi.document_selection.title_identity\");\n }\n };\n\n const getSubtitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.subtitle_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.subtitle_income_proof\");\n default:\n return nfcEnabled\n ? t(\"jdi.document_selection.subtitle_identity_nfc\")\n : t(\"jdi.document_selection.subtitle_identity\");\n }\n };\n\n const getLabel = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.label_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.label_income_proof\");\n default:\n return t(\"jdi.document_selection.label_identity\");\n }\n };\n\n const getPlaceholder = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.placeholder_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.placeholder_income_proof\");\n default:\n return t(\"jdi.document_selection.placeholder_identity\");\n }\n };\n\n const getInstructions = () => {\n // Identity documents\n switch (selectedDocument) {\n case \"idCard\":\n return [\n t(\"jdi.document_selection.instructions.idCard.recto_verso\"),\n t(\"jdi.document_selection.instructions.idCard.readable\"),\n t(\"jdi.document_selection.instructions.idCard.valid\"),\n ];\n case \"passport\":\n return [\n t(\"jdi.document_selection.instructions.passport.photo_page\"),\n t(\"jdi.document_selection.instructions.passport.valid\"),\n t(\"jdi.document_selection.instructions.passport.readable\"),\n ];\n case \"driverLicense\":\n return [\n t(\"jdi.document_selection.instructions.driverLicense.recto_verso\"),\n t(\"jdi.document_selection.instructions.driverLicense.not_expired\"),\n t(\"jdi.document_selection.instructions.driverLicense.all_visible\"),\n ];\n case \"pinkDriverLicense\":\n return [\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.recto_verso\",\n \"Assurez-vous que le document soit visible\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.not_expired\",\n \"Vérifiez que le permis n'est pas expiré\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.all_visible\",\n \"Toutes les informations doivent être lisibles\",\n ),\n ];\n case \"residencePermit\":\n return [\n t(\"jdi.document_selection.instructions.residencePermit.recto_verso\"),\n t(\"jdi.document_selection.instructions.residencePermit.valid\"),\n t(\"jdi.document_selection.instructions.residencePermit.readable\"),\n ];\n default:\n return [\n t(\"jdi.document_selection.instructions.default.valid\"),\n t(\"jdi.document_selection.instructions.default.readable\"),\n ];\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button onClick={handleContinue} disabled={!selectedDocument}>\n {t(\"jdi.document_selection.continue\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.document_selection.back\")}\n </Button>\n }\n />\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 {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {documentSelectionTitle || getTitle()}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {documentSelectionDescription || getSubtitle()}\n </Subtitle>\n </div>\n\n {/* Document selection */}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n {getLabel()} *\n </label>\n <Select\n options={documentOptions}\n value={selectedDocument}\n onValueChange={(value) => {\n setSelectedDocument(value);\n setError(\"\");\n }}\n placeholder={getPlaceholder()}\n />\n {error && (\n <p className=\"mt-1 text-sm text-red-600 flex items-center\">\n <span className=\"mr-1\">⚠</span>\n {error}\n </p>\n )}\n </div>\n\n {/* Information about selected document — masqué en NFC (les instructions\n de téléversement ne s'appliquent pas, l'onboarding NFC les remplace) */}\n {selectedDocument && !nfcEnabled && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2\">\n {t(\"jdi.document_selection.info_title\")}\n </h3>\n <div className=\"text-sm text-gray-700 space-y-1\">\n {getInstructions().map((instruction, index) => (\n <p key={index}>{instruction}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* NFC onboarding — affiché uniquement quand le parcours utilise la lecture sans contact */}\n {nfcEnabled && <NfcOnboardingNotice />}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentSelection;\n"],"names":["useState","useI18n","useEffect","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","Select","NfcOnboardingNotice"],"mappings":";;;;;;;;;;;;;;;AAWA,IAAM,aAAa,GAKd;AACD,IAAA;AACE,QAAA,GAAG,EAAE,UAAU;AACf,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,cAAc,EAAE,wBAAwB;AACxC,QAAA,aAAa,EAAE,WAAW;AAC3B,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,cAAc,EAAE,sBAAsB;AACtC,QAAA,aAAa,EAAE,4BAA4B;AAC5C,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,eAAe;AACpB,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,cAAc,EAAE,+BAA+B;AAC/C,QAAA,aAAa,EAAE,oBAAoB;AACpC,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,iBAAiB;AACtB,QAAA,KAAK,EAAE,iBAAiB;AACxB,QAAA,cAAc,EAAE,gCAAgC;AAChD,QAAA,aAAa,EAAE,iBAAiB;AACjC,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,mBAAmB;AACxB,QAAA,KAAK,EAAE,mBAAmB;AAC1B,QAAA,cAAc,EAAE,oCAAoC;AACpD,QAAA,aAAa,EAAE,yCAAyC;AACzD,KAAA;CACF;AAaH,IAAM,oBAAoB,GAAG,UAAC,EASF,EAAA;QAR1B,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,aAAa,mBAAA,EACb,sBAAsB,GAAA,EAAA,CAAA,sBAAA,EACtB,4BAA4B,GAAA,EAAA,CAAA,4BAAA,EAC5B,EAAA,GAAA,EAAA,CAAA,UAAkB,EAAlB,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA;IAEZ,IAAA,EAAA,GAA0CA,cAAQ,CAAS,EAAE,CAAC,EAA7D,gBAAgB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAAwB;IAC9D,IAAA,EAAA,GAAoBA,cAAQ,CAAS,EAAE,CAAC,EAAvC,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAwB;IACxC,IAAA,EAAA,GAAwCA,cAAQ,CAEpD,EAAE,CAAC,EAFE,eAAe,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAErC;AAEG,IAAA,IAAA,CAAC,GAAKC,eAAO,EAAE,EAAd;;AAGT,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,SAAS,CAAC;AAClE,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAC7C,IAAI,aAAa,aAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,CAAE,SAAS,EAAE;AAC5B,YAAA,IAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,UAAC,EAAO,EAAA;AAAL,gBAAA,IAAA,GAAG,GAAA,EAAA,CAAA,GAAA;gBACzC,IAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC;AACzC,gBAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAC/C,YAAA,CAAC,CAAC,CAAC,GAAG,CAAC,UAAC,EAAwC,EAAA;AAAtC,gBAAA,IAAA,KAAK,WAAA,EAAE,cAAc,GAAA,EAAA,CAAA,cAAA,EAAE,aAAa,GAAA,EAAA,CAAA,aAAA;AAAO,gBAAA,QAAC;AACpD,oBAAA,KAAK,EAAA,KAAA;AACL,oBAAA,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC;iBACxC;AAHoD,YAAA,CAGnD,CAAC;AACH,YAAA,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC;YACnD,kBAAkB,CAAC,OAAO,CAAC;QAC7B;aAAO;YACL,kBAAkB,CAAC,EAAE,CAAC;QACxB;IACF,CAAC,EAAE,EAAE,CAAC;;;;;;;;;AAWN,IAAA,IAAM,cAAc,GAAG,YAAA;QACrB,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,QAAQ,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC;YAC3D;QACF;QACA,QAAQ,CAAC,EAAE,CAAC;QAEZ,gBAAgB,CAAC,gBAAgB,CAAC;AACpC,IAAA,CAAC;;AAGD,IAAA,IAAM,QAAQ,GAAG,YAAA;QACf,QAAQ,cAAc;AACpB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,CAAC,kCAAkC,CAAC;AAC9C,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAC,CAAC,2CAA2C,CAAC;AACvD,YAAA;AACE,gBAAA,OAAO,CAAC,CAAC,uCAAuC,CAAC;;AAEvD,IAAA,CAAC;AAED,IAAA,IAAM,WAAW,GAAG,YAAA;QAClB,QAAQ,cAAc;AACpB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,CAAC,qCAAqC,CAAC;AACjD,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAC,CAAC,8CAA8C,CAAC;AAC1D,YAAA;AACE,gBAAA,OAAO;AACL,sBAAE,CAAC,CAAC,8CAA8C;AAClD,sBAAE,CAAC,CAAC,0CAA0C,CAAC;;AAEvD,IAAA,CAAC;AAED,IAAA,IAAM,QAAQ,GAAG,YAAA;QACf,QAAQ,cAAc;AACpB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,CAAC,kCAAkC,CAAC;AAC9C,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAC,CAAC,2CAA2C,CAAC;AACvD,YAAA;AACE,gBAAA,OAAO,CAAC,CAAC,uCAAuC,CAAC;;AAEvD,IAAA,CAAC;AAED,IAAA,IAAM,cAAc,GAAG,YAAA;QACrB,QAAQ,cAAc;AACpB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,CAAC,wCAAwC,CAAC;AACpD,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAC,CAAC,iDAAiD,CAAC;AAC7D,YAAA;AACE,gBAAA,OAAO,CAAC,CAAC,6CAA6C,CAAC;;AAE7D,IAAA,CAAC;AAED,IAAA,IAAM,eAAe,GAAG,YAAA;;QAEtB,QAAQ,gBAAgB;AACtB,YAAA,KAAK,QAAQ;gBACX,OAAO;oBACL,CAAC,CAAC,wDAAwD,CAAC;oBAC3D,CAAC,CAAC,qDAAqD,CAAC;oBACxD,CAAC,CAAC,kDAAkD,CAAC;iBACtD;AACH,YAAA,KAAK,UAAU;gBACb,OAAO;oBACL,CAAC,CAAC,yDAAyD,CAAC;oBAC5D,CAAC,CAAC,oDAAoD,CAAC;oBACvD,CAAC,CAAC,uDAAuD,CAAC;iBAC3D;AACH,YAAA,KAAK,eAAe;gBAClB,OAAO;oBACL,CAAC,CAAC,+DAA+D,CAAC;oBAClE,CAAC,CAAC,+DAA+D,CAAC;oBAClE,CAAC,CAAC,+DAA+D,CAAC;iBACnE;AACH,YAAA,KAAK,mBAAmB;gBACtB,OAAO;AACL,oBAAA,CAAC,CACC,mEAAmE,EACnE,2CAA2C,CAC5C;AACD,oBAAA,CAAC,CACC,mEAAmE,EACnE,yCAAyC,CAC1C;AACD,oBAAA,CAAC,CACC,mEAAmE,EACnE,+CAA+C,CAChD;iBACF;AACH,YAAA,KAAK,iBAAiB;gBACpB,OAAO;oBACL,CAAC,CAAC,iEAAiE,CAAC;oBACpE,CAAC,CAAC,2DAA2D,CAAC;oBAC9D,CAAC,CAAC,8DAA8D,CAAC;iBAClE;AACH,YAAA;gBACE,OAAO;oBACL,CAAC,CAAC,mDAAmD,CAAC;oBACtD,CAAC,CAAC,sDAAsD,CAAC;iBAC1D;;AAEP,IAAA,CAAC;AAED,IAAA,QACEC,cAAA,CAACC,wBAAgB,EAAA,EACf,gBAAgB,EAAC,QAAQ,EACzB,MAAM,EACJD,cAAA,CAACE,mBAAW,EAAA,EACV,OAAO,EACLF,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAA,QAAA,EACzD,CAAC,CAAC,iCAAiC,CAAC,EAAA,CAC9B,EAEX,SAAS,EACPH,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,MAAM,EAAA,QAAA,EACxC,CAAC,CAAC,6BAA6B,CAAC,EAAA,CAC1B,EAAA,CAEX,EAAA,QAAA,EAGJH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CI,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAEhDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCJ,cAAA,CAACK,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,sBAAsB,IAAI,QAAQ,EAAE,EAAA,CAC/B,EACRL,cAAA,CAACM,gBAAQ,EAAA,EAAC,SAAS,EAAC,2DAA2D,EAAA,QAAA,EAC5E,4BAA4B,IAAI,WAAW,EAAE,EAAA,CACrC,CAAA,EAAA,CACP,EAGNF,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBA,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACEA,eAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAAA,CAC5D,QAAQ,EAAE,EAAA,IAAA,CAAA,EAAA,CACL,EACRJ,cAAA,CAACO,sBAAM,EAAA,EACL,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,UAAC,KAAK,EAAA;4CACnB,mBAAmB,CAAC,KAAK,CAAC;4CAC1B,QAAQ,CAAC,EAAE,CAAC;AACd,wCAAA,CAAC,EACD,WAAW,EAAE,cAAc,EAAE,EAAA,CAC7B,EACD,KAAK,KACJH,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAAA,CACxDJ,yBAAM,SAAS,EAAC,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,CAAS,EAC9B,KAAK,CAAA,EAAA,CACJ,CACL,CAAA,EAAA,CACG,EAIL,gBAAgB,IAAI,CAAC,UAAU,KAC9BI,yBAAK,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAAA,CAC/DJ,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gCAAgC,YAC3C,CAAC,CAAC,mCAAmC,CAAC,GACpC,EACLA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,YAC7C,eAAe,EAAE,CAAC,GAAG,CAAC,UAAC,WAAW,EAAE,KAAK,EAAA,EAAK,QAC7CA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAgB,WAAW,EAAA,EAAnB,KAAK,CAAmB,EACjC,CAF8C,CAE9C,CAAC,EAAA,CACE,IACF,CACP,EAGA,UAAU,IAAIA,cAAA,CAACQ,2BAAmB,EAAA,EAAA,CAAG,CAAA,EAAA,CAClC,IACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
@@ -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
+ * Symbole international du document biométrique (puce électronique), repris de
9
+ * assets/biometric.svg mais teinté avec la couleur primaire du SDK
10
+ * (var(--uni-primary-color)) au lieu du violet d'origine, pour rester aligné
11
+ * sur l'identité visuelle du parcours.
12
+ *
13
+ * C'est le pictogramme que l'utilisateur doit retrouver sur la couverture de son
14
+ * passeport ou sur sa carte d'identité pour confirmer la présence de la puce.
15
+ */
16
+ var BiometricSymbol = function (_a) {
17
+ var className = _a.className;
18
+ return (jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 120 80", className: className, role: "img", "aria-label": "Symbole du document biom\u00E9trique", children: [jsxRuntime.jsx("defs", { children: jsxRuntime.jsxs("mask", { id: "biometric-symbol-mask", children: [jsxRuntime.jsx("rect", { x: "0", y: "0", width: "120", height: "80", fill: "white" }), jsxRuntime.jsx("rect", { x: "0", y: "36", width: "120", height: "8", fill: "black" }), jsxRuntime.jsx("circle", { cx: "60", cy: "40", r: "16", fill: "black" })] }) }), jsxRuntime.jsxs("g", { fill: "var(--uni-primary-color, #11e5c5)", children: [jsxRuntime.jsx("rect", { x: "10", y: "15", width: "100", height: "50", rx: "3", mask: "url(#biometric-symbol-mask)" }), jsxRuntime.jsx("circle", { cx: "60", cy: "40", r: "9" })] })] }));
19
+ };
20
+
21
+ exports.default = BiometricSymbol;
22
+ //# sourceMappingURL=BiometricSymbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BiometricSymbol.js","sources":["../../../../../src/components/nfc-scan/BiometricSymbol.tsx"],"sourcesContent":["interface BiometricSymbolProps {\n className?: string;\n}\n\n/**\n * Symbole international du document biométrique (puce électronique), repris de\n * assets/biometric.svg mais teinté avec la couleur primaire du SDK\n * (var(--uni-primary-color)) au lieu du violet d'origine, pour rester aligné\n * sur l'identité visuelle du parcours.\n *\n * C'est le pictogramme que l'utilisateur doit retrouver sur la couverture de son\n * passeport ou sur sa carte d'identité pour confirmer la présence de la puce.\n */\nconst BiometricSymbol = ({ className }: BiometricSymbolProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 120 80\"\n className={className}\n role=\"img\"\n aria-label=\"Symbole du document biométrique\"\n >\n <defs>\n <mask id=\"biometric-symbol-mask\">\n <rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" fill=\"white\" />\n <rect x=\"0\" y=\"36\" width=\"120\" height=\"8\" fill=\"black\" />\n <circle cx=\"60\" cy=\"40\" r=\"16\" fill=\"black\" />\n </mask>\n </defs>\n\n <g fill=\"var(--uni-primary-color, #11e5c5)\">\n <rect\n x=\"10\"\n y=\"15\"\n width=\"100\"\n height=\"50\"\n rx=\"3\"\n mask=\"url(#biometric-symbol-mask)\"\n />\n <circle cx=\"60\" cy=\"40\" r=\"9\" />\n </g>\n </svg>\n );\n};\n\nexport default BiometricSymbol;\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAIA;;;;;;;;AAQG;AACH,IAAM,eAAe,GAAG,UAAC,EAAmC,EAAA;AAAjC,IAAA,IAAA,SAAS,GAAA,EAAA,CAAA,SAAA;AAClC,IAAA,QACEA,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,YAAY,EACpB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,KAAK,EAAA,YAAA,EACC,sCAAiC,EAAA,QAAA,EAAA,CAE5CC,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EACED,0BAAM,EAAE,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAC9BC,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,EACzDA,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,EACzDA,cAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,CAAA,EAAA,CACzC,EAAA,CACF,EAEPD,eAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAC,mCAAmC,EAAA,QAAA,EAAA,CACzCC,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,IAAI,EACN,CAAC,EAAC,IAAI,EACN,KAAK,EAAC,KAAK,EACX,MAAM,EAAC,IAAI,EACX,EAAE,EAAC,GAAG,EACN,IAAI,EAAC,6BAA6B,EAAA,CAClC,EACFA,cAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAA,CAAG,CAAA,EAAA,CAC9B,CAAA,EAAA,CACA;AAEV;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var Title = require('../ui/Title.js');
7
+ var Subtitle = require('../ui/Subtitle.js');
8
+ var Button = require('../ui/Button.js');
9
+ var PageActions = require('../ui/PageActions.js');
10
+ var MobilePageLayout = require('../ui/MobilePageLayout.js');
11
+ var useI18n = require('../../hooks/useI18n.js');
12
+ var BiometricSymbol = require('./BiometricSymbol.js');
13
+ var PuceCniSymbol = require('./PuceCniSymbol.js');
14
+
15
+ /**
16
+ * Écran d'entrée du nœud NFC, façon "persona".
17
+ *
18
+ * Affiche le symbole du document biométrique (teinté à la couleur primaire) et
19
+ * demande à l'utilisateur s'il figure sur son passeport (couverture) ou sa carte
20
+ * d'identité (recto/verso). Cela évite d'engager dans un parcours NFC un
21
+ * utilisateur dont le document n'a pas de puce.
22
+ *
23
+ * - Oui → on poursuit le parcours NFC (onConfirm)
24
+ * - Non → on passe au nœud suivant (onNoChip)
25
+ */
26
+ var NfcChipGate = function (_a) {
27
+ var onConfirm = _a.onConfirm, onNoChip = _a.onNoChip;
28
+ var t = useI18n.useI18n().t;
29
+ return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx(PageActions.default, { className: "flex-wrap justify-center!", primary: jsxRuntime.jsx(Button.default, { onClick: onConfirm, children: t("nfc_scan.chip_gate.confirm", "Oui") }), secondary: jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onNoChip, className: "whitespace-nowrap", children: t("nfc_scan.chip_gate.no_chip", "Non, je n'ai ni symbole ni puce") }) }), 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-8", children: [jsxRuntime.jsxs("div", { className: "text-center space-y-4", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: t("nfc_scan.chip_gate.title", "Votre document possède-t-il ce symbole et/ou une puce électronique ?") }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: t("nfc_scan.chip_gate.subtitle", "Ce parcours lit la puce électronique sans contact de votre pièce d'identité. Repérez ce symbole ou une puce électronique sur votre document.") })] }), jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-6", children: [jsxRuntime.jsx(BiometricSymbol.default, { className: "h-auto w-50 md:w-32" }), jsxRuntime.jsx(PuceCniSymbol.default, { className: "h-auto w-50 md:w-32" })] }), jsxRuntime.jsxs("div", { className: "rounded-2xl border p-4 text-sm leading-relaxed text-gray-700", style: {
30
+ borderColor: "var(--uni-light-color-variant-2, #b2ece5)",
31
+ backgroundColor: "var(--uni-light-color-variant-1, #d0f7f2)",
32
+ }, children: [jsxRuntime.jsx("p", { className: "mb-1", children: t("nfc_scan.chip_gate.hint_passport", "Sur un passeport, ce symbole figure sur la couverture.") }), jsxRuntime.jsx("p", { children: t("nfc_scan.chip_gate.hint_card", "Sur une carte d'identité ou un titre de séjour, repérez ce symbole ou une puce électronique au recto ou au verso.") })] })] }) }) }));
33
+ };
34
+
35
+ exports.default = NfcChipGate;
36
+ //# sourceMappingURL=NfcChipGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NfcChipGate.js","sources":["../../../../../src/components/nfc-scan/NfcChipGate.tsx"],"sourcesContent":["import React from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport BiometricSymbol from \"./BiometricSymbol\";\nimport PuceCniSymbol from \"./PuceCniSymbol\";\n\ninterface NfcChipGateProps {\n /** L'utilisateur confirme que son document porte le symbole → flux NFC */\n onConfirm: () => void;\n /** L'utilisateur n'a pas ce symbole → on saute le nœud (nœud suivant) */\n onNoChip: () => void;\n}\n\n/**\n * Écran d'entrée du nœud NFC, façon \"persona\".\n *\n * Affiche le symbole du document biométrique (teinté à la couleur primaire) et\n * demande à l'utilisateur s'il figure sur son passeport (couverture) ou sa carte\n * d'identité (recto/verso). Cela évite d'engager dans un parcours NFC un\n * utilisateur dont le document n'a pas de puce.\n *\n * - Oui → on poursuit le parcours NFC (onConfirm)\n * - Non → on passe au nœud suivant (onNoChip)\n */\nconst NfcChipGate = ({ onConfirm, onNoChip }: NfcChipGateProps) => {\n const { t } = useI18n();\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n className=\"flex-wrap justify-center!\"\n primary={\n <Button onClick={onConfirm}>\n {t(\"nfc_scan.chip_gate.confirm\", \"Oui\")}\n </Button>\n }\n secondary={\n <Button\n variant=\"secondary\"\n onClick={onNoChip}\n className=\"whitespace-nowrap\"\n >\n {t(\"nfc_scan.chip_gate.no_chip\", \"Non, je n'ai ni symbole ni puce\")}\n </Button>\n }\n />\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-8\">\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\n \"nfc_scan.chip_gate.title\",\n \"Votre document possède-t-il ce symbole et/ou une puce électronique ?\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {t(\n \"nfc_scan.chip_gate.subtitle\",\n \"Ce parcours lit la puce électronique sans contact de votre pièce d'identité. Repérez ce symbole ou une puce électronique sur votre document.\",\n )}\n </Subtitle>\n </div>\n\n {/* Symbole biométrique + puce CNI, côte à côte, aux couleurs du SDK */}\n <div className=\"flex items-center justify-center gap-6\">\n <BiometricSymbol className=\"h-auto w-50 md:w-32\" />\n <PuceCniSymbol className=\"h-auto w-50 md:w-32\" />\n </div>\n\n {/* Où chercher le symbole */}\n <div\n className=\"rounded-2xl border p-4 text-sm leading-relaxed text-gray-700\"\n style={{\n borderColor: \"var(--uni-light-color-variant-2, #b2ece5)\",\n backgroundColor: \"var(--uni-light-color-variant-1, #d0f7f2)\",\n }}\n >\n <p className=\"mb-1\">\n {t(\n \"nfc_scan.chip_gate.hint_passport\",\n \"Sur un passeport, ce symbole figure sur la couverture.\",\n )}\n </p>\n <p>\n {t(\n \"nfc_scan.chip_gate.hint_card\",\n \"Sur une carte d'identité ou un titre de séjour, repérez ce symbole ou une puce électronique au recto ou au verso.\",\n )}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcChipGate;\n"],"names":["useI18n","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","BiometricSymbol","PuceCniSymbol"],"mappings":";;;;;;;;;;;;;;AAiBA;;;;;;;;;;AAUG;AACH,IAAM,WAAW,GAAG,UAAC,EAAyC,EAAA;QAAvC,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,QAAA;AAChC,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;AAET,IAAA,QACEC,cAAA,CAACC,wBAAgB,EAAA,EACf,MAAM,EACJD,cAAA,CAACE,mBAAW,EAAA,EACV,SAAS,EAAC,2BAA2B,EACrC,OAAO,EACLF,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAE,SAAS,EAAA,QAAA,EACvB,CAAC,CAAC,4BAA4B,EAAE,KAAK,CAAC,GAChC,EAEX,SAAS,EACPH,cAAA,CAACG,cAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAE5B,CAAC,CAAC,4BAA4B,EAAE,iCAAiC,CAAC,EAAA,CAC5D,EAAA,CAEX,EAAA,QAAA,EAGJH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CI,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCJ,cAAA,CAACK,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,CAAC,CACA,0BAA0B,EAC1B,sEAAsE,CACvE,EAAA,CACK,EACRL,cAAA,CAACM,gBAAQ,EAAA,EAAC,SAAS,EAAC,2DAA2D,EAAA,QAAA,EAC5E,CAAC,CACA,6BAA6B,EAC7B,8IAA8I,CAC/I,EAAA,CACQ,CAAA,EAAA,CACP,EAGNF,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CACrDJ,cAAA,CAACO,uBAAe,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,CAAG,EACnDP,cAAA,CAACQ,qBAAa,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,CAAG,CAAA,EAAA,CAC7C,EAGNJ,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE;AACL,4BAAA,WAAW,EAAE,2CAA2C;AACxD,4BAAA,eAAe,EAAE,2CAA2C;yBAC7D,EAAA,QAAA,EAAA,CAEDJ,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,MAAM,EAAA,QAAA,EAChB,CAAC,CACA,kCAAkC,EAClC,wDAAwD,CACzD,EAAA,CACC,EACJA,gCACG,CAAC,CACA,8BAA8B,EAC9B,mHAAmH,CACpH,EAAA,CACC,CAAA,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
7
+ var Title = require('../ui/Title.js');
8
+ var Subtitle = require('../ui/Subtitle.js');
9
+ var Button = require('../ui/Button.js');
10
+ var PageActions = require('../ui/PageActions.js');
11
+ var MobilePageLayout = require('../ui/MobilePageLayout.js');
12
+ var useI18n = require('../../hooks/useI18n.js');
13
+
14
+ var REASON_KEYS = [
15
+ "reason_no_id",
16
+ "reason_no_nfc",
17
+ "reason_unknown_nfc",
18
+ "reason_not_comfortable",
19
+ "reason_other",
20
+ ];
21
+ var REASON_FALLBACKS = {
22
+ reason_no_id: "Je n'ai pas ma pièce d'identité avec moi",
23
+ reason_no_nfc: "Ma pièce d'identité n'a pas de puce",
24
+ reason_unknown_nfc: "Je ne sais pas si ma pièce a une puce",
25
+ reason_not_comfortable: "Je ne souhaite pas utiliser le scan sans contact",
26
+ reason_other: "Autre raison",
27
+ };
28
+ /**
29
+ * Questionnaire de fallback affiché lorsqu'un utilisateur déclare ne pas pouvoir
30
+ * utiliser le scan NFC (écran NfcChipGate → "Non"). À la manière de Persona, on
31
+ * recueille la raison pour aider les reviewers côté backoffice avant de poursuivre.
32
+ *
33
+ * La sélection d'une raison est obligatoire ; un commentaire libre optionnel
34
+ * apparaît lorsque "Autre raison" est choisi.
35
+ */
36
+ var NfcFallbackSurvey = function (_a) {
37
+ var onSubmit = _a.onSubmit;
38
+ var t = useI18n.useI18n().t;
39
+ var _b = React.useState(null), selectedReason = _b[0], setSelectedReason = _b[1];
40
+ var _c = React.useState(""), comment = _c[0], setComment = _c[1];
41
+ var handleSubmit = function () {
42
+ if (!selectedReason)
43
+ return;
44
+ var label = t("nfc_scan.fallback.".concat(selectedReason), REASON_FALLBACKS[selectedReason]);
45
+ var trimmedComment = comment.trim();
46
+ onSubmit(selectedReason, label, selectedReason === "reason_other" && trimmedComment
47
+ ? trimmedComment
48
+ : undefined);
49
+ };
50
+ return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: handleSubmit, disabled: !selectedReason, children: t("nfc_scan.fallback.continue", "Continuer") }) }), 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", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: t("nfc_scan.fallback.title", "Aidez-nous à comprendre") }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: t("nfc_scan.fallback.subtitle", "Pour quelle raison ne pouvez-vous pas utiliser le scan sans contact ?") })] }), jsxRuntime.jsx("div", { className: "space-y-3", children: REASON_KEYS.map(function (reasonKey) {
51
+ var isSelected = selectedReason === reasonKey;
52
+ return (jsxRuntime.jsxs("button", { type: "button", onClick: function () { return setSelectedReason(reasonKey); }, "aria-pressed": isSelected, className: "flex w-full items-center gap-3 rounded-xl border-2 p-4 text-left transition-colors", style: {
53
+ borderColor: isSelected
54
+ ? "var(--uni-primary-color, #11e5c5)"
55
+ : "#e5e7eb",
56
+ backgroundColor: isSelected
57
+ ? "var(--uni-light-color-variant-1, #d0f7f2)"
58
+ : "#ffffff",
59
+ }, children: [jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2", style: {
60
+ borderColor: isSelected
61
+ ? "var(--uni-primary-color, #11e5c5)"
62
+ : "#d1d5db",
63
+ }, children: isSelected && (jsxRuntime.jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: {
64
+ backgroundColor: "var(--uni-primary-color, #11e5c5)",
65
+ } })) }), jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-900", children: t("nfc_scan.fallback.".concat(reasonKey), REASON_FALLBACKS[reasonKey]) })] }, reasonKey));
66
+ }) }), selectedReason === "reason_other" && (jsxRuntime.jsx("textarea", { value: comment, onChange: function (e) { return setComment(e.target.value); }, maxLength: 1000, rows: 3, placeholder: t("nfc_scan.fallback.comment_placeholder", "Précisez votre raison (optionnel)"), className: "w-full resize-none rounded-xl border-2 border-gray-200 p-3 text-sm text-gray-900 focus:outline-none" }))] }) }) }));
67
+ };
68
+
69
+ exports.default = NfcFallbackSurvey;
70
+ //# sourceMappingURL=NfcFallbackSurvey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NfcFallbackSurvey.js","sources":["../../../../../src/components/nfc-scan/NfcFallbackSurvey.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface NfcFallbackSurveyProps {\n /**\n * Validation du questionnaire.\n * @param reason clé technique de la raison sélectionnée\n * @param label libellé lisible (traduit) — stocké tel quel côté backoffice\n * @param comment commentaire libre optionnel (uniquement si \"autre\")\n */\n onSubmit: (reason: string, label: string, comment?: string) => void;\n}\n\nconst REASON_KEYS = [\n \"reason_no_id\",\n \"reason_no_nfc\",\n \"reason_unknown_nfc\",\n \"reason_not_comfortable\",\n \"reason_other\",\n] as const;\n\ntype ReasonKey = (typeof REASON_KEYS)[number];\n\nconst REASON_FALLBACKS: Record<ReasonKey, string> = {\n reason_no_id: \"Je n'ai pas ma pièce d'identité avec moi\",\n reason_no_nfc: \"Ma pièce d'identité n'a pas de puce\",\n reason_unknown_nfc: \"Je ne sais pas si ma pièce a une puce\",\n reason_not_comfortable: \"Je ne souhaite pas utiliser le scan sans contact\",\n reason_other: \"Autre raison\",\n};\n\n/**\n * Questionnaire de fallback affiché lorsqu'un utilisateur déclare ne pas pouvoir\n * utiliser le scan NFC (écran NfcChipGate → \"Non\"). À la manière de Persona, on\n * recueille la raison pour aider les reviewers côté backoffice avant de poursuivre.\n *\n * La sélection d'une raison est obligatoire ; un commentaire libre optionnel\n * apparaît lorsque \"Autre raison\" est choisi.\n */\nconst NfcFallbackSurvey = ({ onSubmit }: NfcFallbackSurveyProps) => {\n const { t } = useI18n();\n const [selectedReason, setSelectedReason] = useState<ReasonKey | null>(null);\n const [comment, setComment] = useState(\"\");\n\n const handleSubmit = () => {\n if (!selectedReason) return;\n const label = t(\n `nfc_scan.fallback.${selectedReason}`,\n REASON_FALLBACKS[selectedReason],\n );\n const trimmedComment = comment.trim();\n onSubmit(\n selectedReason,\n label,\n selectedReason === \"reason_other\" && trimmedComment\n ? trimmedComment\n : undefined,\n );\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={handleSubmit} disabled={!selectedReason}>\n {t(\"nfc_scan.fallback.continue\", \"Continuer\")}\n </Button>\n }\n />\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(\"nfc_scan.fallback.title\", \"Aidez-nous à comprendre\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {t(\n \"nfc_scan.fallback.subtitle\",\n \"Pour quelle raison ne pouvez-vous pas utiliser le scan sans contact ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"space-y-3\">\n {REASON_KEYS.map((reasonKey) => {\n const isSelected = selectedReason === reasonKey;\n return (\n <button\n key={reasonKey}\n type=\"button\"\n onClick={() => setSelectedReason(reasonKey)}\n aria-pressed={isSelected}\n className=\"flex w-full items-center gap-3 rounded-xl border-2 p-4 text-left transition-colors\"\n style={{\n borderColor: isSelected\n ? \"var(--uni-primary-color, #11e5c5)\"\n : \"#e5e7eb\",\n backgroundColor: isSelected\n ? \"var(--uni-light-color-variant-1, #d0f7f2)\"\n : \"#ffffff\",\n }}\n >\n <span\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2\"\n style={{\n borderColor: isSelected\n ? \"var(--uni-primary-color, #11e5c5)\"\n : \"#d1d5db\",\n }}\n >\n {isSelected && (\n <span\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{\n backgroundColor: \"var(--uni-primary-color, #11e5c5)\",\n }}\n />\n )}\n </span>\n <span className=\"text-sm font-medium text-gray-900\">\n {t(\n `nfc_scan.fallback.${reasonKey}`,\n REASON_FALLBACKS[reasonKey],\n )}\n </span>\n </button>\n );\n })}\n </div>\n\n {selectedReason === \"reason_other\" && (\n <textarea\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n maxLength={1000}\n rows={3}\n placeholder={t(\n \"nfc_scan.fallback.comment_placeholder\",\n \"Précisez votre raison (optionnel)\",\n )}\n className=\"w-full resize-none rounded-xl border-2 border-gray-200 p-3 text-sm text-gray-900 focus:outline-none\"\n />\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcFallbackSurvey;\n"],"names":["useI18n","useState","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var lucideReact = require('lucide-react');
7
+ var useI18n = require('../../hooks/useI18n.js');
8
+
9
+ /**
10
+ * Encart pédagogique affiché sur la page de choix de document lorsque le parcours
11
+ * utilise l'option NFC. Il prépare l'utilisateur aux étapes inhabituelles à venir
12
+ * (document physique en main, scan d'un QR code, ouverture d'une application externe)
13
+ * afin de limiter la rupture de flux et l'abandon.
14
+ *
15
+ * Affiché uniquement quand `nfcEnabled` est vrai côté nœud — sinon la page de choix
16
+ * de document conserve son affichage classique.
17
+ */
18
+ var NfcOnboardingNotice = function () {
19
+ var t = useI18n.useI18n().t;
20
+ var steps = [
21
+ {
22
+ Icon: lucideReact.Wallet,
23
+ title: t("nfc_scan.onboarding.step_document_title", "Préparez votre document"),
24
+ description: t("nfc_scan.onboarding.step_document_description", "Sortez votre document d'identité physique, vous en aurez besoin pour la lecture de la puce électronique."),
25
+ },
26
+ {
27
+ Icon: lucideReact.QrCode,
28
+ title: t("nfc_scan.onboarding.step_qr_title", "Scannez un QR code"),
29
+ description: t("nfc_scan.onboarding.step_qr_description", "Après votre choix, un QR code s'affichera : scannez-le avec votre smartphone."),
30
+ },
31
+ {
32
+ Icon: lucideReact.Smartphone,
33
+ title: t("nfc_scan.onboarding.step_app_title", "Ouvrez l'application sécurisée"),
34
+ description: t("nfc_scan.onboarding.step_app_description", "Le QR code ouvre une application externe dédiée pour scanner et lire la puce électronique de votre document."),
35
+ },
36
+ ];
37
+ return (jsxRuntime.jsxs("div", { className: "rounded-2xl border border-teal-200 bg-teal-50 p-4 md:p-5", children: [jsxRuntime.jsxs("h3", { className: "mb-3 flex items-center gap-2 text-sm font-semibold text-teal-900", children: [jsxRuntime.jsx(lucideReact.QrCode, { size: 18, "aria-hidden": "true", className: "shrink-0" }), t("nfc_scan.onboarding.title", "Lecture sans contact (NFC)")] }), jsxRuntime.jsx("p", { className: "mb-4 text-sm leading-relaxed text-teal-800", children: t("nfc_scan.onboarding.intro", "Ce parcours utilise la lecture sans contact de la puce électronique de votre document. Voici les étapes à venir :") }), jsxRuntime.jsx("ol", { className: "space-y-3", children: steps.map(function (_a, index) {
38
+ var Icon = _a.Icon, title = _a.title, description = _a.description;
39
+ return (jsxRuntime.jsxs("li", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("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", children: jsxRuntime.jsx(Icon, { size: 18, "aria-hidden": "true" }) }), jsxRuntime.jsxs("div", { className: "min-w-0", children: [jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900", children: title }), jsxRuntime.jsx("p", { className: "text-sm leading-relaxed text-gray-600", children: description })] })] }, index));
40
+ }) })] }));
41
+ };
42
+
43
+ exports.default = NfcOnboardingNotice;
44
+ //# sourceMappingURL=NfcOnboardingNotice.js.map