datakeen-session-react 1.1.140-rc.55 → 1.1.140-rc.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/document-collection/DocumentCollection.js +19 -22
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/id-check/Photo.js +1 -2
- package/dist/cjs/components/id-check/Photo.js.map +1 -1
- package/dist/cjs/components/id-check/PhotoPreview.js +39 -0
- package/dist/cjs/components/id-check/PhotoPreview.js.map +1 -0
- package/dist/cjs/components/session/DocumentCheck.js +22 -30
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +11 -0
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +11 -0
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/services/cameraService.js +54 -9
- package/dist/cjs/services/cameraService.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js +20 -23
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/id-check/Photo.js +1 -2
- package/dist/esm/components/id-check/Photo.js.map +1 -1
- package/dist/esm/components/id-check/PhotoPreview.js +35 -0
- package/dist/esm/components/id-check/PhotoPreview.js.map +1 -0
- package/dist/esm/components/session/DocumentCheck.js +22 -30
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/i18n/en.json.js +11 -0
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +11 -0
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/services/cameraService.js +54 -9
- package/dist/esm/services/cameraService.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,6 +15,7 @@ var DocumentSuccess = require('./DocumentSuccess.js');
|
|
|
15
15
|
var BeforePhoto = require('../id-check/BeforePhoto.js');
|
|
16
16
|
var BeforeVersoPhoto = require('../id-check/BeforeVersoPhoto.js');
|
|
17
17
|
var Photo = require('../id-check/Photo.js');
|
|
18
|
+
var PhotoPreview = require('../id-check/PhotoPreview.js');
|
|
18
19
|
var PhotoConfirmation = require('../id-check/PhotoConfirmation.js');
|
|
19
20
|
var useI18n = require('../../hooks/useI18n.js');
|
|
20
21
|
var ButtonDesktop = require('../ui/ButtonDesktop.js');
|
|
@@ -110,7 +111,7 @@ var DocumentCollection = function (_a) {
|
|
|
110
111
|
setCurrentStep(3); // Go to action (Upload screen or Photo flow)
|
|
111
112
|
};
|
|
112
113
|
var handlePhotoCapture = function (imageData, side) { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
113
|
-
var imageBlob, processedBlob, processedDataUrl_1,
|
|
114
|
+
var imageBlob, processedBlob, processedDataUrl_1, error_1;
|
|
114
115
|
return tslib_es6.__generator(this, function (_a) {
|
|
115
116
|
switch (_a.label) {
|
|
116
117
|
case 0:
|
|
@@ -126,14 +127,6 @@ var DocumentCollection = function (_a) {
|
|
|
126
127
|
var _a;
|
|
127
128
|
return (tslib_es6.__assign(tslib_es6.__assign({}, prev), (_a = {}, _a[side] = processedDataUrl_1, _a)));
|
|
128
129
|
});
|
|
129
|
-
if (side === "recto") {
|
|
130
|
-
selected = allowedDocumentTypes.find(function (d) { return d.id === selectedDocumentType; });
|
|
131
|
-
requiresTwoSides = (selected === null || selected === void 0 ? void 0 : selected.side) === "RECTO_VERSO";
|
|
132
|
-
setPhotoSubStep(requiresTwoSides ? "before-verso" : "confirmation");
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
setPhotoSubStep("confirmation");
|
|
136
|
-
}
|
|
137
130
|
return [3 /*break*/, 4];
|
|
138
131
|
case 3:
|
|
139
132
|
error_1 = _a.sent();
|
|
@@ -142,16 +135,10 @@ var DocumentCollection = function (_a) {
|
|
|
142
135
|
var _a;
|
|
143
136
|
return (tslib_es6.__assign(tslib_es6.__assign({}, prev), (_a = {}, _a[side] = imageData, _a)));
|
|
144
137
|
});
|
|
145
|
-
if (side === "recto") {
|
|
146
|
-
selected = allowedDocumentTypes.find(function (d) { return d.id === selectedDocumentType; });
|
|
147
|
-
requiresTwoSides = (selected === null || selected === void 0 ? void 0 : selected.side) === "RECTO_VERSO";
|
|
148
|
-
setPhotoSubStep(requiresTwoSides ? "before-verso" : "confirmation");
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
setPhotoSubStep("confirmation");
|
|
152
|
-
}
|
|
153
138
|
return [3 /*break*/, 4];
|
|
154
|
-
case 4:
|
|
139
|
+
case 4:
|
|
140
|
+
setPhotoSubStep(side === "recto" ? "preview-recto" : "preview-verso");
|
|
141
|
+
return [2 /*return*/];
|
|
155
142
|
}
|
|
156
143
|
});
|
|
157
144
|
}); };
|
|
@@ -298,25 +285,35 @@ var DocumentCollection = function (_a) {
|
|
|
298
285
|
}
|
|
299
286
|
else {
|
|
300
287
|
// Photo flow
|
|
301
|
-
var
|
|
288
|
+
var requiresTwoSides_1 = ((_b = allowedDocumentTypes.find(function (dt) { return dt.id === selectedDocumentType; })) === null || _b === void 0 ? void 0 : _b.side) === "RECTO_VERSO";
|
|
302
289
|
switch (photoSubStep) {
|
|
303
290
|
case "before-recto":
|
|
304
|
-
return jsxRuntime.jsx(BeforePhoto.default, { setStep: function () { return setPhotoSubStep("recto"); }, isSingleSided: !
|
|
291
|
+
return jsxRuntime.jsx(BeforePhoto.default, { setStep: function () { return setPhotoSubStep("recto"); }, isSingleSided: !requiresTwoSides_1, onBack: handleBack });
|
|
305
292
|
case "recto":
|
|
306
293
|
return jsxRuntime.jsx(Photo.default, { onCapture: function (img) { return handlePhotoCapture(img, "recto"); }, automaticCapture: false, maskType: "document" });
|
|
294
|
+
case "preview-recto":
|
|
295
|
+
return (jsxRuntime.jsx(PhotoPreview.default, { imageUrl: capturedImages.recto, side: "recto", isSingleSided: !requiresTwoSides_1, onValidate: function () { return setPhotoSubStep(requiresTwoSides_1 ? "before-verso" : "confirmation"); }, onRetake: function () {
|
|
296
|
+
setCapturedImages(function (prev) { var next = tslib_es6.__assign({}, prev); delete next.recto; return next; });
|
|
297
|
+
setPhotoSubStep("recto");
|
|
298
|
+
} }));
|
|
307
299
|
case "before-verso":
|
|
308
300
|
return jsxRuntime.jsx(BeforeVersoPhoto.default, { setStep: function () { return setPhotoSubStep("verso"); } });
|
|
309
301
|
case "verso":
|
|
310
302
|
return jsxRuntime.jsx(Photo.default, { onCapture: function (img) { return handlePhotoCapture(img, "verso"); }, automaticCapture: false, maskType: "document" });
|
|
303
|
+
case "preview-verso":
|
|
304
|
+
return (jsxRuntime.jsx(PhotoPreview.default, { imageUrl: capturedImages.verso, side: "verso", onValidate: function () { return setPhotoSubStep("confirmation"); }, onRetake: function () {
|
|
305
|
+
setCapturedImages(function (prev) { var next = tslib_es6.__assign({}, prev); delete next.verso; return next; });
|
|
306
|
+
setPhotoSubStep("verso");
|
|
307
|
+
} }));
|
|
311
308
|
case "confirmation":
|
|
312
|
-
return (jsxRuntime.jsx(PhotoConfirmation.default, { imageUrl: capturedImages.recto, versoImageUrl: capturedImages.verso, requiresTwoSides:
|
|
309
|
+
return (jsxRuntime.jsx(PhotoConfirmation.default, { imageUrl: capturedImages.recto, versoImageUrl: capturedImages.verso, requiresTwoSides: requiresTwoSides_1, onConfirm: handlePhotoConfirmation, onRetry: function () {
|
|
313
310
|
setPhotoSubStep("before-recto");
|
|
314
311
|
setCapturedImages({});
|
|
315
312
|
}, onRetryAfterProcessing: function () {
|
|
316
313
|
setCurrentStep(1);
|
|
317
314
|
setPhotoSubStep("before-recto");
|
|
318
315
|
setCapturedImages({});
|
|
319
|
-
}, fileUploaded: fileUploaded, isSingleSided: !
|
|
316
|
+
}, fileUploaded: fileUploaded, isSingleSided: !requiresTwoSides_1 }));
|
|
320
317
|
}
|
|
321
318
|
}
|
|
322
319
|
return null;
|
|
@@ -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 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\" | \"before-verso\" | \"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\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n\n if (side === \"recto\") {\n const selected = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n const requiresTwoSides = selected?.side === \"RECTO_VERSO\";\n setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\");\n } else {\n setPhotoSubStep(\"confirmation\");\n }\n } catch (error) {\n console.error(`[DocumentCollection] Failed to process photo for ${side}:`, error);\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n if (side === \"recto\") {\n const selected = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n const requiresTwoSides = selected?.side === \"RECTO_VERSO\";\n setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\");\n } else {\n setPhotoSubStep(\"confirmation\");\n }\n }\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 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 const handleContinueAnyway = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n stepObject.setStep(stepObject.step - 1);\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 />\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 \"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 \"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":["useI18n","getSession","useState","getNodeRetryCount","useEffect","__awaiter","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","incrementNodeRetryCount","analyzeFiles","_jsx","DocumentCollectionIntroduction","DocumentCollectionSelection","DocumentCollectionMethodSelection","DocumentCollectionUpload","BeforePhoto","Photo","BeforeVersoPhoto","PhotoConfirmation","DocumentProcessing","DocumentSuccess","DocumentError","_jsxs","ButtonDesktop"],"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\";\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 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 const handleContinueAnyway = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n stepObject.setStep(stepObject.step - 1);\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 />\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":["useI18n","getSession","useState","getNodeRetryCount","useEffect","__awaiter","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","incrementNodeRetryCount","analyzeFiles","_jsx","DocumentCollectionIntroduction","DocumentCollectionSelection","DocumentCollectionMethodSelection","DocumentCollectionUpload","BeforePhoto","Photo","PhotoPreview","__assign","BeforeVersoPhoto","PhotoConfirmation","DocumentProcessing","DocumentSuccess","DocumentError","_jsxs","ButtonDesktop"],"mappings":"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"}
|
|
@@ -128,7 +128,6 @@ var Photo = function (_a) {
|
|
|
128
128
|
result = _a.sent();
|
|
129
129
|
setLastCaptureMeta(result);
|
|
130
130
|
stopDetection();
|
|
131
|
-
cameraService.cameraService.stopCamera();
|
|
132
131
|
setDocumentDetected(false);
|
|
133
132
|
console.debug("Document captured", {
|
|
134
133
|
method: result.method,
|
|
@@ -224,7 +223,7 @@ var Photo = function (_a) {
|
|
|
224
223
|
cameraService.cameraService.stopCamera();
|
|
225
224
|
setIsDetecting(false);
|
|
226
225
|
};
|
|
227
|
-
}, [facingMode, clearCountdown, stopDetection
|
|
226
|
+
}, [facingMode, clearCountdown, stopDetection]);
|
|
228
227
|
React.useEffect(function () {
|
|
229
228
|
if (!isDetecting || !videoRef.current) {
|
|
230
229
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Photo.js","sources":["../../../../../src/components/id-check/Photo.tsx"],"sourcesContent":["import { useRef, useState, useEffect, useCallback } from \"react\";\nimport type { CameraFacingMode } from \"../../types/camera\";\nimport {\n cameraService,\n type CaptureDocumentResult,\n} from \"../../services/cameraService\";\nimport {\n documentDetectionService,\n type DocumentDetectionResult,\n} from \"../../services/documentDetectionService\";\nimport CameraError from \"./CameraError\";\nimport CameraMask from \"./CameraMask\";\nimport OrientationToggle from \"./OrientationToggle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface PhotoProps {\n onCapture: (image: string) => void;\n automaticCapture?: boolean; // Controls whether automatic capture is enabled\n maskType?: \"id\" | \"document\";\n}\n\nconst Photo: React.FC<PhotoProps> = ({\n onCapture,\n automaticCapture = false,\n maskType = \"id\",\n}) => {\n const isMobile = useIsMobile(768);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n const [facingMode, setFacingMode] = useState<CameraFacingMode>(\"environment\");\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [isPortrait, setIsPortrait] = useState(\n window.matchMedia(\"(orientation: portrait)\").matches\n );\n const [isCountingDown, setIsCountingDown] = useState(false);\n const [countdown, setCountdown] = useState(0);\n const [documentDetected, setDocumentDetected] = useState(false);\n const [captureError, setCaptureError] = useState<string | null>(null);\n const { t } = useI18n();\n const [lastCaptureMeta, setLastCaptureMeta] =\n useState<CaptureDocumentResult | null>(null);\n const [maskRect, setMaskRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const countdownIntervalRef = useRef<number | null>(null);\n const detectionHandlerRef = useRef<{ stop: () => void } | null>(null);\n\n const CAPTURE_COUNTDOWN_SECONDS = 3;\n\n const clearCountdown = useCallback(() => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n setCountdown(0);\n }, []);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setIsPortrait(window.matchMedia(\"(orientation: portrait)\").matches);\n };\n\n const mediaQuery = window.matchMedia(\"(orientation: portrait)\");\n mediaQuery.addEventListener(\"change\", handleOrientationChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n const stopDetection = useCallback(() => {\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n documentDetectionService.stopDocumentDetection();\n }, []);\n\n const captureDocument = useCallback(async () => {\n if (!videoRef.current) {\n throw new Error(t(\"id_check.photo.errors.video_unavailable\", \"Le flux vidéo n'est pas disponible\"));\n }\n\n const video = videoRef.current;\n if (!video.videoWidth || !video.videoHeight) {\n throw new Error(\n t(\n \"id_check.photo.errors.video_dimensions_unavailable\",\n \"Dimensions vidéo indisponibles pour la capture\"\n )\n );\n }\n\n // Calculate crop area from mask if available\n let cropArea = null;\n if (maskRect) {\n const videoRect = video.getBoundingClientRect();\n\n // Calculate the actual displayed video dimensions accounting for object-fit: contain\n // Calculate the actual displayed video dimensions accounting for object-fit: cover\n const videoAspect = video.videoWidth / video.videoHeight;\n const displayAspect = videoRect.width / videoRect.height;\n\n let displayedWidth, displayedHeight, offsetX, offsetY;\n\n if (videoAspect > displayAspect) {\n // Video is wider than container - scaled to match height, sides cropped\n displayedHeight = videoRect.height;\n displayedWidth = videoRect.height * videoAspect;\n offsetY = 0;\n offsetX = (videoRect.width - displayedWidth) / 2;\n } else {\n // Video is taller than container - scaled to match width, top/bottom cropped\n displayedWidth = videoRect.width;\n displayedHeight = videoRect.width / videoAspect;\n offsetX = 0;\n offsetY = (videoRect.height - displayedHeight) / 2;\n }\n\n // Calculate the scale between actual displayed video and real video dimensions\n const scaleX = video.videoWidth / displayedWidth;\n const scaleY = video.videoHeight / displayedHeight;\n\n // Convert mask coordinates from screen space to video space\n // Account for video element offset and displayed video offset\n const cropX = (maskRect.left - videoRect.left - offsetX) * scaleX;\n const cropY = (maskRect.top - videoRect.top - offsetY) * scaleY;\n const cropWidth = maskRect.width * scaleX;\n const cropHeight = maskRect.height * scaleY;\n\n // Ensure crop area is within video bounds\n cropArea = {\n x: Math.max(0, Math.round(cropX)),\n y: Math.max(0, Math.round(cropY)),\n width: Math.min(video.videoWidth - Math.max(0, cropX), Math.round(cropWidth)),\n height: Math.min(video.videoHeight - Math.max(0, cropY), Math.round(cropHeight)),\n };\n\n console.debug(\"[Photo] Calculated crop area from mask\", {\n maskRect,\n videoRect: { left: videoRect.left, top: videoRect.top, width: videoRect.width, height: videoRect.height },\n videoDimensions: { width: video.videoWidth, height: video.videoHeight },\n displayedDimensions: { width: displayedWidth, height: displayedHeight },\n offset: { x: offsetX, y: offsetY },\n scale: { x: scaleX, y: scaleY },\n cropArea,\n });\n } else {\n console.debug(\"[Photo] No mask rect available, capturing full frame\");\n }\n\n setCaptureError(null);\n setIsDetecting(false);\n\n try {\n const result = await cameraService.captureDocument(video, cropArea, {\n facingMode,\n format: \"jpeg\",\n jpegQuality: 0.95,\n });\n\n setLastCaptureMeta(result);\n stopDetection();\n cameraService.stopCamera();\n setDocumentDetected(false);\n\n console.debug(\"Document captured\", {\n method: result.method,\n analysis: result.analysis,\n source: result.sourceDimensions,\n crop: result.cropDimensions,\n });\n\n onCapture(result.dataUrl);\n } catch (error) {\n console.error(\"Document capture failed\", error);\n setCaptureError(t(\"id_check.photo.capture_failed\", \"La capture a échoué. Veuillez réessayer.\"));\n setIsDetecting(true);\n throw error;\n }\n }, [facingMode, onCapture, stopDetection, maskRect, t]);\n\n const startCountdown = useCallback(() => {\n if (isCountingDown) return;\n\n setIsCountingDown(true);\n setCountdown(CAPTURE_COUNTDOWN_SECONDS);\n\n let timeLeft = CAPTURE_COUNTDOWN_SECONDS;\n countdownIntervalRef.current = window.setInterval(() => {\n timeLeft = Math.max(0, timeLeft - 0.1);\n setCountdown(parseFloat(timeLeft.toFixed(1)));\n\n if (timeLeft <= 0.1) {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n\n captureDocument().catch(() => {\n // Error is handled inside captureDocument, but keep the promise chain quiet\n });\n }\n }, 100);\n }, [captureDocument, isCountingDown]);\n\n const handleDetectionChange = useCallback(\n (result: DocumentDetectionResult) => {\n setDocumentDetected(result.hasDocument);\n\n if (!automaticCapture) {\n return;\n }\n\n if (result.hasDocument) {\n startCountdown();\n } else {\n clearCountdown();\n }\n },\n [automaticCapture, clearCountdown, startCountdown]\n );\n\n const cancelCaptureTimer = useCallback(() => {\n clearCountdown();\n setDocumentDetected(false);\n }, [clearCountdown]);\n\n useEffect(() => {\n let isCancelled = false;\n\n const initCamera = async () => {\n setCameraError(null);\n const result = await cameraService.startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n });\n\n if (isCancelled) return;\n\n if (result.success) {\n setLastCaptureMeta(null);\n if (automaticCapture) {\n setIsDetecting(true);\n }\n } else if (result.error) {\n setCameraError(result.error);\n setIsDetecting(false);\n }\n };\n\n initCamera();\n\n return () => {\n isCancelled = true;\n clearCountdown();\n stopDetection();\n cameraService.stopCamera();\n setIsDetecting(false);\n };\n }, [facingMode, clearCountdown, stopDetection, isPortrait]);\n\n useEffect(() => {\n if (!isDetecting || !videoRef.current) {\n return;\n }\n\n let cancelled = false;\n\n documentDetectionService\n .startDocumentDetection(videoRef.current, (result) => {\n if (!cancelled) {\n handleDetectionChange(result);\n }\n })\n .then((handler) => {\n if (!cancelled) {\n detectionHandlerRef.current = handler;\n }\n });\n\n return () => {\n cancelled = true;\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n };\n }, [handleDetectionChange, isDetecting]);\n\n const toggleCamera = () => {\n setFacingMode((prev) => (prev === \"environment\" ? \"user\" : \"environment\"));\n cancelCaptureTimer();\n };\n\n const handleRetry = () => {\n setCameraError(null);\n cancelCaptureTimer();\n setCaptureError(null);\n setIsDetecting(false);\n stopDetection();\n cameraService.stopCamera();\n\n cameraService\n .startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n })\n .then((result) => {\n if (result.success) {\n setIsDetecting(true);\n } else if (result.error) {\n setCameraError(result.error);\n }\n });\n };\n const handleManualCapture = () => {\n clearCountdown();\n captureDocument().catch(() => {\n // captureDocument already logs and sets error state\n });\n };\n\n return (\n <div\n className=\"flex flex-col\"\n style={{\n position: isMobile ? \"fixed\" : \"relative\",\n inset: isMobile ? 0 : \"auto\",\n zIndex: isMobile ? 50 : \"auto\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {/* Camera content area */}\n <div className=\"flex-1 relative overflow-hidden bg-black\">\n {cameraError ? (\n <div className=\"flex items-center justify-center h-full px-4 py-6\">\n <CameraError errorMessage={cameraError} onRetry={handleRetry} />\n </div>\n ) : (\n <>\n {/* Livestream of the camera*/}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover z-0 bg-black ${facingMode === \"user\" ? \"scale-x-[-1]\" : \"\"\n }`}\n />\n {/* Capture mode indicator */}\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 z-50\">\n <span className=\"text-white z-50 text-sm font-semibold drop-shadow-lg\">\n {automaticCapture ? (\n <span className=\"animate-pulse\">{t(\"id_check.photo.mode_autocapture\", \"Autocapture activée\")}</span>\n ) : (\n <span className=\"bg-orange-500 px-2 py-1 rounded hidden\">{t(\"id_check.photo.mode_manual\", \"Mode manuel\")}</span>\n )}\n </span>\n </div>\n {/* Mask */}\n <CameraMask\n isDetecting={isDetecting}\n isPortrait={isPortrait}\n facingMode={facingMode}\n isCountingDown={isCountingDown}\n countdown={countdown}\n maskType={maskType}\n onMaskRectChange={setMaskRect}\n />\n {/* Manual capture instructions */}\n <div className=\"absolute bottom-20 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"text-center px-4\">\n <div className=\"bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block\">\n {t(\"id_check.photo.position_document\", \"Positionnez le document\")}\n </div>\n </div>\n </div>\n {/* Button to change orientation */}\n <OrientationToggle onCameraToggle={toggleCamera} />\n </>\n )}\n </div>\n\n {/* Controls at the bottom */}\n <div className=\"relative z-20 bg-black bg-opacity-80 p-4\">\n <div className=\"flex flex-col items-center space-y-4\">\n {/* Manual capture button - always available */}\n <button\n onClick={handleManualCapture}\n className={`w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer`}\n >\n <div className=\"w-8 h-8 bg-white rounded-full\"></div>\n </button>\n\n {/* Status message */}\n <div className=\"text-white text-center text-sm\">\n <div className=\"flex items-center justify-center space-x-2\">\n <div\n className={`w-2 h-2 rounded-full ${automaticCapture\n ? \"bg-[#11E5C5] animate-pulse\"\n : \"bg-orange-500\"\n }`}\n ></div>\n <span>\n {automaticCapture\n ? t(\n \"id_check.photo.automatic_instruction\",\n \"Capture automatique active ou appuyez sur le bouton\"\n )\n : t(\n \"id_check.photo.manual_instruction\",\n \"Appuyez sur le bouton pour capturer\"\n )}\n </span>\n </div>\n {captureError && (\n <p className=\"text-red-400 text-xs mt-2 text-center\">\n {captureError}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Photo;\n"],"names":["useIsMobile","useRef","useState","useI18n","useCallback","useEffect","documentDetectionService","__awaiter","cameraService","_jsxs","_jsx","CameraError","CameraMask","OrientationToggle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Photo.js","sources":["../../../../../src/components/id-check/Photo.tsx"],"sourcesContent":["import { useRef, useState, useEffect, useCallback } from \"react\";\nimport type { CameraFacingMode } from \"../../types/camera\";\nimport {\n cameraService,\n type CaptureDocumentResult,\n} from \"../../services/cameraService\";\nimport {\n documentDetectionService,\n type DocumentDetectionResult,\n} from \"../../services/documentDetectionService\";\nimport CameraError from \"./CameraError\";\nimport CameraMask from \"./CameraMask\";\nimport OrientationToggle from \"./OrientationToggle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface PhotoProps {\n onCapture: (image: string) => void;\n automaticCapture?: boolean; // Controls whether automatic capture is enabled\n maskType?: \"id\" | \"document\";\n}\n\nconst Photo: React.FC<PhotoProps> = ({\n onCapture,\n automaticCapture = false,\n maskType = \"id\",\n}) => {\n const isMobile = useIsMobile(768);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n const [facingMode, setFacingMode] = useState<CameraFacingMode>(\"environment\");\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [isPortrait, setIsPortrait] = useState(\n window.matchMedia(\"(orientation: portrait)\").matches\n );\n const [isCountingDown, setIsCountingDown] = useState(false);\n const [countdown, setCountdown] = useState(0);\n const [documentDetected, setDocumentDetected] = useState(false);\n const [captureError, setCaptureError] = useState<string | null>(null);\n const { t } = useI18n();\n const [lastCaptureMeta, setLastCaptureMeta] =\n useState<CaptureDocumentResult | null>(null);\n const [maskRect, setMaskRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const countdownIntervalRef = useRef<number | null>(null);\n const detectionHandlerRef = useRef<{ stop: () => void } | null>(null);\n\n const CAPTURE_COUNTDOWN_SECONDS = 3;\n\n const clearCountdown = useCallback(() => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n setCountdown(0);\n }, []);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setIsPortrait(window.matchMedia(\"(orientation: portrait)\").matches);\n };\n\n const mediaQuery = window.matchMedia(\"(orientation: portrait)\");\n mediaQuery.addEventListener(\"change\", handleOrientationChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n const stopDetection = useCallback(() => {\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n documentDetectionService.stopDocumentDetection();\n }, []);\n\n const captureDocument = useCallback(async () => {\n if (!videoRef.current) {\n throw new Error(t(\"id_check.photo.errors.video_unavailable\", \"Le flux vidéo n'est pas disponible\"));\n }\n\n const video = videoRef.current;\n if (!video.videoWidth || !video.videoHeight) {\n throw new Error(\n t(\n \"id_check.photo.errors.video_dimensions_unavailable\",\n \"Dimensions vidéo indisponibles pour la capture\"\n )\n );\n }\n\n // Calculate crop area from mask if available\n let cropArea = null;\n if (maskRect) {\n const videoRect = video.getBoundingClientRect();\n\n // Calculate the actual displayed video dimensions accounting for object-fit: contain\n // Calculate the actual displayed video dimensions accounting for object-fit: cover\n const videoAspect = video.videoWidth / video.videoHeight;\n const displayAspect = videoRect.width / videoRect.height;\n\n let displayedWidth, displayedHeight, offsetX, offsetY;\n\n if (videoAspect > displayAspect) {\n // Video is wider than container - scaled to match height, sides cropped\n displayedHeight = videoRect.height;\n displayedWidth = videoRect.height * videoAspect;\n offsetY = 0;\n offsetX = (videoRect.width - displayedWidth) / 2;\n } else {\n // Video is taller than container - scaled to match width, top/bottom cropped\n displayedWidth = videoRect.width;\n displayedHeight = videoRect.width / videoAspect;\n offsetX = 0;\n offsetY = (videoRect.height - displayedHeight) / 2;\n }\n\n // Calculate the scale between actual displayed video and real video dimensions\n const scaleX = video.videoWidth / displayedWidth;\n const scaleY = video.videoHeight / displayedHeight;\n\n // Convert mask coordinates from screen space to video space\n // Account for video element offset and displayed video offset\n const cropX = (maskRect.left - videoRect.left - offsetX) * scaleX;\n const cropY = (maskRect.top - videoRect.top - offsetY) * scaleY;\n const cropWidth = maskRect.width * scaleX;\n const cropHeight = maskRect.height * scaleY;\n\n // Ensure crop area is within video bounds\n cropArea = {\n x: Math.max(0, Math.round(cropX)),\n y: Math.max(0, Math.round(cropY)),\n width: Math.min(video.videoWidth - Math.max(0, cropX), Math.round(cropWidth)),\n height: Math.min(video.videoHeight - Math.max(0, cropY), Math.round(cropHeight)),\n };\n\n console.debug(\"[Photo] Calculated crop area from mask\", {\n maskRect,\n videoRect: { left: videoRect.left, top: videoRect.top, width: videoRect.width, height: videoRect.height },\n videoDimensions: { width: video.videoWidth, height: video.videoHeight },\n displayedDimensions: { width: displayedWidth, height: displayedHeight },\n offset: { x: offsetX, y: offsetY },\n scale: { x: scaleX, y: scaleY },\n cropArea,\n });\n } else {\n console.debug(\"[Photo] No mask rect available, capturing full frame\");\n }\n\n setCaptureError(null);\n setIsDetecting(false);\n\n try {\n const result = await cameraService.captureDocument(video, cropArea, {\n facingMode,\n format: \"jpeg\",\n jpegQuality: 0.95,\n });\n\n setLastCaptureMeta(result);\n stopDetection();\n setDocumentDetected(false);\n\n console.debug(\"Document captured\", {\n method: result.method,\n analysis: result.analysis,\n source: result.sourceDimensions,\n crop: result.cropDimensions,\n });\n\n onCapture(result.dataUrl);\n } catch (error) {\n console.error(\"Document capture failed\", error);\n setCaptureError(t(\"id_check.photo.capture_failed\", \"La capture a échoué. Veuillez réessayer.\"));\n setIsDetecting(true);\n throw error;\n }\n }, [facingMode, onCapture, stopDetection, maskRect, t]);\n\n const startCountdown = useCallback(() => {\n if (isCountingDown) return;\n\n setIsCountingDown(true);\n setCountdown(CAPTURE_COUNTDOWN_SECONDS);\n\n let timeLeft = CAPTURE_COUNTDOWN_SECONDS;\n countdownIntervalRef.current = window.setInterval(() => {\n timeLeft = Math.max(0, timeLeft - 0.1);\n setCountdown(parseFloat(timeLeft.toFixed(1)));\n\n if (timeLeft <= 0.1) {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n\n captureDocument().catch(() => {\n // Error is handled inside captureDocument, but keep the promise chain quiet\n });\n }\n }, 100);\n }, [captureDocument, isCountingDown]);\n\n const handleDetectionChange = useCallback(\n (result: DocumentDetectionResult) => {\n setDocumentDetected(result.hasDocument);\n\n if (!automaticCapture) {\n return;\n }\n\n if (result.hasDocument) {\n startCountdown();\n } else {\n clearCountdown();\n }\n },\n [automaticCapture, clearCountdown, startCountdown]\n );\n\n const cancelCaptureTimer = useCallback(() => {\n clearCountdown();\n setDocumentDetected(false);\n }, [clearCountdown]);\n\n useEffect(() => {\n let isCancelled = false;\n\n const initCamera = async () => {\n setCameraError(null);\n const result = await cameraService.startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n });\n\n if (isCancelled) return;\n\n if (result.success) {\n setLastCaptureMeta(null);\n if (automaticCapture) {\n setIsDetecting(true);\n }\n } else if (result.error) {\n setCameraError(result.error);\n setIsDetecting(false);\n }\n };\n\n initCamera();\n\n return () => {\n isCancelled = true;\n clearCountdown();\n stopDetection();\n cameraService.stopCamera();\n setIsDetecting(false);\n };\n }, [facingMode, clearCountdown, stopDetection]);\n\n useEffect(() => {\n if (!isDetecting || !videoRef.current) {\n return;\n }\n\n let cancelled = false;\n\n documentDetectionService\n .startDocumentDetection(videoRef.current, (result) => {\n if (!cancelled) {\n handleDetectionChange(result);\n }\n })\n .then((handler) => {\n if (!cancelled) {\n detectionHandlerRef.current = handler;\n }\n });\n\n return () => {\n cancelled = true;\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n };\n }, [handleDetectionChange, isDetecting]);\n\n const toggleCamera = () => {\n setFacingMode((prev) => (prev === \"environment\" ? \"user\" : \"environment\"));\n cancelCaptureTimer();\n };\n\n const handleRetry = () => {\n setCameraError(null);\n cancelCaptureTimer();\n setCaptureError(null);\n setIsDetecting(false);\n stopDetection();\n cameraService.stopCamera();\n\n cameraService\n .startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n })\n .then((result) => {\n if (result.success) {\n setIsDetecting(true);\n } else if (result.error) {\n setCameraError(result.error);\n }\n });\n };\n const handleManualCapture = () => {\n clearCountdown();\n captureDocument().catch(() => {\n // captureDocument already logs and sets error state\n });\n };\n\n return (\n <div\n className=\"flex flex-col\"\n style={{\n position: isMobile ? \"fixed\" : \"relative\",\n inset: isMobile ? 0 : \"auto\",\n zIndex: isMobile ? 50 : \"auto\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {/* Camera content area */}\n <div className=\"flex-1 relative overflow-hidden bg-black\">\n {cameraError ? (\n <div className=\"flex items-center justify-center h-full px-4 py-6\">\n <CameraError errorMessage={cameraError} onRetry={handleRetry} />\n </div>\n ) : (\n <>\n {/* Livestream of the camera*/}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover z-0 bg-black ${facingMode === \"user\" ? \"scale-x-[-1]\" : \"\"\n }`}\n />\n {/* Capture mode indicator */}\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 z-50\">\n <span className=\"text-white z-50 text-sm font-semibold drop-shadow-lg\">\n {automaticCapture ? (\n <span className=\"animate-pulse\">{t(\"id_check.photo.mode_autocapture\", \"Autocapture activée\")}</span>\n ) : (\n <span className=\"bg-orange-500 px-2 py-1 rounded hidden\">{t(\"id_check.photo.mode_manual\", \"Mode manuel\")}</span>\n )}\n </span>\n </div>\n {/* Mask */}\n <CameraMask\n isDetecting={isDetecting}\n isPortrait={isPortrait}\n facingMode={facingMode}\n isCountingDown={isCountingDown}\n countdown={countdown}\n maskType={maskType}\n onMaskRectChange={setMaskRect}\n />\n {/* Manual capture instructions */}\n <div className=\"absolute bottom-20 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"text-center px-4\">\n <div className=\"bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block\">\n {t(\"id_check.photo.position_document\", \"Positionnez le document\")}\n </div>\n </div>\n </div>\n {/* Button to change orientation */}\n <OrientationToggle onCameraToggle={toggleCamera} />\n </>\n )}\n </div>\n\n {/* Controls at the bottom */}\n <div className=\"relative z-20 bg-black bg-opacity-80 p-4\">\n <div className=\"flex flex-col items-center space-y-4\">\n {/* Manual capture button - always available */}\n <button\n onClick={handleManualCapture}\n className={`w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer`}\n >\n <div className=\"w-8 h-8 bg-white rounded-full\"></div>\n </button>\n\n {/* Status message */}\n <div className=\"text-white text-center text-sm\">\n <div className=\"flex items-center justify-center space-x-2\">\n <div\n className={`w-2 h-2 rounded-full ${automaticCapture\n ? \"bg-[#11E5C5] animate-pulse\"\n : \"bg-orange-500\"\n }`}\n ></div>\n <span>\n {automaticCapture\n ? t(\n \"id_check.photo.automatic_instruction\",\n \"Capture automatique active ou appuyez sur le bouton\"\n )\n : t(\n \"id_check.photo.manual_instruction\",\n \"Appuyez sur le bouton pour capturer\"\n )}\n </span>\n </div>\n {captureError && (\n <p className=\"text-red-400 text-xs mt-2 text-center\">\n {captureError}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Photo;\n"],"names":["useIsMobile","useRef","useState","useI18n","useCallback","useEffect","documentDetectionService","__awaiter","cameraService","_jsxs","_jsx","CameraError","CameraMask","OrientationToggle"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var Button = require('../ui/Button.js');
|
|
7
|
+
var PageActions = require('../ui/PageActions.js');
|
|
8
|
+
var Title = require('../ui/Title.js');
|
|
9
|
+
var Subtitle = require('../ui/Subtitle.js');
|
|
10
|
+
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
11
|
+
var useI18n = require('../../hooks/useI18n.js');
|
|
12
|
+
|
|
13
|
+
var PhotoPreview = function (_a) {
|
|
14
|
+
var imageUrl = _a.imageUrl, side = _a.side, _b = _a.isSingleSided, isSingleSided = _b === void 0 ? false : _b, onValidate = _a.onValidate, onRetake = _a.onRetake;
|
|
15
|
+
var t = useI18n.useI18n().t;
|
|
16
|
+
var isRecto = side === "recto";
|
|
17
|
+
var title = isRecto
|
|
18
|
+
? isSingleSided
|
|
19
|
+
? t("id_check.photo_preview.title_single", "Vérifiez votre photo")
|
|
20
|
+
: t("id_check.photo_preview.title_recto", "Vérifiez le recto")
|
|
21
|
+
: t("id_check.photo_preview.title_verso", "Vérifiez le verso");
|
|
22
|
+
var subtitle = isRecto
|
|
23
|
+
? isSingleSided
|
|
24
|
+
? t("id_check.photo_preview.subtitle_single", "Votre document est-il net et lisible ?")
|
|
25
|
+
: t("id_check.photo_preview.subtitle_recto", "Le recto est-il net et lisible ?")
|
|
26
|
+
: t("id_check.photo_preview.subtitle_verso", "Le verso est-il net et lisible ?");
|
|
27
|
+
var validateLabel = isRecto && !isSingleSided
|
|
28
|
+
? t("id_check.photo_preview.validate_recto", "Valider et photographier le verso")
|
|
29
|
+
: t("id_check.photo_preview.validate", "Valider");
|
|
30
|
+
var sideLabel = isSingleSided
|
|
31
|
+
? t("id_check.confirmation.single_sided", "Document")
|
|
32
|
+
: isRecto
|
|
33
|
+
? t("id_check.confirmation.recto", "Recto")
|
|
34
|
+
: t("id_check.confirmation.verso", "Verso");
|
|
35
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: onValidate, children: validateLabel }), secondary: jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onRetake, children: t("id_check.photo_preview.retake", "Reprendre la photo") }) }), 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: title }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed", children: subtitle })] }), jsxRuntime.jsxs("div", { className: "w-full", children: [jsxRuntime.jsx("div", { className: "mb-2", children: jsxRuntime.jsx("span", { className: "inline-block bg-gray-100 text-gray-700 px-3 py-1 rounded-full text-xs font-medium", children: sideLabel }) }), jsxRuntime.jsx("div", { className: "relative rounded-lg overflow-hidden border-2 border-gray-200 bg-gray-50", children: jsxRuntime.jsx("img", { src: imageUrl, alt: sideLabel, className: "w-full h-56 md:h-64 object-contain bg-white" }) })] })] }) }) }));
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
exports.default = PhotoPreview;
|
|
39
|
+
//# sourceMappingURL=PhotoPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoPreview.js","sources":["../../../../../src/components/id-check/PhotoPreview.tsx"],"sourcesContent":["import React from \"react\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface PhotoPreviewProps {\n imageUrl: string;\n side: \"recto\" | \"verso\";\n isSingleSided?: boolean;\n onValidate: () => void;\n onRetake: () => void;\n}\n\nconst PhotoPreview: React.FC<PhotoPreviewProps> = ({\n imageUrl,\n side,\n isSingleSided = false,\n onValidate,\n onRetake,\n}) => {\n const { t } = useI18n();\n\n const isRecto = side === \"recto\";\n\n const title = isRecto\n ? isSingleSided\n ? t(\"id_check.photo_preview.title_single\", \"Vérifiez votre photo\")\n : t(\"id_check.photo_preview.title_recto\", \"Vérifiez le recto\")\n : t(\"id_check.photo_preview.title_verso\", \"Vérifiez le verso\");\n\n const subtitle = isRecto\n ? isSingleSided\n ? t(\"id_check.photo_preview.subtitle_single\", \"Votre document est-il net et lisible ?\")\n : t(\"id_check.photo_preview.subtitle_recto\", \"Le recto est-il net et lisible ?\")\n : t(\"id_check.photo_preview.subtitle_verso\", \"Le verso est-il net et lisible ?\");\n\n const validateLabel = isRecto && !isSingleSided\n ? t(\"id_check.photo_preview.validate_recto\", \"Valider et photographier le verso\")\n : t(\"id_check.photo_preview.validate\", \"Valider\");\n\n const sideLabel = isSingleSided\n ? t(\"id_check.confirmation.single_sided\", \"Document\")\n : isRecto\n ? t(\"id_check.confirmation.recto\", \"Recto\")\n : t(\"id_check.confirmation.verso\", \"Verso\");\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={onValidate}>{validateLabel}</Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onRetake}>\n {t(\"id_check.photo_preview.retake\", \"Reprendre la photo\")}\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\">{title}</Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"w-full\">\n <div className=\"mb-2\">\n <span className=\"inline-block bg-gray-100 text-gray-700 px-3 py-1 rounded-full text-xs font-medium\">\n {sideLabel}\n </span>\n </div>\n <div className=\"relative rounded-lg overflow-hidden border-2 border-gray-200 bg-gray-50\">\n <img\n src={imageUrl}\n alt={sideLabel}\n className=\"w-full h-56 md:h-64 object-contain bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default PhotoPreview;\n"],"names":["useI18n","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle"],"mappings":"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"}
|
|
@@ -500,35 +500,12 @@ var DocumentCheck = function (_a) {
|
|
|
500
500
|
var activeMethod = selectedMethod ||
|
|
501
501
|
(isPictureAllowed && isMobileCapture ? "picture" : "download");
|
|
502
502
|
if (activeMethod === "picture" && isPictureAllowed) {
|
|
503
|
-
var
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
case "recto":
|
|
510
|
-
return (jsxRuntime.jsx(Photo.default, { onCapture: function (imageData) {
|
|
511
|
-
return handlePhotoCapture(imageData, "recto");
|
|
512
|
-
} }));
|
|
513
|
-
case "before-verso":
|
|
514
|
-
return (jsxRuntime.jsx(BeforeVersoPhoto.default, { setStep: function () { return setCurrentPhotoStep("verso"); } }));
|
|
515
|
-
case "verso":
|
|
516
|
-
return (jsxRuntime.jsx(Photo.default, { onCapture: function (imageData) {
|
|
517
|
-
return handlePhotoCapture(imageData, "verso");
|
|
518
|
-
} }));
|
|
519
|
-
case "confirmation":
|
|
520
|
-
return (jsxRuntime.jsx(PhotoConfirmation.default, { imageUrl: capturedImages.recto || "", versoImageUrl: capturedImages.verso, requiresTwoSides: !!capturedImages.verso, onConfirm: onConfirm, onRetry: function () { return setCurrentPhotoStep("before-recto"); }, onRetryAfterProcessing: function () {
|
|
521
|
-
return setCurrentPhotoStep("before-recto");
|
|
522
|
-
}, fileUploaded: fileUploaded, isSingleSided: isSingleSided }));
|
|
523
|
-
default:
|
|
524
|
-
setCurrentPhotoStep("before-recto");
|
|
525
|
-
return (jsxRuntime.jsx(BeforePhoto.default, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
526
|
-
}
|
|
527
|
-
};
|
|
528
|
-
if (node.withVideo) {
|
|
529
|
-
if (videoFlowPhase === "photo") {
|
|
530
|
-
return renderPhotoCaptureFlow(handlePhotoConfirmedForVideo);
|
|
531
|
-
}
|
|
503
|
+
var isSingleSided = (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "passport" ||
|
|
504
|
+
(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "pinkDriverLicense";
|
|
505
|
+
var onConfirm = node.withVideo
|
|
506
|
+
? handlePhotoConfirmedForVideo
|
|
507
|
+
: handlePhotoConfirmation;
|
|
508
|
+
if (node.withVideo && videoFlowPhase === "video") {
|
|
532
509
|
return (jsxRuntime.jsx(DocumentVideoCapture.default, { selectedDocumentType: selectedDocumentType, onComplete: handleDocumentVideoComplete, onBack: function () {
|
|
533
510
|
setVideoFlowPhase("photo");
|
|
534
511
|
setCurrentPhotoStep("confirmation");
|
|
@@ -537,7 +514,22 @@ var DocumentCheck = function (_a) {
|
|
|
537
514
|
verso: capturedImages.verso,
|
|
538
515
|
} }));
|
|
539
516
|
}
|
|
540
|
-
|
|
517
|
+
if (currentPhotoStep === "before-recto") {
|
|
518
|
+
return (jsxRuntime.jsx(BeforePhoto.default, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
519
|
+
}
|
|
520
|
+
if (currentPhotoStep === "recto") {
|
|
521
|
+
return (jsxRuntime.jsx(Photo.default, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "recto"); } }));
|
|
522
|
+
}
|
|
523
|
+
if (currentPhotoStep === "before-verso") {
|
|
524
|
+
return (jsxRuntime.jsx(BeforeVersoPhoto.default, { setStep: function () { return setCurrentPhotoStep("verso"); } }));
|
|
525
|
+
}
|
|
526
|
+
if (currentPhotoStep === "verso") {
|
|
527
|
+
return (jsxRuntime.jsx(Photo.default, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "verso"); } }));
|
|
528
|
+
}
|
|
529
|
+
if (currentPhotoStep === "confirmation") {
|
|
530
|
+
return (jsxRuntime.jsx(PhotoConfirmation.default, { imageUrl: capturedImages.recto || "", versoImageUrl: capturedImages.verso, requiresTwoSides: !!capturedImages.verso, onConfirm: onConfirm, onRetry: function () { return setCurrentPhotoStep("before-recto"); }, onRetryAfterProcessing: function () { return setCurrentPhotoStep("before-recto"); }, fileUploaded: fileUploaded, isSingleSided: isSingleSided }));
|
|
531
|
+
}
|
|
532
|
+
return (jsxRuntime.jsx(BeforePhoto.default, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
541
533
|
}
|
|
542
534
|
else {
|
|
543
535
|
return (jsxRuntime.jsx(JDIDocumentUpload.default, { documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || documentTypeId, documentTypeId: documentTypeId, documentLabel: selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.label, onUpload: handleDocumentUpload, onBack: function () {
|