datakeen-session-react 1.1.180 → 1.1.181
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 +10 -7
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/document-collection/DocumentError.js +16 -12
- package/dist/cjs/components/document-collection/DocumentError.js.map +1 -1
- package/dist/cjs/components/document-collection/DocumentProcessing.js +17 -5
- package/dist/cjs/components/document-collection/DocumentProcessing.js.map +1 -1
- package/dist/cjs/components/jdi/JDIError.js +14 -10
- package/dist/cjs/components/jdi/JDIError.js.map +1 -1
- package/dist/cjs/components/jdi/JDIProcessing.js +13 -5
- package/dist/cjs/components/jdi/JDIProcessing.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +13 -10
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/AddressFields.js +1 -1
- package/dist/cjs/components/session/UserInputForm/AddressFields.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js +17 -4
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js +130 -0
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js.map +1 -0
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js +21 -11
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +9 -3
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +9 -3
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/analysisErrors.js +22 -0
- package/dist/cjs/utils/analysisErrors.js.map +1 -0
- package/dist/esm/components/document-collection/DocumentCollection.js +10 -7
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentError.js +17 -13
- package/dist/esm/components/document-collection/DocumentError.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentProcessing.js +17 -5
- package/dist/esm/components/document-collection/DocumentProcessing.js.map +1 -1
- package/dist/esm/components/jdi/JDIError.js +15 -11
- package/dist/esm/components/jdi/JDIError.js.map +1 -1
- package/dist/esm/components/jdi/JDIProcessing.js +13 -5
- package/dist/esm/components/jdi/JDIProcessing.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +13 -10
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/AddressFields.js +1 -1
- package/dist/esm/components/session/UserInputForm/AddressFields.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignatureElectronic.js +17 -4
- package/dist/esm/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js +126 -0
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js.map +1 -0
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js +21 -11
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/esm/i18n/en.json.js +9 -3
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +9 -3
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/analysisErrors.js +19 -0
- package/dist/esm/utils/analysisErrors.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
3
|
import Title from '../ui/Title.js';
|
|
4
4
|
import Subtitle from '../ui/Subtitle.js';
|
|
@@ -7,9 +7,9 @@ import { useI18n } from '../../hooks/useI18n.js';
|
|
|
7
7
|
import { getValidationPoints } from '../../utils/validationUtils.js';
|
|
8
8
|
|
|
9
9
|
var DocumentError = function (_a) {
|
|
10
|
-
var documentType = _a.documentType, documentTypeLabel = _a.documentTypeLabel, onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _b = _a.retryCount, retryCount = _b === void 0 ? 0 : _b, _c = _a.predictions, predictions = _c === void 0 ? [] : _c; _a.errorDetails; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _d = _a.isRetryAllowed, isRetryAllowed = _d === void 0 ? true : _d, errorCode = _a.errorCode;
|
|
10
|
+
var documentType = _a.documentType, documentTypeLabel = _a.documentTypeLabel, onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _b = _a.retryCount, retryCount = _b === void 0 ? 0 : _b, _c = _a.predictions, predictions = _c === void 0 ? [] : _c; _a.errorDetails; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _d = _a.isRetryAllowed, isRetryAllowed = _d === void 0 ? true : _d, errorCode = _a.errorCode, _e = _a.blockContinue, blockContinue = _e === void 0 ? false : _e;
|
|
11
11
|
var t = useI18n().t;
|
|
12
|
-
var
|
|
12
|
+
var _f = useState([]), validationPoints = _f[0], setValidationPoints = _f[1];
|
|
13
13
|
useEffect(function () {
|
|
14
14
|
// Use shared utility to get validation points
|
|
15
15
|
setValidationPoints(getValidationPoints(errorCode, predictions, t, "error"));
|
|
@@ -40,17 +40,21 @@ var DocumentError = function (_a) {
|
|
|
40
40
|
}
|
|
41
41
|
return translated;
|
|
42
42
|
};
|
|
43
|
-
return (jsxs("div", { className: "flex flex-col justify-between h-full w-full", children: [jsx("div", { className: "flex-1 px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsx("div", { className: "text-center", children: jsx("div", { className: "mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4", children: jsx("div", { className: "w-8 h-8 bg-red-500 rounded-full flex items-center justify-center", children: jsx("span", { className: "text-white text-lg", children: "\u2715" }) }) }) }), jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl text-red-600", children:
|
|
44
|
-
? t("errors.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
return (jsxs("div", { className: "flex flex-col justify-between h-full w-full", children: [jsx("div", { className: "flex-1 px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsx("div", { className: "text-center", children: jsx("div", { className: "mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4", children: jsx("div", { className: "w-8 h-8 bg-red-500 rounded-full flex items-center justify-center", children: jsx("span", { className: "text-white text-lg", children: "\u2715" }) }) }) }), jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl text-red-600", children: blockContinue
|
|
44
|
+
? t("errors.upload_not_confirmed.title")
|
|
45
|
+
: t("errors.verification_failed", "Vérification échouée") }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed", children: blockContinue
|
|
46
|
+
? t("errors.upload_not_confirmed.subtitle")
|
|
47
|
+
: isRetryAllowed
|
|
48
|
+
? t("errors.verification_failed_subtitle", {
|
|
49
|
+
documentType: getDocumentLabel(documentType),
|
|
50
|
+
defaultValue: "Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous et réessayer.",
|
|
51
|
+
})
|
|
52
|
+
: t("errors.verification_failed_subtitle_no_retry", {
|
|
53
|
+
documentType: getDocumentLabel(documentType),
|
|
54
|
+
defaultValue: "Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous.",
|
|
55
|
+
}) })] }), !blockContinue && (jsxs("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-red-900 mb-2", children: t("errors.problems_detected", "Problèmes détectés") }), jsx("div", { className: "text-sm text-red-800 space-y-1", children: validationPoints.map(function (point, index) { return (jsx("p", { children: point }, index)); }) })] })), !blockContinue && !isRetryAllowed && (jsxs("div", { className: "bg-orange-50 border border-orange-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-orange-900 mb-2", children: t("errors.resubmission.max_attempts_reached", "Nombre maximum de tentatives atteint") }), jsx("p", { className: "text-sm text-orange-800", children: maxResubmissionAttempts !== undefined
|
|
52
56
|
? t("errors.resubmission.max_attempts_reached_description")
|
|
53
|
-
: t("errors.resubmission.no_resubmission_allowed") })] })), getUserGuidance() && (jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-4", children: [jsxs("h3", { className: "font-medium text-yellow-900 mb-2", children: ["\uD83D\uDCA1 ", t("errors.improvement_tips", "Conseils d'amélioration")] }), jsx("p", { className: "text-sm text-yellow-800", children: getUserGuidance() })] })), isRetryAllowed && (jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-blue-900 mb-2", children: t("errors.next_steps", "Prochaines étapes") }), jsx("p", { className: "text-sm text-blue-800", children: t("errors.next_steps_description", "Veuillez reprendre les photos de votre document en suivant les conseils d'amélioration pour une meilleure qualité.") })] }))] }) }), jsx("div", { className: "sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8", children: jsxs("div", { className: "w-full max-w-md mx-auto", children: [
|
|
57
|
+
: t("errors.resubmission.no_resubmission_allowed") })] })), !blockContinue && getUserGuidance() && (jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-4", children: [jsxs("h3", { className: "font-medium text-yellow-900 mb-2", children: ["\uD83D\uDCA1 ", t("errors.improvement_tips", "Conseils d'amélioration")] }), jsx("p", { className: "text-sm text-yellow-800", children: getUserGuidance() })] })), !blockContinue && isRetryAllowed && (jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-blue-900 mb-2", children: t("errors.next_steps", "Prochaines étapes") }), jsx("p", { className: "text-sm text-blue-800", children: t("errors.next_steps_description", "Veuillez reprendre les photos de votre document en suivant les conseils d'amélioration pour une meilleure qualité.") })] }))] }) }), jsx("div", { className: "sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8", children: jsxs("div", { className: "w-full max-w-md mx-auto", children: [jsx("div", { className: "flex flex-col space-y-3 md:hidden", children: blockContinue ? (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification", "Recommencer la vérification") })) : (jsxs(Fragment, { children: [onBackToUserInput && (jsx(ButtonDesktop, { onClick: onBackToUserInput, type: "back", children: t("errors.back_to_user_input", "Retour aux informations d'identité") })), retryCount >= 1 && isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "back", children: t("errors.continue_anyway", "Poursuivre tout de même") })), isRetryAllowed && (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification", "Recommencer la vérification") })), !isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "back", children: t("errors.continue_anyway", "Poursuivre tout de même") }))] })) }), jsx("div", { className: "hidden md:flex flex-col space-y-3", children: jsx("div", { className: "flex justify-center space-x-3", children: blockContinue ? (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification", "Recommencer la vérification") })) : (jsxs(Fragment, { children: [onBackToUserInput && (jsx(ButtonDesktop, { onClick: onBackToUserInput, type: "back", children: t("errors.back_to_user_input", "Retour aux informations d'identité") })), retryCount >= 1 && isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "back", children: t("errors.continue_anyway", "Poursuivre tout de même") })), isRetryAllowed && (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification", "Recommencer la vérification") })), !isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "continue", children: t("errors.continue_anyway", "Poursuivre tout de même") }))] })) }) })] }) })] }));
|
|
54
58
|
};
|
|
55
59
|
|
|
56
60
|
export { DocumentError as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentError.js","sources":["../../../../../src/components/document-collection/DocumentError.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport type { DocumentErrorProps } from \"./types\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst DocumentError: React.FC<DocumentErrorProps> = ({\n documentType,\n documentTypeLabel,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = [],\n errorDetails,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n errorCode,\n}) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\"),\n );\n }, [predictions, errorCode, t]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n const getDocumentLabel = (documentType: string): string => {\n if (documentTypeLabel) return documentTypeLabel;\n\n const translated = t(documentType);\n // If no translation, use default fallbacks\n if (translated === documentType) {\n switch (documentType) {\n case \"national_id\":\n return t(\"documentTypes.idCard\", \"carte nationale d'identité\");\n case \"passport\":\n return t(\"documentTypes.passport\", \"passeport\");\n case \"driving_license\":\n return t(\"documentTypes.driving_license\", \"permis de conduire\");\n default:\n return t(\"documentTypes.document\", \"document\");\n }\n }\n return translated;\n };\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 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 {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {t(\"errors.verification_failed\", \"Vérification échouée\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: getDocumentLabel(documentType),\n defaultValue:\n \"Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous et réessayer.\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: getDocumentLabel(documentType),\n defaultValue:\n \"Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous.\",\n })}\n </Subtitle>\n </div>\n\n {/* Error details - Validation Points */}\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\", \"Problèmes détectés\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n\n {/* Resubmission limit message */}\n {!isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\n \"errors.resubmission.max_attempts_reached\",\n \"Nombre maximum de tentatives atteint\",\n )}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n 💡 {t(\"errors.improvement_tips\", \"Conseils d'amélioration\")}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\", \"Prochaines étapes\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\n \"errors.next_steps_description\",\n \"Veuillez reprendre les photos de votre document en suivant les conseils d'amélioration pour une meilleure qualité.\",\n )}\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer with buttons */}\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n {/* Mobile layout */}\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n >\n {t(\n \"errors.back_to_user_input\",\n \"Retour aux informations d'identité\",\n )}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n >\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\", \"Recommencer la vérification\")}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"back\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n </div>\n\n {/* Desktop layout */}\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n >\n {t(\n \"errors.back_to_user_input\",\n \"Retour aux informations d'identité\",\n )}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"back\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\n \"errors.retry_verification\",\n \"Recommencer la vérification\",\n )}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"continue\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default DocumentError;\nexport type { DocumentErrorProps };\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentError.js","sources":["../../../../../src/components/document-collection/DocumentError.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport type { DocumentErrorProps } from \"./types\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst DocumentError: React.FC<DocumentErrorProps> = ({\n documentType,\n documentTypeLabel,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = [],\n errorDetails,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n errorCode,\n blockContinue = false,\n}) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\"),\n );\n }, [predictions, errorCode, t]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n const getDocumentLabel = (documentType: string): string => {\n if (documentTypeLabel) return documentTypeLabel;\n\n const translated = t(documentType);\n // If no translation, use default fallbacks\n if (translated === documentType) {\n switch (documentType) {\n case \"national_id\":\n return t(\"documentTypes.idCard\", \"carte nationale d'identité\");\n case \"passport\":\n return t(\"documentTypes.passport\", \"passeport\");\n case \"driving_license\":\n return t(\"documentTypes.driving_license\", \"permis de conduire\");\n default:\n return t(\"documentTypes.document\", \"document\");\n }\n }\n return translated;\n };\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 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 {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.title\")\n : t(\"errors.verification_failed\", \"Vérification échouée\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.subtitle\")\n : isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: getDocumentLabel(documentType),\n defaultValue:\n \"Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous et réessayer.\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: getDocumentLabel(documentType),\n defaultValue:\n \"Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous.\",\n })}\n </Subtitle>\n </div>\n\n {/* Error details - Validation Points */}\n {!blockContinue && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\", \"Problèmes détectés\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* Resubmission limit message */}\n {!blockContinue && !isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\n \"errors.resubmission.max_attempts_reached\",\n \"Nombre maximum de tentatives atteint\",\n )}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {!blockContinue && getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n 💡 {t(\"errors.improvement_tips\", \"Conseils d'amélioration\")}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {!blockContinue && isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\", \"Prochaines étapes\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\n \"errors.next_steps_description\",\n \"Veuillez reprendre les photos de votre document en suivant les conseils d'amélioration pour une meilleure qualité.\",\n )}\n </p>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer with buttons */}\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n {/* Mobile layout */}\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {blockContinue ? (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\", \"Recommencer la vérification\")}\n </ButtonDesktop>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop onClick={onBackToUserInput} type=\"back\">\n {t(\n \"errors.back_to_user_input\",\n \"Retour aux informations d'identité\",\n )}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"back\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\n \"errors.retry_verification\",\n \"Recommencer la vérification\",\n )}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"back\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n </>\n )}\n </div>\n\n {/* Desktop layout */}\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {blockContinue ? (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\n \"errors.retry_verification\",\n \"Recommencer la vérification\",\n )}\n </ButtonDesktop>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop onClick={onBackToUserInput} type=\"back\">\n {t(\n \"errors.back_to_user_input\",\n \"Retour aux informations d'identité\",\n )}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"back\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\n \"errors.retry_verification\",\n \"Recommencer la vérification\",\n )}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"continue\">\n {t(\"errors.continue_anyway\", \"Poursuivre tout de même\")}\n </ButtonDesktop>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default DocumentError;\nexport type { DocumentErrorProps };\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import Subtitle from '../ui/Subtitle.js';
|
|
|
6
6
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
7
7
|
import { analyzeFiles } from '../../services/analysis.js';
|
|
8
8
|
import { getActiveSessionId } from '../../services/sessionMemoryStore.js';
|
|
9
|
+
import { isS3UploadNotConfirmedError } from '../../utils/analysisErrors.js';
|
|
9
10
|
|
|
10
11
|
// Localized processing steps generator
|
|
11
12
|
var getProcessingSteps = function (t) { return [
|
|
@@ -69,9 +70,14 @@ var DocumentProcessing = memo(function (_a) {
|
|
|
69
70
|
return "".concat(((_a = fileUploaded.front) === null || _a === void 0 ? void 0 : _a.substring(0, 50)) || "no-front", "-").concat(((_b = fileUploaded.back) === null || _b === void 0 ? void 0 : _b.substring(0, 50)) || "no-back");
|
|
70
71
|
}, [fileUploaded]);
|
|
71
72
|
// Stable callback for completion
|
|
72
|
-
var stableOnProcessingComplete = useCallback(function (success, retryCount, analysisData) {
|
|
73
|
+
var stableOnProcessingComplete = useCallback(function (success, retryCount, analysisData, blockContinue) {
|
|
73
74
|
console.log("[DocumentProcessing] Stable callback for completion:", success, retryCount);
|
|
74
|
-
|
|
75
|
+
if (blockContinue === true) {
|
|
76
|
+
onProcessingComplete(success, retryCount, analysisData, true);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
onProcessingComplete(success, retryCount, analysisData);
|
|
80
|
+
}
|
|
75
81
|
}, [onProcessingComplete]);
|
|
76
82
|
// Default analysis function
|
|
77
83
|
var defaultAnalysisFunction = useCallback(function (sessionId, files, docTypeId, options) { return __awaiter(void 0, void 0, void 0, function () {
|
|
@@ -125,7 +131,7 @@ var DocumentProcessing = memo(function (_a) {
|
|
|
125
131
|
return;
|
|
126
132
|
}
|
|
127
133
|
var processFiles = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
128
|
-
var _loop_1, i, error_1;
|
|
134
|
+
var _loop_1, i, error_1, isUploadNotConfirmed;
|
|
129
135
|
return __generator(this, function (_a) {
|
|
130
136
|
switch (_a.label) {
|
|
131
137
|
case 0:
|
|
@@ -202,7 +208,13 @@ var DocumentProcessing = memo(function (_a) {
|
|
|
202
208
|
return index === currentStep ? __assign(__assign({}, step), { hasError: true }) : step;
|
|
203
209
|
});
|
|
204
210
|
});
|
|
205
|
-
|
|
211
|
+
isUploadNotConfirmed = isS3UploadNotConfirmedError(error_1);
|
|
212
|
+
setAnalysisResult({
|
|
213
|
+
success: false,
|
|
214
|
+
data: null,
|
|
215
|
+
canRetry: isUploadNotConfirmed,
|
|
216
|
+
blockContinue: isUploadNotConfirmed,
|
|
217
|
+
});
|
|
206
218
|
setIsComplete(true);
|
|
207
219
|
return [3 /*break*/, 7];
|
|
208
220
|
case 6:
|
|
@@ -231,7 +243,7 @@ var DocumentProcessing = memo(function (_a) {
|
|
|
231
243
|
useEffect(function () {
|
|
232
244
|
if (isComplete && analysisResult) {
|
|
233
245
|
setTimeout(function () {
|
|
234
|
-
stableOnProcessingComplete(analysisResult.success, retryCount, analysisResult.predictions || null);
|
|
246
|
+
stableOnProcessingComplete(analysisResult.success, retryCount, analysisResult.predictions || null, analysisResult.blockContinue);
|
|
235
247
|
}, 1000);
|
|
236
248
|
}
|
|
237
249
|
}, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentProcessing.js","sources":["../../../../../src/components/document-collection/DocumentProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n analyzeFiles,\n type AnalyzeFilesOptions,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type {\n DocumentProcessingProps,\n ProcessingStep,\n ProcessingResult,\n} from \"./types\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\n\n// Localized processing steps generator\nconst getProcessingSteps = (t: any): ProcessingStep[] => [\n {\n title: t(\n \"processing.steps.document_reception.title\",\n \"Réception du document\",\n ),\n subtitle: t(\n \"processing.steps.document_reception.subtitle\",\n \"Téléchargement et vérification du format\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.quality_analysis.title\",\n \"Analyse de la qualité\",\n ),\n subtitle: t(\n \"processing.steps.quality_analysis.subtitle\",\n \"Contrôle de la netteté et de l'éclairage\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.data_extraction.title\",\n \"Extraction des données\",\n ),\n subtitle: t(\n \"processing.steps.data_extraction.subtitle\",\n \"Lecture des informations du document\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.final_verification.title\",\n \"Vérification finale\",\n ),\n subtitle: t(\n \"processing.steps.final_verification.subtitle\",\n \"Validation des données extraites\",\n ),\n hasError: false,\n },\n];\n\nconst DocumentProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n documentTypeLabel,\n nodeId,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n config,\n customAnalysisFunction,\n }: DocumentProcessingProps) => {\n const inferRequiresTwoSides = useCallback(\n (type?: string): boolean | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalized = type.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n if (normalized.includes(\"passport\")) {\n return false;\n }\n\n if (\n normalized.includes(\"idcard\") ||\n normalized.includes(\"identity\") ||\n normalized.includes(\"driver\") ||\n normalized.includes(\"licenc\") ||\n normalized.includes(\"residence\")\n ) {\n return true;\n }\n\n return undefined;\n },\n [],\n );\n\n const { t, translateDocumentType } = useI18n();\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => config?.steps || getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<ProcessingResult | null>(null);\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Create stable key for uploaded files\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n\n // Handle onUploadFiles structure\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Stable callback for completion\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n ) => {\n console.log(\"[DocumentProcessing] Stable callback for completion:\", success, retryCount);\n onProcessingComplete(success, retryCount, analysisData);\n },\n [onProcessingComplete],\n );\n\n // Default analysis function\n const defaultAnalysisFunction = useCallback(\n async (\n sessionId: string,\n files: onUploadFiles,\n docTypeId: string,\n options?: AnalyzeFilesOptions,\n ): Promise<ProcessingResult> => {\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n files,\n docTypeId,\n {\n ...options,\n save: options?.save ?? false, // don't save to session yet\n incrementAnalysis: options?.incrementAnalysis ?? false, // don't auto-progress session\n },\n );\n\n // When polling is enabled, response is AnalysisStatusResponse\n // which has code, codeName, codeDescription directly on the object\n const extractedCode = response?.code || String(response?.status);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n\n // Construct predictions array from the response\n const predictions = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\", // default type\n });\n }\n\n // Determine success based on code\n // Code 8.x (specimen) is blocking — treated as failure\n const isSuccess = [\"1.\", \"4.\", \"5.\", \"6.\", \"9.\"].some((prefix) =>\n extractedCode.startsWith(prefix),\n );\n\n return {\n success: isSuccess,\n code: extractedCode,\n data: response,\n predictions: predictions,\n };\n },\n [nodeId],\n );\n\n // Main processing effect\n useEffect(() => {\n // Prevent multiple calls\n if (\n !fileUploaded ||\n !filesKey ||\n isProcessing ||\n processingStartedRef.current\n ) {\n return;\n }\n\n const sessionId = getActiveSessionId();\n if (!sessionId) {\n stableOnProcessingComplete(false);\n return;\n }\n\n // Check if we already processed these same files\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n const processFiles = async () => {\n try {\n // Mark processing start\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animate through steps with real API call at the end\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Delay between steps (except last one)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Last step: real API call\n const analysisFunction =\n customAnalysisFunction || defaultAnalysisFunction;\n const inferredTwoSides = inferRequiresTwoSides(\n typeof config?.documentType === \"string\"\n ? config.documentType\n : documentType,\n );\n\n const analysisOptions: AnalyzeFilesOptions = {\n documentTypeKey: documentType,\n requiresTwoSides:\n typeof inferredTwoSides === \"boolean\"\n ? inferredTwoSides\n : Boolean(fileUploaded.back),\n };\n\n const result = await analysisFunction(\n sessionId,\n fileUploaded,\n documentTypeId,\n analysisOptions,\n );\n\n setAnalysisResult(result);\n\n // Mark current step according to result\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === i ? { ...step, hasError: !result.success } : step,\n ),\n );\n\n // Small delay to see result\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"Processing error:\", error);\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep ? { ...step, hasError: true } : step,\n ),\n );\n\n setAnalysisResult({ success: false, data: null });\n setIsComplete(true);\n } finally {\n setIsProcessing(false);\n }\n };\n\n processFiles();\n }, [\n fileUploaded,\n filesKey,\n documentTypeId,\n documentType,\n config?.documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n customAnalysisFunction,\n defaultAnalysisFunction,\n inferRequiresTwoSides,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n stableOnProcessingComplete(\n analysisResult.success,\n retryCount,\n analysisResult.predictions || null,\n );\n }, 1000);\n }\n }, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {config?.processingTitle ||\n t(\"processing.title\", \"Analyse en cours\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {config?.processingSubtitle ||\n t(\"processing.subtitle\", {\n documentType: t(\n \"documentTypes.\" + documentType,\n \"document\",\n ),\n defaultValue: `Nous analysons votre ${t(\"documentTypes.\" + documentType, \"document\")}. Cela peut prendre quelques instants.`,\n })}\n </Subtitle>\n </div>\n\n {/* Processing steps with status indicators */}\n <div className=\"w-full flex justify-center\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index: number) => (\n <div key={index} className=\"flex items-start\">\n {/* Status indicator */}\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {index < currentStep ? (\n step.hasError ? (\n // Error indicator - Red X\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs\">\n ✕\n </div>\n ) : (\n // Success indicator - Green checkmark\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n )\n ) : index === currentStep ? (\n // Loading spinner only for the current step\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Empty circle for future steps\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n\n {/* Step content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {step.title}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {step.subtitle}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nDocumentProcessing.displayName = \"DocumentProcessing\";\n\nexport default DocumentProcessing;\nexport type { DocumentProcessingProps };\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentProcessing.js","sources":["../../../../../src/components/document-collection/DocumentProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n analyzeFiles,\n type AnalyzeFilesOptions,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type {\n DocumentProcessingProps,\n ProcessingStep,\n ProcessingResult,\n} from \"./types\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { isS3UploadNotConfirmedError } from \"../../utils/analysisErrors\";\n\n// Localized processing steps generator\nconst getProcessingSteps = (t: any): ProcessingStep[] => [\n {\n title: t(\n \"processing.steps.document_reception.title\",\n \"Réception du document\",\n ),\n subtitle: t(\n \"processing.steps.document_reception.subtitle\",\n \"Téléchargement et vérification du format\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.quality_analysis.title\",\n \"Analyse de la qualité\",\n ),\n subtitle: t(\n \"processing.steps.quality_analysis.subtitle\",\n \"Contrôle de la netteté et de l'éclairage\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.data_extraction.title\",\n \"Extraction des données\",\n ),\n subtitle: t(\n \"processing.steps.data_extraction.subtitle\",\n \"Lecture des informations du document\",\n ),\n hasError: false,\n },\n {\n title: t(\n \"processing.steps.final_verification.title\",\n \"Vérification finale\",\n ),\n subtitle: t(\n \"processing.steps.final_verification.subtitle\",\n \"Validation des données extraites\",\n ),\n hasError: false,\n },\n];\n\nconst DocumentProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n documentTypeLabel,\n nodeId,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n config,\n customAnalysisFunction,\n }: DocumentProcessingProps) => {\n const inferRequiresTwoSides = useCallback(\n (type?: string): boolean | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalized = type.trim().toLowerCase();\n if (!normalized) {\n return undefined;\n }\n\n if (normalized.includes(\"passport\")) {\n return false;\n }\n\n if (\n normalized.includes(\"idcard\") ||\n normalized.includes(\"identity\") ||\n normalized.includes(\"driver\") ||\n normalized.includes(\"licenc\") ||\n normalized.includes(\"residence\")\n ) {\n return true;\n }\n\n return undefined;\n },\n [],\n );\n\n const { t, translateDocumentType } = useI18n();\n\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => config?.steps || getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<ProcessingResult | null>(null);\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Create stable key for uploaded files\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n\n // Handle onUploadFiles structure\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Stable callback for completion\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n console.log(\"[DocumentProcessing] Stable callback for completion:\", success, retryCount);\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n // Default analysis function\n const defaultAnalysisFunction = useCallback(\n async (\n sessionId: string,\n files: onUploadFiles,\n docTypeId: string,\n options?: AnalyzeFilesOptions,\n ): Promise<ProcessingResult> => {\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n files,\n docTypeId,\n {\n ...options,\n save: options?.save ?? false, // don't save to session yet\n incrementAnalysis: options?.incrementAnalysis ?? false, // don't auto-progress session\n },\n );\n\n // When polling is enabled, response is AnalysisStatusResponse\n // which has code, codeName, codeDescription directly on the object\n const extractedCode = response?.code || String(response?.status);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n\n // Construct predictions array from the response\n const predictions = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\", // default type\n });\n }\n\n // Determine success based on code\n // Code 8.x (specimen) is blocking — treated as failure\n const isSuccess = [\"1.\", \"4.\", \"5.\", \"6.\", \"9.\"].some((prefix) =>\n extractedCode.startsWith(prefix),\n );\n\n return {\n success: isSuccess,\n code: extractedCode,\n data: response,\n predictions: predictions,\n };\n },\n [nodeId],\n );\n\n // Main processing effect\n useEffect(() => {\n // Prevent multiple calls\n if (\n !fileUploaded ||\n !filesKey ||\n isProcessing ||\n processingStartedRef.current\n ) {\n return;\n }\n\n const sessionId = getActiveSessionId();\n if (!sessionId) {\n stableOnProcessingComplete(false);\n return;\n }\n\n // Check if we already processed these same files\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n const processFiles = async () => {\n try {\n // Mark processing start\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animate through steps with real API call at the end\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Delay between steps (except last one)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Last step: real API call\n const analysisFunction =\n customAnalysisFunction || defaultAnalysisFunction;\n const inferredTwoSides = inferRequiresTwoSides(\n typeof config?.documentType === \"string\"\n ? config.documentType\n : documentType,\n );\n\n const analysisOptions: AnalyzeFilesOptions = {\n documentTypeKey: documentType,\n requiresTwoSides:\n typeof inferredTwoSides === \"boolean\"\n ? inferredTwoSides\n : Boolean(fileUploaded.back),\n };\n\n const result = await analysisFunction(\n sessionId,\n fileUploaded,\n documentTypeId,\n analysisOptions,\n );\n\n setAnalysisResult(result);\n\n // Mark current step according to result\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === i ? { ...step, hasError: !result.success } : step,\n ),\n );\n\n // Small delay to see result\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"Processing error:\", error);\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep ? { ...step, hasError: true } : step,\n ),\n );\n\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n setAnalysisResult({\n success: false,\n data: null,\n canRetry: isUploadNotConfirmed,\n blockContinue: isUploadNotConfirmed,\n });\n setIsComplete(true);\n } finally {\n setIsProcessing(false);\n }\n };\n\n processFiles();\n }, [\n fileUploaded,\n filesKey,\n documentTypeId,\n documentType,\n config?.documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n customAnalysisFunction,\n defaultAnalysisFunction,\n inferRequiresTwoSides,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n stableOnProcessingComplete(\n analysisResult.success,\n retryCount,\n analysisResult.predictions || null,\n analysisResult.blockContinue,\n );\n }, 1000);\n }\n }, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {config?.processingTitle ||\n t(\"processing.title\", \"Analyse en cours\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {config?.processingSubtitle ||\n t(\"processing.subtitle\", {\n documentType: t(\n \"documentTypes.\" + documentType,\n \"document\",\n ),\n defaultValue: `Nous analysons votre ${t(\"documentTypes.\" + documentType, \"document\")}. Cela peut prendre quelques instants.`,\n })}\n </Subtitle>\n </div>\n\n {/* Processing steps with status indicators */}\n <div className=\"w-full flex justify-center\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index: number) => (\n <div key={index} className=\"flex items-start\">\n {/* Status indicator */}\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {index < currentStep ? (\n step.hasError ? (\n // Error indicator - Red X\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs\">\n ✕\n </div>\n ) : (\n // Success indicator - Green checkmark\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n )\n ) : index === currentStep ? (\n // Loading spinner only for the current step\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Empty circle for future steps\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n\n {/* Step content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {step.title}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {step.subtitle}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nDocumentProcessing.displayName = \"DocumentProcessing\";\n\nexport default DocumentProcessing;\nexport type { DocumentProcessingProps };\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState, useEffect } from 'react';
|
|
3
3
|
import Title from '../ui/Title.js';
|
|
4
4
|
import Subtitle from '../ui/Subtitle.js';
|
|
@@ -10,9 +10,9 @@ import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
|
10
10
|
|
|
11
11
|
var DEFAULT_PREDICTIONS = [];
|
|
12
12
|
var JDIError = function (_a) {
|
|
13
|
-
_a.documentType; var onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _b = _a.retryCount, retryCount = _b === void 0 ? 0 : _b, _c = _a.predictions, predictions = _c === void 0 ? DEFAULT_PREDICTIONS : _c, errorCode = _a.errorCode; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _d = _a.isRetryAllowed, isRetryAllowed = _d === void 0 ? true : _d;
|
|
13
|
+
_a.documentType; var onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _b = _a.retryCount, retryCount = _b === void 0 ? 0 : _b, _c = _a.predictions, predictions = _c === void 0 ? DEFAULT_PREDICTIONS : _c, errorCode = _a.errorCode; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _d = _a.isRetryAllowed, isRetryAllowed = _d === void 0 ? true : _d, _e = _a.blockContinue, blockContinue = _e === void 0 ? false : _e;
|
|
14
14
|
var t = useI18n().t;
|
|
15
|
-
var
|
|
15
|
+
var _f = useState([]), validationPoints = _f[0], setValidationPoints = _f[1];
|
|
16
16
|
useEffect(function () {
|
|
17
17
|
// Use shared utility to get validation points
|
|
18
18
|
setValidationPoints(getValidationPoints(errorCode, predictions, t, "error"));
|
|
@@ -24,15 +24,19 @@ var JDIError = function (_a) {
|
|
|
24
24
|
var guidance = t("user_guidance.".concat(errorCode), "");
|
|
25
25
|
return guidance || null;
|
|
26
26
|
};
|
|
27
|
-
return (jsx(MobilePageLayout, { footer: jsxs("div", { className: "w-full max-w-md mx-auto", children: [
|
|
28
|
-
? t("errors.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
:
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
return (jsx(MobilePageLayout, { footer: jsxs("div", { className: "w-full max-w-md mx-auto", children: [jsx("div", { className: "flex flex-col space-y-3 md:hidden", children: blockContinue ? (jsx(Button, { onClick: onRetry, className: "w-full py-3", children: t("errors.retry_verification") })) : (jsxs(Fragment, { children: [onBackToUserInput && (jsx(ButtonDesktop, { onClick: onBackToUserInput, type: "back", className: "w-full text-black text-center font-poppins text-sm font-medium py-2", children: t("errors.back_to_user_input") })), retryCount >= 1 && isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "back", className: "w-full text-black text-center font-poppins text-sm font-medium py-2", children: t("errors.continue_anyway") })), isRetryAllowed && (jsx(Button, { onClick: onRetry, className: "w-full py-3", children: t("errors.retry_verification") })), !isRetryAllowed && (jsx(Button, { onClick: onContinueAnyway, className: "w-full py-3", children: t("errors.continue_anyway") }))] })) }), jsx("div", { className: "hidden md:flex flex-col space-y-3", children: jsx("div", { className: "flex justify-center space-x-3", children: blockContinue ? (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification") })) : (jsxs(Fragment, { children: [onBackToUserInput && (jsx(ButtonDesktop, { onClick: onBackToUserInput, type: "back", className: "text-black text-center font-poppins text-sm font-medium py-2", children: t("errors.back_to_user_input") })), retryCount >= 1 && isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "back", className: "text-black text-center font-poppins text-sm font-medium py-2", children: t("errors.continue_anyway") })), isRetryAllowed && (jsx(ButtonDesktop, { onClick: onRetry, type: "continue", children: t("errors.retry_verification") })), !isRetryAllowed && (jsx(ButtonDesktop, { onClick: onContinueAnyway, type: "continue", children: t("errors.continue_anyway") }))] })) }) })] }), children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsx("div", { className: "text-center", children: jsx("div", { className: "mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4", children: jsx("div", { className: "w-8 h-8 bg-red-500 rounded-full flex items-center justify-center", children: jsx("span", { className: "text-white text-lg", children: "\u2715" }) }) }) }), jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl text-red-600", children: blockContinue
|
|
28
|
+
? t("errors.upload_not_confirmed.title")
|
|
29
|
+
: t("errors.verification_failed") }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed", children: blockContinue
|
|
30
|
+
? t("errors.upload_not_confirmed.subtitle")
|
|
31
|
+
: isRetryAllowed
|
|
32
|
+
? t("errors.verification_failed_subtitle", {
|
|
33
|
+
documentType: "document",
|
|
34
|
+
})
|
|
35
|
+
: t("errors.verification_failed_subtitle_no_retry", {
|
|
36
|
+
documentType: "document",
|
|
37
|
+
}) })] }), !blockContinue && (errorCode === null || errorCode === void 0 ? void 0 : errorCode.startsWith("8")) && (jsx("div", { className: "bg-orange-50 border border-orange-200 rounded-lg p-4", children: jsx("p", { className: "text-sm text-orange-800", children: t("errors.specimen_detected") }) })), !blockContinue && (jsxs("div", { className: "bg-red-50 border border-red-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-red-900 mb-2", children: t("errors.problems_detected") }), jsx("div", { className: "text-sm text-red-800 space-y-1", children: validationPoints.map(function (point, index) { return (jsx("p", { children: point }, index)); }) })] })), !blockContinue && !isRetryAllowed && (jsxs("div", { className: "bg-orange-50 border border-orange-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-orange-900 mb-2", children: t("errors.resubmission.max_attempts_reached") }), jsx("p", { className: "text-sm text-orange-800", children: maxResubmissionAttempts !== undefined
|
|
34
38
|
? t("errors.resubmission.max_attempts_reached_description")
|
|
35
|
-
: t("errors.resubmission.no_resubmission_allowed") })] })), getUserGuidance() && (jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-4", children: [jsxs("h3", { className: "font-medium text-yellow-900 mb-2", children: ["\uD83D\uDCA1 ", t("errors.improvement_tips")] }), jsx("p", { className: "text-sm text-yellow-800", children: getUserGuidance() })] })), isRetryAllowed && (jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-blue-900 mb-2", children: t("errors.next_steps") }), jsx("p", { className: "text-sm text-blue-800", children: t("errors.next_steps_description") })] }))] }) }) }));
|
|
39
|
+
: t("errors.resubmission.no_resubmission_allowed") })] })), !blockContinue && getUserGuidance() && (jsxs("div", { className: "bg-yellow-50 border border-yellow-200 rounded-lg p-4", children: [jsxs("h3", { className: "font-medium text-yellow-900 mb-2", children: ["\uD83D\uDCA1 ", t("errors.improvement_tips")] }), jsx("p", { className: "text-sm text-yellow-800", children: getUserGuidance() })] })), !blockContinue && isRetryAllowed && (jsxs("div", { className: "bg-blue-50 border border-blue-200 rounded-lg p-4", children: [jsx("h3", { className: "font-medium text-blue-900 mb-2", children: t("errors.next_steps") }), jsx("p", { className: "text-sm text-blue-800", children: t("errors.next_steps_description") })] }))] }) }) }));
|
|
36
40
|
};
|
|
37
41
|
|
|
38
42
|
export { JDIError as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDIError.js","sources":["../../../../../src/components/jdi/JDIError.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { Prediction } from \"../../utils/apiAnalysis\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface JDIErrorProps {\n documentType: string;\n onRetry: () => void;\n onContinueAnyway: () => void;\n onBackToUserInput?: () => void;\n retryCount?: number;\n predictions?: Prediction[]; // Nouvelles données de l'API\n errorCode?: string; // Error code from API response (e.g., \"2.1\", \"4.0\")\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n isRetryAllowed?: boolean;\n}\n\nconst DEFAULT_PREDICTIONS: Prediction[] = [];\n\nconst JDIError = ({\n documentType,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = DEFAULT_PREDICTIONS,\n errorCode,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n}: JDIErrorProps) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\"),\n );\n }, [predictions, errorCode, t]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n )}\n {!isRetryAllowed && (\n <Button onClick={onContinueAnyway} className=\"w-full py-3\">\n {t(\"errors.continue_anyway\")}\n </Button>\n )}\n </div>\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop onClick={onContinueAnyway} type=\"continue\">\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n </div>\n </div>\n </div>\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 {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {t(\"errors.verification_failed\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: \"document\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: \"document\",\n })}\n </Subtitle>\n </div>\n\n {/* Specimen warning */}\n {errorCode?.startsWith(\"8\") && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\"errors.specimen_detected\")}\n </p>\n </div>\n )}\n\n {/* Error details - Validation Points */}\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n\n {/* Resubmission limit message */}\n {!isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\"errors.resubmission.max_attempts_reached\")}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n 💡 {t(\"errors.improvement_tips\")}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\"errors.next_steps_description\")}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIError;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDIError.js","sources":["../../../../../src/components/jdi/JDIError.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { Prediction } from \"../../utils/apiAnalysis\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface JDIErrorProps {\n documentType: string;\n onRetry: () => void;\n onContinueAnyway: () => void;\n onBackToUserInput?: () => void;\n retryCount?: number;\n predictions?: Prediction[]; // Nouvelles données de l'API\n errorCode?: string; // Error code from API response (e.g., \"2.1\", \"4.0\")\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n isRetryAllowed?: boolean;\n blockContinue?: boolean;\n}\n\nconst DEFAULT_PREDICTIONS: Prediction[] = [];\n\nconst JDIError = ({\n documentType,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = DEFAULT_PREDICTIONS,\n errorCode,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n blockContinue = false,\n}: JDIErrorProps) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\"),\n );\n }, [predictions, errorCode, t]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {blockContinue ? (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n )}\n {!isRetryAllowed && (\n <Button onClick={onContinueAnyway} className=\"w-full py-3\">\n {t(\"errors.continue_anyway\")}\n </Button>\n )}\n </>\n )}\n </div>\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {blockContinue ? (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"continue\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n </>\n )}\n </div>\n </div>\n </div>\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 {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.title\")\n : t(\"errors.verification_failed\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.subtitle\")\n : isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: \"document\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: \"document\",\n })}\n </Subtitle>\n </div>\n\n {/* Specimen warning */}\n {!blockContinue && errorCode?.startsWith(\"8\") && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\"errors.specimen_detected\")}\n </p>\n </div>\n )}\n\n {/* Error details - Validation Points */}\n {!blockContinue && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* Resubmission limit message */}\n {!blockContinue && !isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\"errors.resubmission.max_attempts_reached\")}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {!blockContinue && getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n 💡 {t(\"errors.improvement_tips\")}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {!blockContinue && isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\"errors.next_steps_description\")}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIError;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { getActiveSessionId } from '../../services/sessionMemoryStore.js';
|
|
|
8
8
|
import { isPng, dataUrlToFile, isJpeg, convertJpegToPng, isPdf, convertPdfToPng } from '../../utils/imageConverter.js';
|
|
9
9
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
10
10
|
import { requiresTwoSides } from '../../utils/documentLabels.js';
|
|
11
|
+
import { isS3UploadNotConfirmedError } from '../../utils/analysisErrors.js';
|
|
11
12
|
|
|
12
13
|
// Fonction pour obtenir les étapes de traitement traduites
|
|
13
14
|
var getProcessingSteps = function (t) { return [
|
|
@@ -55,8 +56,13 @@ var JDIProcessing = memo(function (_a) {
|
|
|
55
56
|
return "".concat(((_a = fileUploaded.front) === null || _a === void 0 ? void 0 : _a.substring(0, 50)) || "no-front", "-").concat(((_b = fileUploaded.back) === null || _b === void 0 ? void 0 : _b.substring(0, 50)) || "no-back");
|
|
56
57
|
}, [fileUploaded]);
|
|
57
58
|
// Callback stable pour onProcessingComplete
|
|
58
|
-
var stableOnProcessingComplete = useCallback(function (success, retryCount, analysisData) {
|
|
59
|
-
|
|
59
|
+
var stableOnProcessingComplete = useCallback(function (success, retryCount, analysisData, blockContinue) {
|
|
60
|
+
if (blockContinue === true) {
|
|
61
|
+
onProcessingComplete(success, retryCount, analysisData, true);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
onProcessingComplete(success, retryCount, analysisData);
|
|
65
|
+
}
|
|
60
66
|
}, [onProcessingComplete]);
|
|
61
67
|
useEffect(function () {
|
|
62
68
|
// Empêcher les appels multiples
|
|
@@ -121,7 +127,7 @@ var JDIProcessing = memo(function (_a) {
|
|
|
121
127
|
});
|
|
122
128
|
}); };
|
|
123
129
|
var processFiles = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
124
|
-
var _loop_1, i, error_2, failedStepIndex_1, errorMessage, isNetworkError;
|
|
130
|
+
var _loop_1, i, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed;
|
|
125
131
|
return __generator(this, function (_a) {
|
|
126
132
|
switch (_a.label) {
|
|
127
133
|
case 0:
|
|
@@ -306,10 +312,12 @@ var JDIProcessing = memo(function (_a) {
|
|
|
306
312
|
isNetworkError = errorMessage.includes("network") ||
|
|
307
313
|
errorMessage.includes("CORS") ||
|
|
308
314
|
errorMessage.includes("timeout");
|
|
315
|
+
isUploadNotConfirmed = isS3UploadNotConfirmedError(error_2);
|
|
309
316
|
setAnalysisResult({
|
|
310
317
|
success: false,
|
|
311
318
|
data: null,
|
|
312
|
-
canRetry: isNetworkError
|
|
319
|
+
canRetry: isNetworkError || isUploadNotConfirmed,
|
|
320
|
+
blockContinue: isUploadNotConfirmed,
|
|
313
321
|
});
|
|
314
322
|
setIsComplete(true);
|
|
315
323
|
return [3 /*break*/, 7];
|
|
@@ -338,7 +346,7 @@ var JDIProcessing = memo(function (_a) {
|
|
|
338
346
|
setTimeout(function () {
|
|
339
347
|
var allowRetry = analysisResult.success || analysisResult.canRetry === true;
|
|
340
348
|
// Pass predictions array instead of raw data
|
|
341
|
-
stableOnProcessingComplete(analysisResult.success, allowRetry ? retryCount : undefined, analysisResult.predictions || null);
|
|
349
|
+
stableOnProcessingComplete(analysisResult.success, allowRetry ? retryCount : undefined, analysisResult.predictions || null, analysisResult.blockContinue);
|
|
342
350
|
}, 1000);
|
|
343
351
|
}
|
|
344
352
|
}, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);
|