datakeen-session-react 1.1.140-dev.97 → 1.1.140-oid4vp-demo.0

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 (48) hide show
  1. package/.gitlab-ci.yml +37 -0
  2. package/dist/cjs/components/document-collection/DocumentCollection.js +132 -22
  3. package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
  4. package/dist/cjs/components/session/DocumentCheck.js +112 -15
  5. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  6. package/dist/cjs/components/template/TemplateNodeRenderer.js +5 -1
  7. package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
  8. package/dist/cjs/components/wallet/AgeControl.js +75 -0
  9. package/dist/cjs/components/wallet/AgeControl.js.map +1 -0
  10. package/dist/cjs/components/wallet/WalletProposal.js +27 -0
  11. package/dist/cjs/components/wallet/WalletProposal.js.map +1 -0
  12. package/dist/cjs/components/wallet/WalletSuccessAnimation.js +37 -0
  13. package/dist/cjs/components/wallet/WalletSuccessAnimation.js.map +1 -0
  14. package/dist/cjs/components/wallet/WalletVerificationStep.js +132 -0
  15. package/dist/cjs/components/wallet/WalletVerificationStep.js.map +1 -0
  16. package/dist/cjs/hooks/useWalletSseStatus.js +67 -0
  17. package/dist/cjs/hooks/useWalletSseStatus.js.map +1 -0
  18. package/dist/cjs/i18n/en.json.js +34 -1
  19. package/dist/cjs/i18n/en.json.js.map +1 -1
  20. package/dist/cjs/i18n/fr.json.js +34 -1
  21. package/dist/cjs/i18n/fr.json.js.map +1 -1
  22. package/dist/cjs/services/sessionService.js +57 -0
  23. package/dist/cjs/services/sessionService.js.map +1 -1
  24. package/dist/cjs/types/session.js.map +1 -1
  25. package/dist/esm/components/document-collection/DocumentCollection.js +132 -22
  26. package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
  27. package/dist/esm/components/session/DocumentCheck.js +113 -16
  28. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  29. package/dist/esm/components/template/TemplateNodeRenderer.js +5 -1
  30. package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
  31. package/dist/esm/components/wallet/AgeControl.js +71 -0
  32. package/dist/esm/components/wallet/AgeControl.js.map +1 -0
  33. package/dist/esm/components/wallet/WalletProposal.js +23 -0
  34. package/dist/esm/components/wallet/WalletProposal.js.map +1 -0
  35. package/dist/esm/components/wallet/WalletSuccessAnimation.js +33 -0
  36. package/dist/esm/components/wallet/WalletSuccessAnimation.js.map +1 -0
  37. package/dist/esm/components/wallet/WalletVerificationStep.js +128 -0
  38. package/dist/esm/components/wallet/WalletVerificationStep.js.map +1 -0
  39. package/dist/esm/hooks/useWalletSseStatus.js +65 -0
  40. package/dist/esm/hooks/useWalletSseStatus.js.map +1 -0
  41. package/dist/esm/i18n/en.json.js +33 -2
  42. package/dist/esm/i18n/en.json.js.map +1 -1
  43. package/dist/esm/i18n/fr.json.js +33 -2
  44. package/dist/esm/i18n/fr.json.js.map +1 -1
  45. package/dist/esm/services/sessionService.js +55 -1
  46. package/dist/esm/services/sessionService.js.map +1 -1
  47. package/dist/esm/types/session.js.map +1 -1
  48. package/package.json +1 -1
@@ -19,7 +19,28 @@ import { analyzeFiles } from '../../services/analysis.js';
19
19
  import { getNodeRetryCount, incrementNodeRetryCount } from '../../services/retryService.js';
20
20
  import { getSession } from '../../context/SessionContext.js';
21
21
  import { blobToDataUrl, dataUrlToBlob, resizeAfterCapture } from '../../utils/imageProcessing.js';
22
+ import { fetchWallets, skipWalletWithReason } from '../../services/sessionService.js';
23
+ import WalletProposal from '../wallet/WalletProposal.js';
24
+ import WalletVerificationStep from '../wallet/WalletVerificationStep.js';
22
25
 
26
+ var normalizeWalletMode = function (mode) {
27
+ return mode === "walletOnly" ? "walletOnly" : "walletOrPhoto";
28
+ };
29
+ /**
30
+ * Heuristic mapping from a document-collection template's id/name to the
31
+ * wallet credential it corresponds to. `allowedDocumentTypes` are arbitrary,
32
+ * backend-template-driven strings (no fixed enum), so this is name-based —
33
+ * cf. docs/WALLET_OID4VP_IMPLEMENTATION_PLAN.md §7 ("option wallet quand le
34
+ * type collecté ∈ {permis, carte grise}").
35
+ */
36
+ var resolveWalletCredentialType = function (docTypeIdOrName) {
37
+ var normalized = docTypeIdOrName.toLowerCase();
38
+ if (/(licence|license|permis|driving)/.test(normalized))
39
+ return "driving_license";
40
+ if (/(grise|registration|immatriculation|vehicle)/.test(normalized))
41
+ return "vehicle_registration";
42
+ return null;
43
+ };
23
44
  /**
24
45
  * DocumentCollection component manages the multi-step document collection flow.
25
46
  * It handles document type selection, document upload, processing, and error/success handling.
@@ -44,21 +65,23 @@ import { blobToDataUrl, dataUrlToBlob, resizeAfterCapture } from '../../utils/im
44
65
  */
45
66
  var DocumentCollection = function (_a) {
46
67
  var _b, _c;
47
- var stepObject = _a.stepObject, sessionId = _a.sessionId, node = _a.node, template = _a.template, onContinueOnPC = _a.onContinueOnPC, allowedDocumentTypes = _a.allowedDocumentTypes, allowedAddingMethods = _a.allowedAddingMethods, introductionPage = _a.introductionPage, documentSelection = _a.documentSelection, allowResubmission = _a.allowResubmission, maxResubmissionAttempts = _a.maxResubmissionAttempts;
68
+ var stepObject = _a.stepObject, sessionId = _a.sessionId, node = _a.node, template = _a.template, onContinueOnPC = _a.onContinueOnPC, allowedDocumentTypes = _a.allowedDocumentTypes, allowedAddingMethods = _a.allowedAddingMethods, introductionPage = _a.introductionPage, documentSelection = _a.documentSelection, allowResubmission = _a.allowResubmission, maxResubmissionAttempts = _a.maxResubmissionAttempts, countryCode = _a.countryCode;
48
69
  var t = useI18n().t;
49
70
  var session = getSession().session;
50
71
  var _d = useState((introductionPage === null || introductionPage === void 0 ? void 0 : introductionPage.title) ? 0 : 1), currentStep = _d[0], setCurrentStep = _d[1];
51
- var _e = useState(null), fileUploaded = _e[0], setFileUploaded = _e[1];
52
- var _f = useState(""), selectedDocumentType = _f[0], setSelectedDocumentType = _f[1];
53
- var _g = useState(null), analysisData = _g[0], setAnalysisData = _g[1];
54
- var _h = useState(null), errorCode = _h[0], setErrorCode = _h[1];
55
- var _j = useState(null), selectedMethod = _j[0], setSelectedMethod = _j[1];
56
- var _k = useState("before-recto"), photoSubStep = _k[0], setPhotoSubStep = _k[1];
57
- var _l = useState({}), capturedImages = _l[0], setCapturedImages = _l[1];
72
+ var _e = useState(false), walletDeclined = _e[0], setWalletDeclined = _e[1];
73
+ var _f = useState(null), pendingWalletCredentialType = _f[0], setPendingWalletCredentialType = _f[1];
74
+ var _g = useState(null), fileUploaded = _g[0], setFileUploaded = _g[1];
75
+ var _h = useState(""), selectedDocumentType = _h[0], setSelectedDocumentType = _h[1];
76
+ var _j = useState(null), analysisData = _j[0], setAnalysisData = _j[1];
77
+ var _k = useState(null), errorCode = _k[0], setErrorCode = _k[1];
78
+ var _l = useState(null), selectedMethod = _l[0], setSelectedMethod = _l[1];
79
+ var _m = useState("before-recto"), photoSubStep = _m[0], setPhotoSubStep = _m[1];
80
+ var _o = useState({}), capturedImages = _o[0], setCapturedImages = _o[1];
58
81
  // Initialize retry count from session data
59
- var _m = useState(function () {
82
+ var _p = useState(function () {
60
83
  return getNodeRetryCount(session, node.id);
61
- }), retryCount = _m[0], setRetryCount = _m[1];
84
+ }), retryCount = _p[0], setRetryCount = _p[1];
62
85
  // Update retry count when session loads/changes
63
86
  useEffect(function () {
64
87
  if (session) {
@@ -82,12 +105,43 @@ var DocumentCollection = function (_a) {
82
105
  var handleContinueFromIntroduction = function () {
83
106
  setCurrentStep(1);
84
107
  };
85
- var handleDocumentTypeSelect = function (docType, files) {
86
- setSelectedDocumentType(docType);
87
- if (files) {
88
- handleDocumentUpload(files);
89
- return;
90
- }
108
+ var handleDocumentTypeSelect = function (docType, files) { return __awaiter(void 0, void 0, void 0, function () {
109
+ var selectedDoc, credentialType, wallets, error_1;
110
+ return __generator(this, function (_a) {
111
+ switch (_a.label) {
112
+ case 0:
113
+ setSelectedDocumentType(docType);
114
+ if (files) {
115
+ handleDocumentUpload(files);
116
+ return [2 /*return*/];
117
+ }
118
+ if (!(node.walletEnabled === true && !walletDeclined && countryCode)) return [3 /*break*/, 4];
119
+ selectedDoc = allowedDocumentTypes.find(function (d) { return d.id === docType; });
120
+ credentialType = resolveWalletCredentialType((selectedDoc === null || selectedDoc === void 0 ? void 0 : selectedDoc.name) || docType);
121
+ if (!credentialType) return [3 /*break*/, 4];
122
+ _a.label = 1;
123
+ case 1:
124
+ _a.trys.push([1, 3, , 4]);
125
+ return [4 /*yield*/, fetchWallets(countryCode, credentialType)];
126
+ case 2:
127
+ wallets = _a.sent();
128
+ if (wallets.length > 0) {
129
+ setPendingWalletCredentialType(credentialType);
130
+ setCurrentStep(-10);
131
+ return [2 /*return*/];
132
+ }
133
+ return [3 /*break*/, 4];
134
+ case 3:
135
+ error_1 = _a.sent();
136
+ console.error("Failed to check wallet availability:", error_1);
137
+ return [3 /*break*/, 4];
138
+ case 4:
139
+ proceedToMethodOrUpload();
140
+ return [2 /*return*/];
141
+ }
142
+ });
143
+ }); };
144
+ var proceedToMethodOrUpload = function () {
91
145
  var isPictureAllowed = allowedAddingMethods.includes("picture");
92
146
  var isDownloadAllowed = allowedAddingMethods.includes("download");
93
147
  if (isPictureAllowed && isDownloadAllowed) {
@@ -98,6 +152,58 @@ var DocumentCollection = function (_a) {
98
152
  handleMethodSelect(method);
99
153
  }
100
154
  };
155
+ // Le wallet a été décliné (WalletProposal) ou a échoué (WalletVerificationStep).
156
+ var handleWalletDeclineOrFail = function () { return __awaiter(void 0, void 0, void 0, function () {
157
+ var error_2;
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0:
161
+ setWalletDeclined(true);
162
+ _a.label = 1;
163
+ case 1:
164
+ _a.trys.push([1, 3, , 4]);
165
+ return [4 /*yield*/, skipWalletWithReason(sessionId, {
166
+ nodeId: node.id,
167
+ reason: "wallet_declined_or_failed",
168
+ label: "Wallet non utilisé",
169
+ })];
170
+ case 2:
171
+ _a.sent();
172
+ return [3 /*break*/, 4];
173
+ case 3:
174
+ error_2 = _a.sent();
175
+ console.error("Failed to persist wallet skip reason:", error_2);
176
+ return [3 /*break*/, 4];
177
+ case 4:
178
+ if (normalizeWalletMode(node.walletMode) === "walletOnly") {
179
+ if (template) {
180
+ stepObject.goToNextStep(node.id, template);
181
+ }
182
+ else if (onContinueOnPC) {
183
+ onContinueOnPC();
184
+ }
185
+ else {
186
+ stepObject.setStep(stepObject.step + 1);
187
+ }
188
+ return [2 /*return*/];
189
+ }
190
+ proceedToMethodOrUpload();
191
+ return [2 /*return*/];
192
+ }
193
+ });
194
+ }); };
195
+ // Vérification par wallet aboutie : le document est confirmé, on saute la collecte photo.
196
+ var handleWalletVerificationCompleted = function () {
197
+ if (template) {
198
+ stepObject.goToNextStep(node.id, template);
199
+ }
200
+ else if (onContinueOnPC) {
201
+ onContinueOnPC();
202
+ }
203
+ else {
204
+ stepObject.setStep(stepObject.step + 1);
205
+ }
206
+ };
101
207
  var handleMethodSelect = function (method) {
102
208
  setSelectedMethod(method);
103
209
  if (method === "picture") {
@@ -107,7 +213,7 @@ var DocumentCollection = function (_a) {
107
213
  setCurrentStep(3); // Go to action (Upload screen or Photo flow)
108
214
  };
109
215
  var handlePhotoCapture = function (imageData, side) { return __awaiter(void 0, void 0, void 0, function () {
110
- var imageBlob, processedBlob, processedDataUrl_1, error_1;
216
+ var imageBlob, processedBlob, processedDataUrl_1, error_3;
111
217
  return __generator(this, function (_a) {
112
218
  switch (_a.label) {
113
219
  case 0:
@@ -125,8 +231,8 @@ var DocumentCollection = function (_a) {
125
231
  });
126
232
  return [3 /*break*/, 4];
127
233
  case 3:
128
- error_1 = _a.sent();
129
- console.error("[DocumentCollection] Failed to process photo for ".concat(side, ":"), error_1);
234
+ error_3 = _a.sent();
235
+ console.error("[DocumentCollection] Failed to process photo for ".concat(side, ":"), error_3);
130
236
  setCapturedImages(function (prev) {
131
237
  var _a;
132
238
  return (__assign(__assign({}, prev), (_a = {}, _a[side] = imageData, _a)));
@@ -196,7 +302,7 @@ var DocumentCollection = function (_a) {
196
302
  }
197
303
  };
198
304
  var handleCollectOnlyUpload = function (files) { return __awaiter(void 0, void 0, void 0, function () {
199
- var error_2;
305
+ var error_4;
200
306
  return __generator(this, function (_a) {
201
307
  switch (_a.label) {
202
308
  case 0:
@@ -211,8 +317,8 @@ var DocumentCollection = function (_a) {
211
317
  handleProcessingComplete(true, retryCount, null);
212
318
  return [3 /*break*/, 3];
213
319
  case 2:
214
- error_2 = _a.sent();
215
- console.error("[DocumentCollection] collectOnly upload failed:", error_2);
320
+ error_4 = _a.sent();
321
+ console.error("[DocumentCollection] collectOnly upload failed:", error_4);
216
322
  handleProcessingComplete(false, retryCount, null);
217
323
  return [3 /*break*/, 3];
218
324
  case 3: return [2 /*return*/];
@@ -271,6 +377,10 @@ var DocumentCollection = function (_a) {
271
377
  }
272
378
  };
273
379
  switch (currentStep) {
380
+ case -10:
381
+ return (jsx(WalletProposal, { walletMode: normalizeWalletMode(node.walletMode), onUseWallet: function () { return setCurrentStep(-11); }, onDecline: handleWalletDeclineOrFail }));
382
+ case -11:
383
+ return (jsx(WalletVerificationStep, { sessionId: sessionId, nodeId: node.id, credentialType: pendingWalletCredentialType !== null && pendingWalletCredentialType !== void 0 ? pendingWalletCredentialType : "driving_license", walletMode: normalizeWalletMode(node.walletMode), onCompleted: handleWalletVerificationCompleted, onFailedOrDeclined: handleWalletDeclineOrFail }));
274
384
  case 0:
275
385
  return (jsx(DocumentCollectionIntroduction, { onContinue: handleContinueFromIntroduction, onBack: handleBack, introductionPage: introductionPage }));
276
386
  case 1:
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentCollection.js","sources":["../../../../../src/components/document-collection/DocumentCollection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport {\n SessionTemplate,\n SessionTemplateNode,\n stepObject,\n} from \"../../types/session\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport DocumentCollectionIntroduction from \"./DocumentCollectionIntroduction\";\nimport DocumentCollectionSelection from \"./DocumentCollectionSelection\";\nimport DocumentCollectionUpload from \"./DocumentCollectionUpload\";\nimport DocumentCollectionMethodSelection from \"./DocumentCollectionMethodSelection\";\nimport { DocumentError, DocumentProcessing, DocumentSuccess } from \".\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoPreview from \"../id-check/PhotoPreview\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport { analyzeFiles } from \"../../services/analysis\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\n\nexport type DocumentTypeSide = \"ONE_FILE\" | \"RECTO_VERSO\";\n\nexport interface NodeDocumentCollection {\n id: string;\n allowedDocumentTypes: Array<{\n name: string;\n id: string;\n collectOnly?: boolean;\n }>;\n allowedAddingMethods: Array<'download' | 'picture'>;\n introductionPage: {\n title: string;\n description: string;\n };\n documentSelection: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n collectOnly?: boolean;\n}\n\ninterface DocumentCollectionProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeDocumentCollection;\n onContinueOnPC?: () => void;\n allowedDocumentTypes: AllowedDocumentType[];\n allowedAddingMethods: string[];\n template?: SessionTemplate;\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * DocumentCollection component manages the multi-step document collection flow.\n * It handles document type selection, document upload, processing, and error/success handling.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {NodeDocumentCollection} props.node - Node configuration containing allowed document types and page content.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC.\n * @param {AllowedDocumentType[]} props.allowedDocumentTypes - List of document types accepted for collection.\n * @param {string[]} props.allowedAddingMethods - List of allowed methods for adding documents (download, picture, etc.).\n * @param {Object} [props.introductionPage] - Optional introduction page configuration with title and description.\n * @param {Object} [props.documentSelection] - Optional document selection page configuration with title and description.\n *\n * @returns {JSX.Element} Multi-step document collection UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Manages internal state for step navigation, document selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for invalid navigation.\n * - Uses translation hooks for internationalization support.\n */\nconst DocumentCollection = ({\n stepObject,\n sessionId,\n node,\n template,\n onContinueOnPC,\n allowedDocumentTypes,\n allowedAddingMethods,\n introductionPage,\n documentSelection,\n allowResubmission,\n maxResubmissionAttempts,\n}: DocumentCollectionProps) => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [currentStep, setCurrentStep] = useState(introductionPage?.title ? 0 : 1);\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [selectedDocumentType, setSelectedDocumentType] = useState<string>(\"\");\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<\"download\" | \"picture\" | null>(null);\n const [photoSubStep, setPhotoSubStep] = useState<\"before-recto\" | \"recto\" | \"preview-recto\" | \"before-verso\" | \"verso\" | \"preview-verso\" | \"confirmation\">(\"before-recto\");\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>({});\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (allowResubmission === false && retryCount > 0) {\n setCurrentStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n if (retryCount > 0 && !isRetryAllowed()) {\n // User has exhausted retries, redirect to error page\n setCurrentStep(6);\n }\n }, [retryCount, allowResubmission]);\n\n const handleContinueFromIntroduction = () => {\n setCurrentStep(1);\n };\n\n const handleDocumentTypeSelect = (docType: string, files?: onUploadFiles) => {\n setSelectedDocumentType(docType);\n\n if (files) {\n handleDocumentUpload(files);\n return;\n }\n\n const isPictureAllowed = allowedAddingMethods.includes(\"picture\");\n const isDownloadAllowed = allowedAddingMethods.includes(\"download\");\n\n if (isPictureAllowed && isDownloadAllowed) {\n setCurrentStep(2); // Method selection\n } else {\n const method = isPictureAllowed ? \"picture\" : \"download\";\n handleMethodSelect(method);\n }\n };\n\n const handleMethodSelect = (method: \"download\" | \"picture\") => {\n setSelectedMethod(method);\n if (method === \"picture\") {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }\n setCurrentStep(3); // Go to action (Upload screen or Photo flow)\n };\n\n const handlePhotoCapture = async (imageData: string, side: \"recto\" | \"verso\") => {\n try {\n const imageBlob = dataUrlToBlob(imageData);\n const processedBlob = await resizeAfterCapture(imageBlob);\n const processedDataUrl = await blobToDataUrl(processedBlob);\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n } catch (error) {\n console.error(`[DocumentCollection] Failed to process photo for ${side}:`, error);\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n }\n setPhotoSubStep(side === \"recto\" ? \"preview-recto\" : \"preview-verso\");\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n const files: onUploadFiles = {\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n };\n setFileUploaded(files);\n setCurrentStep(4);\n }\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n setFileUploaded(files);\n\n // Check if the selected document type is collectOnly — skip processing step\n const selectedDoc = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n if (selectedDoc?.collectOnly) {\n handleCollectOnlyUpload(files);\n return;\n }\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setCurrentStep(6);\n } else {\n // Proceed to processing\n setCurrentStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n currentRetryCount?: number,\n apiAnalysisData?: Prediction[] | null\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n if (apiAnalysisData.length > 0) {\n setErrorCode(apiAnalysisData[0].code);\n }\n }\n\n if (success) {\n // Always follow the graph edges. Arithmetic fallback only when no template is available\n // (out of the normal TemplateNodeRenderer flow).\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setCurrentStep(5);\n } else {\n setRetryCount((prev) => {\n const newCount = prev + 1;\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setCurrentStep(6);\n }\n };\n\n const handleCollectOnlyUpload = async (files: onUploadFiles) => {\n try {\n await analyzeFiles(sessionId, node.id, files, selectedDocumentType, {\n documentTypeKey: selectedDocumentType,\n collectOnly: true,\n enablePolling: false,\n });\n handleProcessingComplete(true, retryCount, null);\n } catch (error) {\n console.error(\"[DocumentCollection] collectOnly upload failed:\", error);\n handleProcessingComplete(false, retryCount, null);\n }\n };\n\n const handleRetryFromError = () => {\n setCurrentStep(1);\n setSelectedMethod(null);\n setCapturedImages({});\n setFileUploaded(null);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n if (allowResubmission === undefined) return true;\n if (!allowResubmission) return false;\n if (maxResubmissionAttempts !== undefined) {\n return retryCount <= maxResubmissionAttempts;\n }\n return true;\n };\n\n // Node progression must follow the graph edges. `onContinueOnPC` is reserved for the\n // QR / mobile→PC redirection and must NOT drive node progression (it navigates by raw step\n // arithmetic, which breaks when several nodes share the same `order`).\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n // Inter-node back navigation goes through the history-aware goBack(), never raw arithmetic.\n stepObject.goBack();\n } else {\n setCurrentStep(currentStep - 1);\n }\n };\n\n switch (currentStep) {\n case 0:\n return (\n <DocumentCollectionIntroduction\n onContinue={handleContinueFromIntroduction}\n onBack={handleBack}\n introductionPage={introductionPage}\n />\n );\n case 1:\n return (\n <DocumentCollectionSelection\n onContinue={handleDocumentTypeSelect}\n onBack={handleBack}\n allowedDocumentTypes={allowedDocumentTypes}\n allowedAddingMethods={allowedAddingMethods}\n stepObject={stepObject}\n documentSelection={documentSelection}\n />\n );\n case 2:\n return (\n <DocumentCollectionMethodSelection\n onMethodSelect={handleMethodSelect}\n onBack={handleBack}\n title={documentSelection?.title}\n description={documentSelection?.description}\n />\n );\n case 3:\n if (selectedMethod === \"download\") {\n return (\n <DocumentCollectionUpload\n selectedDocumentType={selectedDocumentType}\n allowedDocumentTypes={allowedDocumentTypes}\n onUpload={handleDocumentUpload}\n onBack={handleBack}\n documentSelection={documentSelection}\n sessionId={sessionId}\n />\n );\n } else {\n // Photo flow\n const requiresTwoSides = allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.side === \"RECTO_VERSO\";\n\n switch (photoSubStep) {\n case \"before-recto\":\n return <BeforePhoto setStep={() => setPhotoSubStep(\"recto\")} isSingleSided={!requiresTwoSides} onBack={handleBack} />;\n case \"recto\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"recto\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-recto\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.recto}\n side=\"recto\"\n isSingleSided={!requiresTwoSides}\n onValidate={() => setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.recto; return next; });\n setPhotoSubStep(\"recto\");\n }}\n />\n );\n case \"before-verso\":\n return <BeforeVersoPhoto setStep={() => setPhotoSubStep(\"verso\")} />;\n case \"verso\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"verso\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-verso\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.verso}\n side=\"verso\"\n onValidate={() => setPhotoSubStep(\"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.verso; return next; });\n setPhotoSubStep(\"verso\");\n }}\n />\n );\n case \"confirmation\":\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={requiresTwoSides}\n onConfirm={handlePhotoConfirmation}\n onRetry={() => {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n onRetryAfterProcessing={() => {\n setCurrentStep(1);\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n fileUploaded={fileUploaded}\n isSingleSided={!requiresTwoSides}\n />\n );\n }\n }\n return null;\n\n case 4:\n return (\n <DocumentProcessing\n documentType={selectedDocumentType}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={selectedDocumentType}\n retryCount={retryCount}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <DocumentSuccess\n documentType={selectedDocumentType}\n documentTypeLabel={t(allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.name || \"\")}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n successDetails={{\n nextSteps: {\n title: t(\"success.next_steps\", \"Prochaines étapes\"),\n description: t(\n \"success.next_steps_description\",\n \"Vous pouvez maintenant continuer le processus de vérification en suivant les instructions à l'écran.\"\n ),\n },\n }}\n />\n );\n case 6:\n return (\n <DocumentError\n documentType={selectedDocumentType}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={allowResubmission}\n maxResubmissionAttempts={maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n\n default:\n console.error(`Invalid document collection step: ${currentStep} `);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_collection.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"document_collection.navigation_error.description\", \"Étape non valide. Veuillez recommencer.\")}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"w-full\"\n onClick={() => setCurrentStep(0)}\n >\n {t(\"document_collection.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCollection;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentCollection.js","sources":["../../../../../src/components/document-collection/DocumentCollection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport {\n SessionTemplate,\n SessionTemplateNode,\n stepObject,\n} from \"../../types/session\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport DocumentCollectionIntroduction from \"./DocumentCollectionIntroduction\";\nimport DocumentCollectionSelection from \"./DocumentCollectionSelection\";\nimport DocumentCollectionUpload from \"./DocumentCollectionUpload\";\nimport DocumentCollectionMethodSelection from \"./DocumentCollectionMethodSelection\";\nimport { DocumentError, DocumentProcessing, DocumentSuccess } from \".\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoPreview from \"../id-check/PhotoPreview\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport { analyzeFiles } from \"../../services/analysis\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\nimport { fetchWallets, skipWalletWithReason } from \"../../services/sessionService\";\nimport WalletProposal from \"../wallet/WalletProposal\";\nimport WalletVerificationStep from \"../wallet/WalletVerificationStep\";\n\nexport type DocumentTypeSide = \"ONE_FILE\" | \"RECTO_VERSO\";\n\nexport interface NodeDocumentCollection {\n id: string;\n allowedDocumentTypes: Array<{\n name: string;\n id: string;\n collectOnly?: boolean;\n }>;\n allowedAddingMethods: Array<'download' | 'picture'>;\n introductionPage: {\n title: string;\n description: string;\n };\n documentSelection: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n walletEnabled?: boolean;\n walletMode?: \"walletOnly\" | \"walletOrPhoto\";\n}\n\nconst normalizeWalletMode = (mode?: string): \"walletOnly\" | \"walletOrPhoto\" =>\n mode === \"walletOnly\" ? \"walletOnly\" : \"walletOrPhoto\";\n\n/**\n * Heuristic mapping from a document-collection template's id/name to the\n * wallet credential it corresponds to. `allowedDocumentTypes` are arbitrary,\n * backend-template-driven strings (no fixed enum), so this is name-based —\n * cf. docs/WALLET_OID4VP_IMPLEMENTATION_PLAN.md §7 (\"option wallet quand le\n * type collecté ∈ {permis, carte grise}\").\n */\nconst resolveWalletCredentialType = (\n docTypeIdOrName: string,\n): \"driving_license\" | \"vehicle_registration\" | null => {\n const normalized = docTypeIdOrName.toLowerCase();\n if (/(licence|license|permis|driving)/.test(normalized)) return \"driving_license\";\n if (/(grise|registration|immatriculation|vehicle)/.test(normalized)) return \"vehicle_registration\";\n return null;\n};\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n collectOnly?: boolean;\n}\n\ninterface DocumentCollectionProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeDocumentCollection;\n onContinueOnPC?: () => void;\n allowedDocumentTypes: AllowedDocumentType[];\n allowedAddingMethods: string[];\n template?: SessionTemplate;\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n /** Pays de l'utilisateur, connu si un nœud identity-control précède ce nœud dans le parcours. */\n countryCode?: string;\n}\n\n/**\n * DocumentCollection component manages the multi-step document collection flow.\n * It handles document type selection, document upload, processing, and error/success handling.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {NodeDocumentCollection} props.node - Node configuration containing allowed document types and page content.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC.\n * @param {AllowedDocumentType[]} props.allowedDocumentTypes - List of document types accepted for collection.\n * @param {string[]} props.allowedAddingMethods - List of allowed methods for adding documents (download, picture, etc.).\n * @param {Object} [props.introductionPage] - Optional introduction page configuration with title and description.\n * @param {Object} [props.documentSelection] - Optional document selection page configuration with title and description.\n *\n * @returns {JSX.Element} Multi-step document collection UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Manages internal state for step navigation, document selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for invalid navigation.\n * - Uses translation hooks for internationalization support.\n */\nconst DocumentCollection = ({\n stepObject,\n sessionId,\n node,\n template,\n onContinueOnPC,\n allowedDocumentTypes,\n allowedAddingMethods,\n introductionPage,\n documentSelection,\n allowResubmission,\n maxResubmissionAttempts,\n countryCode,\n}: DocumentCollectionProps) => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [currentStep, setCurrentStep] = useState(introductionPage?.title ? 0 : 1);\n const [walletDeclined, setWalletDeclined] = useState(false);\n const [pendingWalletCredentialType, setPendingWalletCredentialType] = useState<\n \"driving_license\" | \"vehicle_registration\" | null\n >(null);\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [selectedDocumentType, setSelectedDocumentType] = useState<string>(\"\");\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<\"download\" | \"picture\" | null>(null);\n const [photoSubStep, setPhotoSubStep] = useState<\"before-recto\" | \"recto\" | \"preview-recto\" | \"before-verso\" | \"verso\" | \"preview-verso\" | \"confirmation\">(\"before-recto\");\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>({});\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (allowResubmission === false && retryCount > 0) {\n setCurrentStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n if (retryCount > 0 && !isRetryAllowed()) {\n // User has exhausted retries, redirect to error page\n setCurrentStep(6);\n }\n }, [retryCount, allowResubmission]);\n\n const handleContinueFromIntroduction = () => {\n setCurrentStep(1);\n };\n\n const handleDocumentTypeSelect = async (docType: string, files?: onUploadFiles) => {\n setSelectedDocumentType(docType);\n\n if (files) {\n handleDocumentUpload(files);\n return;\n }\n\n // Wallet gate first, NFC/photo as fallback (cf. WALLET_OID4VP_IMPLEMENTATION_PLAN.md §7) —\n // seulement si le type sélectionné a un équivalent wallet (permis, carte grise).\n if (node.walletEnabled === true && !walletDeclined && countryCode) {\n const selectedDoc = allowedDocumentTypes.find((d) => d.id === docType);\n const credentialType = resolveWalletCredentialType(selectedDoc?.name || docType);\n if (credentialType) {\n try {\n const wallets = await fetchWallets(countryCode, credentialType);\n if (wallets.length > 0) {\n setPendingWalletCredentialType(credentialType);\n setCurrentStep(-10);\n return;\n }\n } catch (error) {\n console.error(\"Failed to check wallet availability:\", error);\n }\n }\n }\n\n proceedToMethodOrUpload();\n };\n\n const proceedToMethodOrUpload = () => {\n const isPictureAllowed = allowedAddingMethods.includes(\"picture\");\n const isDownloadAllowed = allowedAddingMethods.includes(\"download\");\n\n if (isPictureAllowed && isDownloadAllowed) {\n setCurrentStep(2); // Method selection\n } else {\n const method = isPictureAllowed ? \"picture\" : \"download\";\n handleMethodSelect(method);\n }\n };\n\n // Le wallet a été décliné (WalletProposal) ou a échoué (WalletVerificationStep).\n const handleWalletDeclineOrFail = async () => {\n setWalletDeclined(true);\n try {\n await skipWalletWithReason(sessionId, {\n nodeId: node.id,\n reason: \"wallet_declined_or_failed\",\n label: \"Wallet non utilisé\",\n });\n } catch (error) {\n console.error(\"Failed to persist wallet skip reason:\", error);\n }\n\n if (normalizeWalletMode(node.walletMode) === \"walletOnly\") {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n return;\n }\n\n proceedToMethodOrUpload();\n };\n\n // Vérification par wallet aboutie : le document est confirmé, on saute la collecte photo.\n const handleWalletVerificationCompleted = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleMethodSelect = (method: \"download\" | \"picture\") => {\n setSelectedMethod(method);\n if (method === \"picture\") {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }\n setCurrentStep(3); // Go to action (Upload screen or Photo flow)\n };\n\n const handlePhotoCapture = async (imageData: string, side: \"recto\" | \"verso\") => {\n try {\n const imageBlob = dataUrlToBlob(imageData);\n const processedBlob = await resizeAfterCapture(imageBlob);\n const processedDataUrl = await blobToDataUrl(processedBlob);\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n } catch (error) {\n console.error(`[DocumentCollection] Failed to process photo for ${side}:`, error);\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n }\n setPhotoSubStep(side === \"recto\" ? \"preview-recto\" : \"preview-verso\");\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n const files: onUploadFiles = {\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n };\n setFileUploaded(files);\n setCurrentStep(4);\n }\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n setFileUploaded(files);\n\n // Check if the selected document type is collectOnly — skip processing step\n const selectedDoc = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n if (selectedDoc?.collectOnly) {\n handleCollectOnlyUpload(files);\n return;\n }\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setCurrentStep(6);\n } else {\n // Proceed to processing\n setCurrentStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n currentRetryCount?: number,\n apiAnalysisData?: Prediction[] | null\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n if (apiAnalysisData.length > 0) {\n setErrorCode(apiAnalysisData[0].code);\n }\n }\n\n if (success) {\n // Always follow the graph edges. Arithmetic fallback only when no template is available\n // (out of the normal TemplateNodeRenderer flow).\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setCurrentStep(5);\n } else {\n setRetryCount((prev) => {\n const newCount = prev + 1;\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setCurrentStep(6);\n }\n };\n\n const handleCollectOnlyUpload = async (files: onUploadFiles) => {\n try {\n await analyzeFiles(sessionId, node.id, files, selectedDocumentType, {\n documentTypeKey: selectedDocumentType,\n collectOnly: true,\n enablePolling: false,\n });\n handleProcessingComplete(true, retryCount, null);\n } catch (error) {\n console.error(\"[DocumentCollection] collectOnly upload failed:\", error);\n handleProcessingComplete(false, retryCount, null);\n }\n };\n\n const handleRetryFromError = () => {\n setCurrentStep(1);\n setSelectedMethod(null);\n setCapturedImages({});\n setFileUploaded(null);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n if (allowResubmission === undefined) return true;\n if (!allowResubmission) return false;\n if (maxResubmissionAttempts !== undefined) {\n return retryCount <= maxResubmissionAttempts;\n }\n return true;\n };\n\n // Node progression must follow the graph edges. `onContinueOnPC` is reserved for the\n // QR / mobile→PC redirection and must NOT drive node progression (it navigates by raw step\n // arithmetic, which breaks when several nodes share the same `order`).\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n // Inter-node back navigation goes through the history-aware goBack(), never raw arithmetic.\n stepObject.goBack();\n } else {\n setCurrentStep(currentStep - 1);\n }\n };\n\n switch (currentStep) {\n case -10:\n return (\n <WalletProposal\n walletMode={normalizeWalletMode(node.walletMode)}\n onUseWallet={() => setCurrentStep(-11)}\n onDecline={handleWalletDeclineOrFail}\n />\n );\n case -11:\n return (\n <WalletVerificationStep\n sessionId={sessionId}\n nodeId={node.id}\n credentialType={pendingWalletCredentialType ?? \"driving_license\"}\n walletMode={normalizeWalletMode(node.walletMode)}\n onCompleted={handleWalletVerificationCompleted}\n onFailedOrDeclined={handleWalletDeclineOrFail}\n />\n );\n case 0:\n return (\n <DocumentCollectionIntroduction\n onContinue={handleContinueFromIntroduction}\n onBack={handleBack}\n introductionPage={introductionPage}\n />\n );\n case 1:\n return (\n <DocumentCollectionSelection\n onContinue={handleDocumentTypeSelect}\n onBack={handleBack}\n allowedDocumentTypes={allowedDocumentTypes}\n allowedAddingMethods={allowedAddingMethods}\n stepObject={stepObject}\n documentSelection={documentSelection}\n />\n );\n case 2:\n return (\n <DocumentCollectionMethodSelection\n onMethodSelect={handleMethodSelect}\n onBack={handleBack}\n title={documentSelection?.title}\n description={documentSelection?.description}\n />\n );\n case 3:\n if (selectedMethod === \"download\") {\n return (\n <DocumentCollectionUpload\n selectedDocumentType={selectedDocumentType}\n allowedDocumentTypes={allowedDocumentTypes}\n onUpload={handleDocumentUpload}\n onBack={handleBack}\n documentSelection={documentSelection}\n sessionId={sessionId}\n />\n );\n } else {\n // Photo flow\n const requiresTwoSides = allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.side === \"RECTO_VERSO\";\n\n switch (photoSubStep) {\n case \"before-recto\":\n return <BeforePhoto setStep={() => setPhotoSubStep(\"recto\")} isSingleSided={!requiresTwoSides} onBack={handleBack} />;\n case \"recto\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"recto\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-recto\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.recto}\n side=\"recto\"\n isSingleSided={!requiresTwoSides}\n onValidate={() => setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.recto; return next; });\n setPhotoSubStep(\"recto\");\n }}\n />\n );\n case \"before-verso\":\n return <BeforeVersoPhoto setStep={() => setPhotoSubStep(\"verso\")} />;\n case \"verso\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"verso\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-verso\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.verso}\n side=\"verso\"\n onValidate={() => setPhotoSubStep(\"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.verso; return next; });\n setPhotoSubStep(\"verso\");\n }}\n />\n );\n case \"confirmation\":\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={requiresTwoSides}\n onConfirm={handlePhotoConfirmation}\n onRetry={() => {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n onRetryAfterProcessing={() => {\n setCurrentStep(1);\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n fileUploaded={fileUploaded}\n isSingleSided={!requiresTwoSides}\n />\n );\n }\n }\n return null;\n\n case 4:\n return (\n <DocumentProcessing\n documentType={selectedDocumentType}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={selectedDocumentType}\n retryCount={retryCount}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <DocumentSuccess\n documentType={selectedDocumentType}\n documentTypeLabel={t(allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.name || \"\")}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n successDetails={{\n nextSteps: {\n title: t(\"success.next_steps\", \"Prochaines étapes\"),\n description: t(\n \"success.next_steps_description\",\n \"Vous pouvez maintenant continuer le processus de vérification en suivant les instructions à l'écran.\"\n ),\n },\n }}\n />\n );\n case 6:\n return (\n <DocumentError\n documentType={selectedDocumentType}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={allowResubmission}\n maxResubmissionAttempts={maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n\n default:\n console.error(`Invalid document collection step: ${currentStep} `);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_collection.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"document_collection.navigation_error.description\", \"Étape non valide. Veuillez recommencer.\")}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"w-full\"\n onClick={() => setCurrentStep(0)}\n >\n {t(\"document_collection.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCollection;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -26,10 +26,12 @@ import { getAllDocumentTemplates, getDocumentTemplateId, getDocTypeKey } from '.
26
26
  import { blobToDataUrl, dataUrlToBlob, resizeAfterCapture } from '../../utils/imageProcessing.js';
27
27
  import { getNodeRetryCount, incrementNodeRetryCount } from '../../services/retryService.js';
28
28
  import { getSession } from '../../context/SessionContext.js';
29
- import { updateSessionUserInput, skipNfcWithReason } from '../../services/sessionService.js';
29
+ import { fetchWallets, skipNfcWithReason, skipWalletWithReason, updateSessionUserInput } from '../../services/sessionService.js';
30
30
  import NfcScanStep from '../nfc-scan/NfcScanNode.js';
31
31
  import NfcChipGate from '../nfc-scan/NfcChipGate.js';
32
32
  import NfcFallbackSurvey from '../nfc-scan/NfcFallbackSurvey.js';
33
+ import WalletProposal from '../wallet/WalletProposal.js';
34
+ import WalletVerificationStep from '../wallet/WalletVerificationStep.js';
33
35
  import { EUROPEAN_COUNTRY_CODES } from '../../utils/europeanCountries.js';
34
36
 
35
37
  var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
@@ -45,6 +47,9 @@ var NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([
45
47
  var normalizeNfcMode = function (mode) {
46
48
  return mode === "nfcAndApi" || mode === "nfcOrPhoto" ? "nfcOrPhoto" : "nfcOnly";
47
49
  };
50
+ var normalizeWalletMode = function (mode) {
51
+ return mode === "walletOnly" ? "walletOnly" : "walletOrPhoto";
52
+ };
48
53
  /**
49
54
  * DocumentCheck component manages the multi-step document verification flow for a session.
50
55
  * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.
@@ -127,10 +132,13 @@ var DocumentCheck = function (_a) {
127
132
  // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),
128
133
  // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).
129
134
  var _z = useState(false), nfcSkipped = _z[0], setNfcSkipped = _z[1];
135
+ // Idem pour le wallet : une fois décliné/échoué, on ne re-propose plus le wallet
136
+ // sur ce nœud (mais le NFC, s'il est également activé, reste tenté ensuite).
137
+ var _0 = useState(false), walletDeclined = _0[0], setWalletDeclined = _0[1];
130
138
  // Initialize retry count from session data
131
- var _0 = useState(function () {
139
+ var _1 = useState(function () {
132
140
  return getNodeRetryCount(session, node.id);
133
- }), retryCount = _0[0], setRetryCount = _0[1];
141
+ }), retryCount = _1[0], setRetryCount = _1[1];
134
142
  // Update retry count when session loads/changes
135
143
  useEffect(function () {
136
144
  if (session) {
@@ -185,10 +193,10 @@ var DocumentCheck = function (_a) {
185
193
  setDocStep(6);
186
194
  }
187
195
  }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);
188
- var _1 = useState({}), capturedImages = _1[0], setCapturedImages = _1[1];
189
- var _2 = useState("before-recto"), currentPhotoStep = _2[0], setCurrentPhotoStep = _2[1];
190
- var _3 = useState("photo"), videoFlowPhase = _3[0], setVideoFlowPhase = _3[1];
191
- var _4 = useDocumentContext(), selectedDocumentType = _4.selectedDocumentType, setSelectedDocumentType = _4.setSelectedDocumentType;
196
+ var _2 = useState({}), capturedImages = _2[0], setCapturedImages = _2[1];
197
+ var _3 = useState("before-recto"), currentPhotoStep = _3[0], setCurrentPhotoStep = _3[1];
198
+ var _4 = useState("photo"), videoFlowPhase = _4[0], setVideoFlowPhase = _4[1];
199
+ var _5 = useDocumentContext(), selectedDocumentType = _5.selectedDocumentType, setSelectedDocumentType = _5.setSelectedDocumentType;
192
200
  var finalAcceptedCountries = useMemo(function () {
193
201
  if (loadingTemplates)
194
202
  return acceptedCountries;
@@ -376,10 +384,9 @@ var DocumentCheck = function (_a) {
376
384
  handleProcessingComplete(success, undefined, analysisData);
377
385
  };
378
386
  var handleDocumentTypeSelect = function (documentId) { return __awaiter(void 0, void 0, void 0, function () {
379
- var documentLabel, documentTemplateID, selectedDoc, selectedCountryCode, selectedDocumentInput, nfcMode, error_2;
380
- var _a;
381
- return __generator(this, function (_b) {
382
- switch (_b.label) {
387
+ var documentLabel, documentTemplateID, selectedDoc, selectedCountryCode, selectedDocumentInput, wallets, error_2;
388
+ return __generator(this, function (_a) {
389
+ switch (_a.label) {
383
390
  case 0:
384
391
  documentLabel = t("documentTypes.".concat(documentId), documentId);
385
392
  logDocumentTypeSelected(sessionId, documentId, documentLabel);
@@ -412,6 +419,37 @@ var DocumentCheck = function (_a) {
412
419
  setCapturedImages({});
413
420
  setCurrentPhotoStep("before-recto");
414
421
  setVideoFlowPhase("photo");
422
+ if (!(node.walletEnabled === true && !walletDeclined)) return [3 /*break*/, 4];
423
+ _a.label = 1;
424
+ case 1:
425
+ _a.trys.push([1, 3, , 4]);
426
+ return [4 /*yield*/, fetchWallets(selectedCountryCode, "pid")];
427
+ case 2:
428
+ wallets = _a.sent();
429
+ if (wallets.length > 0) {
430
+ setDocStep(-10);
431
+ return [2 /*return*/];
432
+ }
433
+ return [3 /*break*/, 4];
434
+ case 3:
435
+ error_2 = _a.sent();
436
+ console.error("Failed to check wallet availability:", error_2);
437
+ return [3 /*break*/, 4];
438
+ case 4: return [4 /*yield*/, proceedWithNfcOrPhoto(documentId, selectedDocumentInput)];
439
+ case 5:
440
+ _a.sent();
441
+ return [2 /*return*/];
442
+ }
443
+ });
444
+ }); };
445
+ // Logique NFC-ou-photo existante, factorisée pour être rejouable après un
446
+ // refus/échec du wallet (le wallet est tenté avant, cf. handleDocumentTypeSelect).
447
+ var proceedWithNfcOrPhoto = function (documentId, selectedDocumentInput) { return __awaiter(void 0, void 0, void 0, function () {
448
+ var nfcMode, error_3;
449
+ var _a;
450
+ return __generator(this, function (_b) {
451
+ switch (_b.label) {
452
+ case 0:
415
453
  if (!(node.nfcEnabled === true &&
416
454
  !nfcSkipped &&
417
455
  NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId))) return [3 /*break*/, 5];
@@ -424,8 +462,8 @@ var DocumentCheck = function (_a) {
424
462
  _b.sent();
425
463
  return [3 /*break*/, 4];
426
464
  case 3:
427
- error_2 = _b.sent();
428
- console.error("Failed to persist NFC document selection:", error_2);
465
+ error_3 = _b.sent();
466
+ console.error("Failed to persist NFC document selection:", error_3);
429
467
  setNfcPreparationError(t("nfc_scan.preparation_failed", "Impossible de préparer le scan NFC. Veuillez réessayer."));
430
468
  return [3 /*break*/, 4];
431
469
  case 4:
@@ -437,6 +475,61 @@ var DocumentCheck = function (_a) {
437
475
  }
438
476
  });
439
477
  }); };
478
+ // Le wallet a été décliné (WalletProposal) ou a échoué (WalletVerificationStep).
479
+ // walletOnly : pas d'alternative photo/NFC → on saute le nœud, comme le NFC en mode nfcOnly.
480
+ // walletOrPhoto : on rejoue la logique NFC-ou-photo normale.
481
+ var handleWalletDeclineOrFail = function () { return __awaiter(void 0, void 0, void 0, function () {
482
+ var error_4, selectedDocumentInput;
483
+ return __generator(this, function (_a) {
484
+ switch (_a.label) {
485
+ case 0:
486
+ setWalletDeclined(true);
487
+ _a.label = 1;
488
+ case 1:
489
+ _a.trys.push([1, 3, , 4]);
490
+ return [4 /*yield*/, skipWalletWithReason(sessionId, {
491
+ nodeId: node.id,
492
+ reason: "wallet_declined_or_failed",
493
+ label: "Wallet non utilisé",
494
+ })];
495
+ case 2:
496
+ _a.sent();
497
+ return [3 /*break*/, 4];
498
+ case 3:
499
+ error_4 = _a.sent();
500
+ console.error("Failed to persist wallet skip reason:", error_4);
501
+ return [3 /*break*/, 4];
502
+ case 4:
503
+ if (normalizeWalletMode(node.walletMode) === "walletOnly") {
504
+ if (template) {
505
+ stepObject.goToNextStep(node.id, template);
506
+ }
507
+ else {
508
+ stepObject.setStep(stepObject.step + 1);
509
+ }
510
+ return [2 /*return*/];
511
+ }
512
+ selectedDocumentInput = {
513
+ countryCode: selectedCountry.toUpperCase(),
514
+ identityDocumentType: selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id,
515
+ identityDocumentTemplateId: selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.documentTemplateId,
516
+ };
517
+ return [4 /*yield*/, proceedWithNfcOrPhoto((selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || "", selectedDocumentInput)];
518
+ case 5:
519
+ _a.sent();
520
+ return [2 /*return*/];
521
+ }
522
+ });
523
+ }); };
524
+ // Vérification par wallet aboutie : l'identité est confirmée, on saute la capture photo.
525
+ var handleWalletVerificationCompleted = function () {
526
+ if (template) {
527
+ stepObject.goToNextStep(node.id, template);
528
+ }
529
+ else {
530
+ stepObject.setStep(stepObject.step + 1);
531
+ }
532
+ };
440
533
  var handleDocumentUpload = function (files) {
441
534
  logDocumentLoaded(sessionId, "recto");
442
535
  if (files.back) {
@@ -560,7 +653,7 @@ var DocumentCheck = function (_a) {
560
653
  // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC
561
654
  // - nfcOnly → on saute le nœud (nœud suivant)
562
655
  var handleNfcFallback = function (reason, label, comment) { return __awaiter(void 0, void 0, void 0, function () {
563
- var error_3, nfcMode, hasIntroduction;
656
+ var error_5, nfcMode, hasIntroduction;
564
657
  var _a, _b;
565
658
  return __generator(this, function (_c) {
566
659
  switch (_c.label) {
@@ -574,8 +667,8 @@ var DocumentCheck = function (_a) {
574
667
  _c.sent();
575
668
  return [3 /*break*/, 4];
576
669
  case 3:
577
- error_3 = _c.sent();
578
- console.error("Failed to persist NFC fallback reason:", error_3);
670
+ error_5 = _c.sent();
671
+ console.error("Failed to persist NFC fallback reason:", error_5);
579
672
  return [3 /*break*/, 4];
580
673
  case 4:
581
674
  nfcMode = normalizeNfcMode(node.nfcMode);
@@ -618,6 +711,10 @@ var DocumentCheck = function (_a) {
618
711
  }
619
712
  };
620
713
  switch (docStep) {
714
+ case -10:
715
+ return (jsx(WalletProposal, { walletMode: normalizeWalletMode(node.walletMode), onUseWallet: function () { return setDocStep(-11); }, onDecline: handleWalletDeclineOrFail }));
716
+ case -11:
717
+ return (jsx(WalletVerificationStep, { sessionId: sessionId, nodeId: node.id, credentialType: "pid", walletMode: normalizeWalletMode(node.walletMode), onCompleted: handleWalletVerificationCompleted, onFailedOrDeclined: handleWalletDeclineOrFail }));
621
718
  case -1: {
622
719
  var hasIntroduction_1 = ((_f = node.introductionPage) === null || _f === void 0 ? void 0 : _f.title) !== undefined ||
623
720
  ((_g = node.introductionPage) === null || _g === void 0 ? void 0 : _g.description) !== undefined;