datakeen-session-react 1.1.140-rc.94 → 1.1.140-rc.96
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/.gitlab-ci.yml +9 -3
- package/dist/cjs/components/jdi/JDIError.js +8 -4
- package/dist/cjs/components/jdi/JDIError.js.map +1 -1
- package/dist/cjs/components/jdi/JDIProcessing.js +3 -7
- package/dist/cjs/components/jdi/JDIProcessing.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +8 -3
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +8 -3
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/services/pollingService.js.map +1 -1
- package/dist/cjs/utils/apiAnalysis.js.map +1 -1
- package/dist/cjs/utils/validationUtils.js +35 -2
- package/dist/cjs/utils/validationUtils.js.map +1 -1
- package/dist/esm/components/jdi/JDIError.js +8 -4
- package/dist/esm/components/jdi/JDIError.js.map +1 -1
- package/dist/esm/components/jdi/JDIProcessing.js +3 -7
- package/dist/esm/components/jdi/JDIProcessing.js.map +1 -1
- package/dist/esm/i18n/en.json.js +8 -3
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +8 -3
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/services/pollingService.js.map +1 -1
- package/dist/esm/utils/apiAnalysis.js.map +1 -1
- package/dist/esm/utils/validationUtils.js +35 -2
- package/dist/esm/utils/validationUtils.js.map +1 -1
- package/dist/types/utils/apiAnalysis.d.ts +13 -1
- package/package.json +1 -1
package/.gitlab-ci.yml
CHANGED
|
@@ -132,9 +132,11 @@ publish:main:
|
|
|
132
132
|
- git config user.email "ci@datakeen.io"
|
|
133
133
|
- git config user.name "Datakeen CI"
|
|
134
134
|
- git remote set-url origin https://${CI_PUSH_USER}:${CI_PUSH_TOKEN}@gitlab.datakeen.co/datakeenteam/teamfullstack/client-sessions-react-sdk.git
|
|
135
|
+
- git fetch origin "$CI_COMMIT_BRANCH"
|
|
136
|
+
- git checkout -B "$CI_COMMIT_BRANCH" "origin/$CI_COMMIT_BRANCH"
|
|
135
137
|
- 'npm version patch -m "chore(release): %s"'
|
|
136
138
|
- export TARGET_TAG="v$(node -p "require('./package.json').version")"
|
|
137
|
-
- git push -o ci.skip origin
|
|
139
|
+
- git push -o ci.skip origin "$CI_COMMIT_BRANCH"
|
|
138
140
|
- git push -o ci.skip origin --tags
|
|
139
141
|
- git remote add relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git" 2>/dev/null || git remote set-url relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git"
|
|
140
142
|
- git checkout --orphan "relay-snapshot-${CI_JOB_ID}"
|
|
@@ -185,9 +187,11 @@ publish:staging:
|
|
|
185
187
|
- git config user.email "ci@datakeen.io"
|
|
186
188
|
- git config user.name "Datakeen CI"
|
|
187
189
|
- git remote set-url origin https://${CI_PUSH_USER}:${CI_PUSH_TOKEN}@gitlab.datakeen.co/datakeenteam/teamfullstack/client-sessions-react-sdk.git
|
|
190
|
+
- git fetch origin "$CI_COMMIT_BRANCH"
|
|
191
|
+
- git checkout -B "$CI_COMMIT_BRANCH" "origin/$CI_COMMIT_BRANCH"
|
|
188
192
|
- 'npm version prerelease --preid=rc -m "chore(release): %s"'
|
|
189
193
|
- export TARGET_TAG="v$(node -p "require('./package.json').version")"
|
|
190
|
-
- git push -o ci.skip origin
|
|
194
|
+
- git push -o ci.skip origin "$CI_COMMIT_BRANCH"
|
|
191
195
|
- git push -o ci.skip origin --tags
|
|
192
196
|
- git remote add relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git" 2>/dev/null || git remote set-url relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git"
|
|
193
197
|
- git checkout --orphan "relay-snapshot-${CI_JOB_ID}"
|
|
@@ -238,9 +242,11 @@ publish:dev:
|
|
|
238
242
|
- git config user.email "ci@datakeen.io"
|
|
239
243
|
- git config user.name "Datakeen CI"
|
|
240
244
|
- git remote set-url origin https://${CI_PUSH_USER}:${CI_PUSH_TOKEN}@gitlab.datakeen.co/datakeenteam/teamfullstack/client-sessions-react-sdk.git
|
|
245
|
+
- git fetch origin "$CI_COMMIT_BRANCH"
|
|
246
|
+
- git checkout -B "$CI_COMMIT_BRANCH" "origin/$CI_COMMIT_BRANCH"
|
|
241
247
|
- 'npm version prerelease --preid=dev -m "chore(release): %s"'
|
|
242
248
|
- export TARGET_TAG="v$(node -p "require('./package.json').version")"
|
|
243
|
-
- git push -o ci.skip origin
|
|
249
|
+
- git push -o ci.skip origin "$CI_COMMIT_BRANCH"
|
|
244
250
|
- git push -o ci.skip origin --tags
|
|
245
251
|
- git remote add relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git" 2>/dev/null || git remote set-url relay "https://oauth2:${RELAY_API_TOKEN}@gitlab.com/datakeen-ci-relay/npm-publish-relay.git"
|
|
246
252
|
- git checkout --orphan "relay-snapshot-${CI_JOB_ID}"
|
|
@@ -14,13 +14,17 @@ var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
|
14
14
|
|
|
15
15
|
var DEFAULT_PREDICTIONS = [];
|
|
16
16
|
var JDIError = function (_a) {
|
|
17
|
-
|
|
17
|
+
var _b;
|
|
18
|
+
_a.documentType; var onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _c = _a.retryCount, retryCount = _c === void 0 ? 0 : _c, _d = _a.predictions, predictions = _d === void 0 ? DEFAULT_PREDICTIONS : _d, errorCode = _a.errorCode; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _e = _a.isRetryAllowed, isRetryAllowed = _e === void 0 ? true : _e, _f = _a.blockContinue, blockContinue = _f === void 0 ? false : _f;
|
|
18
19
|
var t = useI18n.useI18n().t;
|
|
19
|
-
var
|
|
20
|
+
var _g = React.useState([]), validationPoints = _g[0], setValidationPoints = _g[1];
|
|
21
|
+
// Détail de mismatch d'identité (code 7.0), calculé côté backend et porté
|
|
22
|
+
// par la première prédiction. Absent pour tous les autres codes.
|
|
23
|
+
var mismatchDetails = (_b = predictions === null || predictions === void 0 ? void 0 : predictions[0]) === null || _b === void 0 ? void 0 : _b.mismatchDetails;
|
|
20
24
|
React.useEffect(function () {
|
|
21
25
|
// Use shared utility to get validation points
|
|
22
|
-
setValidationPoints(validationUtils.getValidationPoints(errorCode, predictions, t, "error"));
|
|
23
|
-
}, [predictions, errorCode, t]);
|
|
26
|
+
setValidationPoints(validationUtils.getValidationPoints(errorCode, predictions, t, "error", mismatchDetails));
|
|
27
|
+
}, [predictions, errorCode, t, mismatchDetails]);
|
|
24
28
|
// Get user guidance message if available
|
|
25
29
|
var getUserGuidance = function () {
|
|
26
30
|
if (!errorCode)
|
|
@@ -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 /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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":["useI18n","useState","useEffect","getValidationPoints","_jsx","MobilePageLayout","_jsxs","Button","ButtonDesktop","Title","Subtitle"],"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 /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\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 // Détail de mismatch d'identité (code 7.0), calculé côté backend et porté\n // par la première prédiction. Absent pour tous les autres codes.\n const mismatchDetails = predictions?.[0]?.mismatchDetails;\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\", mismatchDetails),\n );\n }, [predictions, errorCode, t, mismatchDetails]);\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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":["useI18n","useState","useEffect","getValidationPoints","_jsx","MobilePageLayout","_jsxs","Button","ButtonDesktop","Title","Subtitle"],"mappings":"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"}
|
|
@@ -132,7 +132,7 @@ var JDIProcessing = React.memo(function (_a) {
|
|
|
132
132
|
});
|
|
133
133
|
}); };
|
|
134
134
|
var processFiles = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
135
|
-
var i, response, extractedCode, codeName, codeDescription, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed;
|
|
135
|
+
var i, response, extractedCode, codeName, codeDescription, mismatchDetails, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed;
|
|
136
136
|
return tslib_es6.__generator(this, function (_a) {
|
|
137
137
|
switch (_a.label) {
|
|
138
138
|
case 0:
|
|
@@ -244,14 +244,10 @@ var JDIProcessing = React.memo(function (_a) {
|
|
|
244
244
|
extractedCode = String(response.code);
|
|
245
245
|
codeName = response === null || response === void 0 ? void 0 : response.codeName;
|
|
246
246
|
codeDescription = response === null || response === void 0 ? void 0 : response.codeDescription;
|
|
247
|
+
mismatchDetails = response === null || response === void 0 ? void 0 : response.mismatchDetails;
|
|
247
248
|
predictions = [];
|
|
248
249
|
if (extractedCode && codeName) {
|
|
249
|
-
predictions.push({
|
|
250
|
-
code: extractedCode,
|
|
251
|
-
codeName: codeName,
|
|
252
|
-
codeDescription: codeDescription || "",
|
|
253
|
-
type: "document",
|
|
254
|
-
});
|
|
250
|
+
predictions.push(tslib_es6.__assign({ code: extractedCode, codeName: codeName, codeDescription: codeDescription || "", type: "document" }, (mismatchDetails ? { mismatchDetails: mismatchDetails } : {})));
|
|
255
251
|
}
|
|
256
252
|
isSuccess = !jdiCodes.isBlockingCode(extractedCode, blockingCodes);
|
|
257
253
|
canRetry = isSuccess === false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport { isS3UploadNotConfirmedError } from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\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 // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n const extractedCode = String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n\n setAnalysisResult({\n success: false,\n data: null,\n canRetry: isNetworkError || 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 documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\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 {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\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\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["memo","useI18n","useState","useRef","useMemo","useCallback","useEffect","getActiveSessionId","__awaiter","isPdf","convertPdfToPng","uploadConvertedIdCardImage","isJpeg","convertJpegToPng","isPng","dataUrlToFile","analyzeFiles","requiresTwoSides","__assign","isBlockingCode","isS3UploadNotConfirmedError","_jsx","_jsxs","Title","Subtitle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport { isS3UploadNotConfirmedError } from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\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 // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n const extractedCode = String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n const mismatchDetails = response?.mismatchDetails;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n ...(mismatchDetails ? { mismatchDetails } : {}),\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n\n setAnalysisResult({\n success: false,\n data: null,\n canRetry: isNetworkError || 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 documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\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 {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\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\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["memo","useI18n","useState","useRef","useMemo","useCallback","useEffect","getActiveSessionId","__awaiter","isPdf","convertPdfToPng","uploadConvertedIdCardImage","isJpeg","convertJpegToPng","isPng","dataUrlToFile","analyzeFiles","requiresTwoSides","__assign","isBlockingCode","isS3UploadNotConfirmedError","_jsx","_jsxs","Title","Subtitle"],"mappings":"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"}
|
package/dist/cjs/i18n/en.json.js
CHANGED
|
@@ -177,7 +177,8 @@ var validation_points = {
|
|
|
177
177
|
},
|
|
178
178
|
"4.0": {
|
|
179
179
|
quality: "• Image quality: Validated",
|
|
180
|
-
readability: "• Information readability: Confirmed"
|
|
180
|
+
readability: "• Information readability: Confirmed",
|
|
181
|
+
document: "• Document: A security element on the card could not be verified due to its quality, please submit another file."
|
|
181
182
|
},
|
|
182
183
|
"4.1": {
|
|
183
184
|
quality: "• Image quality: Validated",
|
|
@@ -189,7 +190,8 @@ var validation_points = {
|
|
|
189
190
|
},
|
|
190
191
|
"5.0": {
|
|
191
192
|
quality: "• Image quality: Validated",
|
|
192
|
-
readability: "• Information readability: Confirmed"
|
|
193
|
+
readability: "• Information readability: Confirmed",
|
|
194
|
+
document: "• Document: A security element on the card could not be verified due to its quality, please submit another file."
|
|
193
195
|
},
|
|
194
196
|
"6.0": {
|
|
195
197
|
quality: "• Image quality: Validated",
|
|
@@ -198,7 +200,10 @@ var validation_points = {
|
|
|
198
200
|
"7.0": {
|
|
199
201
|
quality: "• Image quality: Validated",
|
|
200
202
|
readability: "• Information readability: Confirmed",
|
|
201
|
-
document: "• Document: Information on document and entered data do not match"
|
|
203
|
+
document: "• Document: Information on document and entered data do not match",
|
|
204
|
+
mismatch_first_name: "• Document: The entered first name: \"{{entered}}\" does not match the one read on the document: \"{{read}}\"",
|
|
205
|
+
mismatch_last_name: "• Document: The entered last name: \"{{entered}}\" does not match the one read on the document: \"{{read}}\"",
|
|
206
|
+
mismatch_birth_date: "• Document: The entered date of birth: \"{{entered}}\" does not match the one read on the document: \"{{read}}\""
|
|
202
207
|
},
|
|
203
208
|
"7.1": {
|
|
204
209
|
quality: "• Image quality: Validated",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/i18n/fr.json.js
CHANGED
|
@@ -177,7 +177,8 @@ var validation_points = {
|
|
|
177
177
|
},
|
|
178
178
|
"4.0": {
|
|
179
179
|
quality: "• Qualité des images : Validée",
|
|
180
|
-
readability: "• Lisibilité des informations : Confirmée"
|
|
180
|
+
readability: "• Lisibilité des informations : Confirmée",
|
|
181
|
+
document: "• Document : Un élément de sécurité de la carte n'a pas pu être vérifié en raison de sa qualité, veuillez soumettre un autre fichier."
|
|
181
182
|
},
|
|
182
183
|
"4.1": {
|
|
183
184
|
quality: "• Qualité des images : Validée",
|
|
@@ -189,7 +190,8 @@ var validation_points = {
|
|
|
189
190
|
},
|
|
190
191
|
"5.0": {
|
|
191
192
|
quality: "• Qualité des images : Validée",
|
|
192
|
-
readability: "• Lisibilité des informations : Confirmée"
|
|
193
|
+
readability: "• Lisibilité des informations : Confirmée",
|
|
194
|
+
document: "• Document : Un élément de sécurité de la carte n'a pas pu être vérifié en raison de sa qualité, veuillez soumettre un autre fichier."
|
|
193
195
|
},
|
|
194
196
|
"6.0": {
|
|
195
197
|
quality: "• Qualité des images : Validée",
|
|
@@ -198,7 +200,10 @@ var validation_points = {
|
|
|
198
200
|
"7.0": {
|
|
199
201
|
quality: "• Qualité des images : Validée",
|
|
200
202
|
readability: "• Lisibilité des informations : Confirmée",
|
|
201
|
-
document: "• Document : Les informations sur le document et celles saisies ne correspondent pas"
|
|
203
|
+
document: "• Document : Les informations sur le document et celles saisies ne correspondent pas",
|
|
204
|
+
mismatch_first_name: "• Document : Le prénom saisi : \"{{entered}}\" ne correspond pas à celui lu sur la pièce : \"{{read}}\"",
|
|
205
|
+
mismatch_last_name: "• Document : Le nom saisi : \"{{entered}}\" ne correspond pas à celui lu sur la pièce : \"{{read}}\"",
|
|
206
|
+
mismatch_birth_date: "• Document : La date de naissance saisie : \"{{entered}}\" ne correspond pas à celle lue sur la pièce : \"{{read}}\""
|
|
202
207
|
},
|
|
203
208
|
"7.1": {
|
|
204
209
|
quality: "• Qualité des images : Validée",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pollingService.js","sources":["../../../../src/services/pollingService.ts"],"sourcesContent":["import { apiService } from \"./api\";\n\nexport interface AnalysisStatusResponse {\n sessionId: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n progress: number; // 0-100\n currentStep: string; // Backend status: 'analyzing', 'approved', 'rejected', 'to_verify', 'failed', 'error'\n message: string;\n analysisId: string | null;\n analysisStatus?: string; // Raw backend analysis status for debugging\n code?: string; // Conformity code from document (e.g., \"1.0\", \"2.0\", etc.)\n codeName?: string; // Code name (e.g., \"conform\", \"non_conform\")\n codeDescription?: string; // Code description\n startedAt: string | null;\n completedAt: string | null;\n hasResults?: boolean;\n elapsedSeconds?: number;\n}\n\nexport interface PollingOptions {\n interval?: number; // milliseconds between polls (default: 2000)\n maxAttempts?: number; // max number of polls (default: 300 = 10 minutes at 2s interval)\n onProgress?: (status: AnalysisStatusResponse) => void; // callback on status update\n onComplete?: (status: AnalysisStatusResponse) => void; // callback when analysis completes\n onFailed?: (status: AnalysisStatusResponse, error?: string) => void; // callback when analysis fails\n timeout?: number; // total timeout in milliseconds (default: 600000 = 10 minutes)\n}\n\nlet pollingTimeoutId: NodeJS.Timeout | null = null;\nlet pollingStartTime: number = 0;\nlet isPollingActive: boolean = false;\n\n/**\n * Get user-friendly message based on analysis status\n */\nfunction getUserFriendlyMessage(status: AnalysisStatusResponse): string {\n const { currentStep, progress } = status;\n\n // Processing (50%)\n if (progress === 50 && currentStep === 'analyzing') {\n return 'Analyzing your documents...';\n }\n\n // Completed (100%)\n if (progress === 100) {\n switch (currentStep) {\n case 'approved':\n return 'Document verified successfully ✓';\n case 'rejected':\n return 'Document verification failed';\n case 'to_verify':\n return 'Manual verification required';\n case 'failed':\n case 'error':\n return 'Analysis error occurred';\n case 'completed':\n default:\n return 'Analysis completed';\n }\n }\n\n // Default fallback\n return status.message || 'Processing...';\n}\n\n/**\n * Poll the analysis status endpoint until analysis is complete or fails\n * @param sessionId Session ID to check status for\n * @param options Polling configuration\n * @returns Promise that resolves when analysis completes or rejects on failure\n */\nexport async function pollAnalysisStatus(\n sessionId: string,\n options: PollingOptions = {}\n): Promise<AnalysisStatusResponse> {\n const {\n interval = 2000,\n maxAttempts = 300,\n onProgress,\n onComplete,\n onFailed,\n timeout = 600000,\n } = options;\n\n console.log(\n `📡 Starting polling for session ${sessionId} (interval: ${interval}ms, max attempts: ${maxAttempts})`\n );\n\n pollingStartTime = Date.now();\n let attempts = 0;\n isPollingActive = true;\n\n return new Promise((resolve, reject) => {\n // Clear any existing polling\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n }\n\n const poll = async () => {\n if (!isPollingActive) {\n reject(new Error(\"Polling stopped\"));\n return;\n }\n\n try {\n attempts++;\n\n // Check if we've exceeded timeout\n const elapsedTime = Date.now() - pollingStartTime;\n if (elapsedTime > timeout) {\n const errorMsg = `⏱️ Polling timeout exceeded (${elapsedTime}ms)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Check if we've exceeded max attempts\n if (attempts > maxAttempts) {\n const errorMsg = `⚠️ Polling max attempts exceeded (${maxAttempts} attempts)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Fetch status from backend\n const response = await apiService.get<AnalysisStatusResponse>(\n `session/sdk/${sessionId}/analysis-status`\n );\n\n const status = response.data;\n\n // Add user-friendly message\n const userMessage = getUserFriendlyMessage(status);\n\n // Call progress callback with user-friendly message\n if (onProgress) {\n onProgress({\n ...status,\n message: userMessage,\n });\n }\n\n // Check if analysis is complete (progress = 100%)\n if (status.progress === 100) {\n // Check if it's a failure\n if (status.currentStep === 'failed' || status.currentStep === 'error') {\n console.error(\n `❌ Analysis failed for session ${sessionId}: ${status.message}`\n );\n if (onFailed) {\n onFailed(status, status.message);\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(`Analysis failed: ${userMessage}`));\n return;\n }\n\n // Analysis completed successfully (approved, rejected, to_verify, or completed)\n console.log(`✅ Analysis completed for session ${sessionId} with status: ${status.currentStep}`);\n if (onComplete) {\n onComplete({\n ...status,\n message: userMessage,\n });\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n resolve({\n ...status,\n message: userMessage,\n });\n return;\n }\n\n // Still processing (progress = 50%), schedule next poll\n pollingTimeoutId = setTimeout(poll, interval);\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\n `❌ Polling error on attempt #${attempts}: ${errorMsg}`\n );\n\n // On network error, retry if we haven't exceeded attempts\n if (attempts < maxAttempts) {\n console.log(`🔄 Retrying in ${interval}ms...`);\n pollingTimeoutId = setTimeout(poll, interval);\n } else {\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(\n new Error(\n `Failed to get analysis status after ${attempts} attempts: ${errorMsg}`\n )\n );\n }\n }\n };\n\n // Start polling\n poll();\n });\n}\n\n/**\n * Stop polling for analysis status\n */\nexport function stopPolling(): void {\n isPollingActive = false;\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n pollingTimeoutId = null;\n }\n console.log(\"🛑 Polling stopped\");\n}\n"],"names":["__awaiter","apiService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pollingService.js","sources":["../../../../src/services/pollingService.ts"],"sourcesContent":["import { apiService } from \"./api\";\nimport type { JdiMismatchDetail } from \"../utils/apiAnalysis\";\n\nexport interface AnalysisStatusResponse {\n sessionId: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n progress: number; // 0-100\n currentStep: string; // Backend status: 'analyzing', 'approved', 'rejected', 'to_verify', 'failed', 'error'\n message: string;\n analysisId: string | null;\n analysisStatus?: string; // Raw backend analysis status for debugging\n code?: string; // Conformity code from document (e.g., \"1.0\", \"2.0\", etc.)\n codeName?: string; // Code name (e.g., \"conform\", \"non_conform\")\n codeDescription?: string; // Code description\n // Présent uniquement pour le code 7.0, quand un mismatch d'identité est détecté.\n mismatchDetails?: JdiMismatchDetail[];\n startedAt: string | null;\n completedAt: string | null;\n hasResults?: boolean;\n elapsedSeconds?: number;\n}\n\nexport interface PollingOptions {\n interval?: number; // milliseconds between polls (default: 2000)\n maxAttempts?: number; // max number of polls (default: 300 = 10 minutes at 2s interval)\n onProgress?: (status: AnalysisStatusResponse) => void; // callback on status update\n onComplete?: (status: AnalysisStatusResponse) => void; // callback when analysis completes\n onFailed?: (status: AnalysisStatusResponse, error?: string) => void; // callback when analysis fails\n timeout?: number; // total timeout in milliseconds (default: 600000 = 10 minutes)\n}\n\nlet pollingTimeoutId: NodeJS.Timeout | null = null;\nlet pollingStartTime: number = 0;\nlet isPollingActive: boolean = false;\n\n/**\n * Get user-friendly message based on analysis status\n */\nfunction getUserFriendlyMessage(status: AnalysisStatusResponse): string {\n const { currentStep, progress } = status;\n\n // Processing (50%)\n if (progress === 50 && currentStep === 'analyzing') {\n return 'Analyzing your documents...';\n }\n\n // Completed (100%)\n if (progress === 100) {\n switch (currentStep) {\n case 'approved':\n return 'Document verified successfully ✓';\n case 'rejected':\n return 'Document verification failed';\n case 'to_verify':\n return 'Manual verification required';\n case 'failed':\n case 'error':\n return 'Analysis error occurred';\n case 'completed':\n default:\n return 'Analysis completed';\n }\n }\n\n // Default fallback\n return status.message || 'Processing...';\n}\n\n/**\n * Poll the analysis status endpoint until analysis is complete or fails\n * @param sessionId Session ID to check status for\n * @param options Polling configuration\n * @returns Promise that resolves when analysis completes or rejects on failure\n */\nexport async function pollAnalysisStatus(\n sessionId: string,\n options: PollingOptions = {}\n): Promise<AnalysisStatusResponse> {\n const {\n interval = 2000,\n maxAttempts = 300,\n onProgress,\n onComplete,\n onFailed,\n timeout = 600000,\n } = options;\n\n console.log(\n `📡 Starting polling for session ${sessionId} (interval: ${interval}ms, max attempts: ${maxAttempts})`\n );\n\n pollingStartTime = Date.now();\n let attempts = 0;\n isPollingActive = true;\n\n return new Promise((resolve, reject) => {\n // Clear any existing polling\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n }\n\n const poll = async () => {\n if (!isPollingActive) {\n reject(new Error(\"Polling stopped\"));\n return;\n }\n\n try {\n attempts++;\n\n // Check if we've exceeded timeout\n const elapsedTime = Date.now() - pollingStartTime;\n if (elapsedTime > timeout) {\n const errorMsg = `⏱️ Polling timeout exceeded (${elapsedTime}ms)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Check if we've exceeded max attempts\n if (attempts > maxAttempts) {\n const errorMsg = `⚠️ Polling max attempts exceeded (${maxAttempts} attempts)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Fetch status from backend\n const response = await apiService.get<AnalysisStatusResponse>(\n `session/sdk/${sessionId}/analysis-status`\n );\n\n const status = response.data;\n\n // Add user-friendly message\n const userMessage = getUserFriendlyMessage(status);\n\n // Call progress callback with user-friendly message\n if (onProgress) {\n onProgress({\n ...status,\n message: userMessage,\n });\n }\n\n // Check if analysis is complete (progress = 100%)\n if (status.progress === 100) {\n // Check if it's a failure\n if (status.currentStep === 'failed' || status.currentStep === 'error') {\n console.error(\n `❌ Analysis failed for session ${sessionId}: ${status.message}`\n );\n if (onFailed) {\n onFailed(status, status.message);\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(`Analysis failed: ${userMessage}`));\n return;\n }\n\n // Analysis completed successfully (approved, rejected, to_verify, or completed)\n console.log(`✅ Analysis completed for session ${sessionId} with status: ${status.currentStep}`);\n if (onComplete) {\n onComplete({\n ...status,\n message: userMessage,\n });\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n resolve({\n ...status,\n message: userMessage,\n });\n return;\n }\n\n // Still processing (progress = 50%), schedule next poll\n pollingTimeoutId = setTimeout(poll, interval);\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\n `❌ Polling error on attempt #${attempts}: ${errorMsg}`\n );\n\n // On network error, retry if we haven't exceeded attempts\n if (attempts < maxAttempts) {\n console.log(`🔄 Retrying in ${interval}ms...`);\n pollingTimeoutId = setTimeout(poll, interval);\n } else {\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(\n new Error(\n `Failed to get analysis status after ${attempts} attempts: ${errorMsg}`\n )\n );\n }\n }\n };\n\n // Start polling\n poll();\n });\n}\n\n/**\n * Stop polling for analysis status\n */\nexport function stopPolling(): void {\n isPollingActive = false;\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n pollingTimeoutId = null;\n }\n console.log(\"🛑 Polling stopped\");\n}\n"],"names":["__awaiter","apiService"],"mappings":";;;;;AA+BA,IAAI,gBAAgB,GAA0B,IAAI;AAClD,IAAI,gBAAgB,GAAW,CAAC;AAChC,IAAI,eAAe,GAAY,KAAK;AAEpC;;AAEG;AACH,SAAS,sBAAsB,CAAC,MAA8B,EAAA;IACpD,IAAA,WAAW,GAAe,MAAM,CAAA,WAArB,EAAE,QAAQ,GAAK,MAAM,CAAA,QAAX;;IAG7B,IAAI,QAAQ,KAAK,EAAE,IAAI,WAAW,KAAK,WAAW,EAAE;AAClD,QAAA,OAAO,6BAA6B;IACtC;;AAGA,IAAA,IAAI,QAAQ,KAAK,GAAG,EAAE;QACpB,QAAQ,WAAW;AACjB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,kCAAkC;AAC3C,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,8BAA8B;AACvC,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,8BAA8B;AACvC,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,yBAAyB;AAClC,YAAA,KAAK,WAAW;AAChB,YAAA;AACE,gBAAA,OAAO,oBAAoB;;IAEjC;;AAGA,IAAA,OAAO,MAAM,CAAC,OAAO,IAAI,eAAe;AAC1C;AAEA;;;;;AAKG;SACmB,kBAAkB,CAAA,WAAA,EAAA;AACtC,IAAA,OAAAA,mBAAA,CAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,SAAiB,EACjB,OAA4B,EAAA;;;AAA5B,QAAA,IAAA,OAAA,KAAA,MAAA,EAAA,EAAA,OAAA,GAAA,EAA4B,CAAA,CAAA;;AAG1B,YAAA,EAAA,GAME,OAAO,CAAA,QANM,EAAf,QAAQ,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,KAAA,EACf,EAAA,GAKE,OAAO,CAAA,WALQ,EAAjB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,GAAG,GAAA,EAAA,EACjB,UAAU,GAIR,OAAO,CAAA,UAJC,EACV,UAAU,GAGR,OAAO,WAHC,EACV,QAAQ,GAEN,OAAO,CAAA,QAFD,EACR,EAAA,GACE,OAAO,CAAA,OADO,EAAhB,OAAO,GAAA,EAAA,KAAA,MAAA,GAAG,MAAM,KAAA;YAGlB,OAAO,CAAC,GAAG,CACT,4CAAA,CAAA,MAAA,CAAmC,SAAS,EAAA,cAAA,CAAA,CAAA,MAAA,CAAe,QAAQ,EAAA,oBAAA,CAAA,CAAA,MAAA,CAAqB,WAAW,EAAA,GAAA,CAAG,CACvG;AAED,YAAA,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE;YACzB,QAAQ,GAAG,CAAC;YAChB,eAAe,GAAG,IAAI;AAEtB,YAAA,OAAA,CAAA,CAAA,aAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM,EAAA;;oBAEjC,IAAI,gBAAgB,EAAE;wBACpB,YAAY,CAAC,gBAAgB,CAAC;oBAChC;AAEA,oBAAA,IAAM,IAAI,GAAG,YAAA,EAAA,OAAAA,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;oCACX,IAAI,CAAC,eAAe,EAAE;AACpB,wCAAA,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;wCACpC,OAAA,CAAA,CAAA,YAAA;oCACF;;;;AAGE,oCAAA,QAAQ,EAAE;AAGJ,oCAAA,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB;AACjD,oCAAA,IAAI,WAAW,GAAG,OAAO,EAAE;AACnB,wCAAA,QAAQ,GAAG,yCAAA,CAAA,MAAA,CAAgC,WAAW,EAAA,KAAA,CAAK;AACjE,wCAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;wCACtB,eAAe,GAAG,KAAK;wCACvB,gBAAgB,GAAG,IAAI;AACvB,wCAAA,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;wCAC3B,OAAA,CAAA,CAAA,YAAA;oCACF;;AAGA,oCAAA,IAAI,QAAQ,GAAG,WAAW,EAAE;AACpB,wCAAA,QAAQ,GAAG,8CAAA,CAAA,MAAA,CAAqC,WAAW,EAAA,YAAA,CAAY;AAC7E,wCAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;wCACtB,eAAe,GAAG,KAAK;wCACvB,gBAAgB,GAAG,IAAI;AACvB,wCAAA,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;wCAC3B,OAAA,CAAA,CAAA,YAAA;oCACF;oCAGiB,OAAA,CAAA,CAAA,YAAMC,cAAU,CAAC,GAAG,CACnC,sBAAe,SAAS,EAAA,kBAAA,CAAkB,CAC3C,CAAA;;AAFK,oCAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAEhB;oCAEK,QAAA,GAAS,QAAQ,CAAC,IAAI;AAGtB,oCAAA,WAAW,GAAG,sBAAsB,CAAC,QAAM,CAAC;;oCAGlD,IAAI,UAAU,EAAE;AACd,wCAAA,UAAU,2CACL,QAAM,CAAA,EAAA,EACT,OAAO,EAAE,WAAW,IACpB;oCACJ;;AAGA,oCAAA,IAAI,QAAM,CAAC,QAAQ,KAAK,GAAG,EAAE;;AAE3B,wCAAA,IAAI,QAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,QAAM,CAAC,WAAW,KAAK,OAAO,EAAE;4CACrE,OAAO,CAAC,KAAK,CACX,qCAAA,CAAA,MAAA,CAAiC,SAAS,EAAA,IAAA,CAAA,CAAA,MAAA,CAAK,QAAM,CAAC,OAAO,CAAE,CAChE;4CACD,IAAI,QAAQ,EAAE;AACZ,gDAAA,QAAQ,CAAC,QAAM,EAAE,QAAM,CAAC,OAAO,CAAC;4CAClC;4CACA,eAAe,GAAG,KAAK;4CACvB,gBAAgB,GAAG,IAAI;4CACvB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAAoB,WAAW,CAAE,CAAC,CAAC;4CACpD,OAAA,CAAA,CAAA,YAAA;wCACF;;wCAGA,OAAO,CAAC,GAAG,CAAC,wCAAA,CAAA,MAAA,CAAoC,SAAS,EAAA,gBAAA,CAAA,CAAA,MAAA,CAAiB,QAAM,CAAC,WAAW,CAAE,CAAC;wCAC/F,IAAI,UAAU,EAAE;AACd,4CAAA,UAAU,2CACL,QAAM,CAAA,EAAA,EACT,OAAO,EAAE,WAAW,IACpB;wCACJ;wCACA,eAAe,GAAG,KAAK;wCACvB,gBAAgB,GAAG,IAAI;AACvB,wCAAA,OAAO,2CACF,QAAM,CAAA,EAAA,EACT,OAAO,EAAE,WAAW,IACpB;wCACF,OAAA,CAAA,CAAA,YAAA;oCACF;;AAGA,oCAAA,gBAAgB,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;;;;AAEvC,oCAAA,QAAQ,GACZ,OAAK,YAAY,KAAK,GAAG,OAAK,CAAC,OAAO,GAAG,eAAe;oCAC1D,OAAO,CAAC,KAAK,CACX,mCAAA,CAAA,MAAA,CAA+B,QAAQ,EAAA,IAAA,CAAA,CAAA,MAAA,CAAK,QAAQ,CAAE,CACvD;;AAGD,oCAAA,IAAI,QAAQ,GAAG,WAAW,EAAE;AAC1B,wCAAA,OAAO,CAAC,GAAG,CAAC,mCAAkB,QAAQ,EAAA,OAAA,CAAO,CAAC;AAC9C,wCAAA,gBAAgB,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;oCAC/C;yCAAO;wCACL,eAAe,GAAG,KAAK;wCACvB,gBAAgB,GAAG,IAAI;wCACvB,MAAM,CACJ,IAAI,KAAK,CACP,sCAAA,CAAA,MAAA,CAAuC,QAAQ,EAAA,aAAA,CAAA,CAAA,MAAA,CAAc,QAAQ,CAAE,CACxE,CACF;oCACH;;;;;yBAEH;;AAGD,oBAAA,IAAI,EAAE;AACR,gBAAA,CAAC,CAAC,CAAA;;;AACH;AAED;;AAEG;SACa,WAAW,GAAA;IACzB,eAAe,GAAG,KAAK;IACvB,IAAI,gBAAgB,EAAE;QACpB,YAAY,CAAC,gBAAgB,CAAC;QAC9B,gBAAgB,GAAG,IAAI;IACzB;AACA,IAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AACnC;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiAnalysis.js","sources":["../../../../src/utils/apiAnalysis.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"apiAnalysis.js","sources":["../../../../src/utils/apiAnalysis.ts"],"sourcesContent":["/**\n * Détail d'un champ d'identité en échec pour le code 7.0 (owner mismatch) :\n * valeur saisie par l'utilisateur vs valeur lue sur le document, telles que\n * calculées côté backend (voir GET /session/sdk/:id/analysis-status).\n */\nexport interface JdiMismatchDetail {\n field: 'firstName' | 'lastName' | 'birthDate';\n entered: string;\n read: string;\n}\n\nexport interface Prediction {\n code: string;\n codeDescription: string;\n codeName: string;\n type: string;\n userInput?: {\n birthDate?: string;\n firstName?: string;\n lastName?: string;\n };\n /** Présent uniquement pour le code 7.0, quand un mismatch a été détecté. */\n mismatchDetails?: JdiMismatchDetail[];\n}\n\nexport interface AnalysisResult {\n predictions: Prediction[];\n internal_status: string;\n analysis_id: string;\n}\n\n/**\n * Extrait les root causes principales à partir des prédictions de l'API\n * Retourne les codes d'erreur (ex: \"2.2\", \"4.0\") au lieu des codeNames\n */\nexport const extractRootCauses = (predictions: Prediction[]): string[] => {\n if (!predictions || !Array.isArray(predictions)) {\n return [];\n }\n\n return predictions\n .filter(prediction => prediction.code && prediction.code !== '1.0')\n .map(prediction => prediction.code);\n};\n\n/**\n * Détermine si l'analyse a échoué basé sur les prédictions\n */\nexport const hasAnalysisFailed = (predictions: Prediction[]): boolean => {\n if (!predictions || !Array.isArray(predictions)) {\n return true;\n }\n\n // Si au moins une prédiction n'est pas '1.0' (conform), l'analyse a échoué\n return predictions.some(prediction =>\n prediction.code && prediction.code !== '1.0'\n );\n};\n\n/**\n * Obtient la root cause principale (première dans la liste)\n */\nexport const getPrimaryRootCause = (predictions: Prediction[]): string | null => {\n const rootCauses = extractRootCauses(predictions);\n return rootCauses.length > 0 ? rootCauses[0] : null;\n};\n\nexport function analyzeApiResponse(response: { status: number; data: any }) {\n // Dummy implementation for test\n return response.status === 200 ? 'success' : 'error';\n}\n"],"names":[],"mappings":";;AA+BA;;;AAGG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO;AACJ,SAAA,MAAM,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,CAAA,CAA5C,CAA4C;SACjE,GAAG,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,CAAA,CAAf,CAAe,CAAC;AACvC;AAEA;;AAEG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAA,UAAU,EAAA;QAChC,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;AAA5C,IAAA,CAA4C,CAC7C;AACH;AAEA;;AAEG;AACI,IAAM,mBAAmB,GAAG,UAAC,WAAyB,EAAA;AAC3D,IAAA,IAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC;AACjD,IAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;AACrD;;;;;;"}
|
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var tslib_es6 = require('../node_modules/tslib/tslib.es6.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Clé i18n (suffixe de `validation_points.7.0.*`) pour chaque champ d'identité
|
|
7
|
+
* en échec. Voir docs backend NFC_JDI_ERROR_MAPPING.md pour le référentiel de
|
|
8
|
+
* codes — 7.0 = "owner" (le détenteur du document ne correspond pas à la
|
|
9
|
+
* saisie utilisateur).
|
|
10
|
+
*/
|
|
11
|
+
var MISMATCH_FIELD_KEY = {
|
|
12
|
+
firstName: "mismatch_first_name",
|
|
13
|
+
lastName: "mismatch_last_name",
|
|
14
|
+
birthDate: "mismatch_birth_date",
|
|
15
|
+
};
|
|
3
16
|
/**
|
|
4
17
|
* Default validation points for success scenarios
|
|
5
18
|
*/
|
|
@@ -32,10 +45,14 @@ function getErrorCodeFromPredictions(predictions) {
|
|
|
32
45
|
* @param predictions - Optional predictions array as fallback for error code
|
|
33
46
|
* @param t - Translation function from i18n
|
|
34
47
|
* @param type - Type of scenario: 'success' or 'error'
|
|
48
|
+
* @param mismatchDetails - Pour le code 7.0 uniquement : champs d'identité en
|
|
49
|
+
* échec (saisi vs lu), calculés côté backend. S'ils sont fournis et non
|
|
50
|
+
* vides, remplacent la bullet "document" générique par un message
|
|
51
|
+
* personnalisé par champ. Sinon, comportement inchangé (message générique).
|
|
35
52
|
* @returns Array of validation point strings
|
|
36
53
|
*/
|
|
37
54
|
function getValidationPoints(errorCode, predictions, t, // Using any to be compatible with i18n TFunction
|
|
38
|
-
type) {
|
|
55
|
+
type, mismatchDetails) {
|
|
39
56
|
// Use errorCode from props, or try to get from predictions as fallback
|
|
40
57
|
var code = errorCode;
|
|
41
58
|
if (!code) {
|
|
@@ -45,9 +62,25 @@ type) {
|
|
|
45
62
|
// Try to get code-specific validation points from i18n
|
|
46
63
|
var quality = t("validation_points.".concat(code, ".quality"), "");
|
|
47
64
|
var readability = t("validation_points.".concat(code, ".readability"), "");
|
|
48
|
-
var document_1 = t("validation_points.".concat(code, ".document"), "");
|
|
49
65
|
// If we have at least quality and readability, use code-specific points
|
|
50
66
|
if (quality && readability) {
|
|
67
|
+
if (code === '7.0' && mismatchDetails && mismatchDetails.length > 0) {
|
|
68
|
+
var mismatchBullets = mismatchDetails
|
|
69
|
+
.map(function (detail) {
|
|
70
|
+
var fieldKey = MISMATCH_FIELD_KEY[detail.field];
|
|
71
|
+
if (!fieldKey)
|
|
72
|
+
return "";
|
|
73
|
+
return t("validation_points.7.0.".concat(fieldKey), {
|
|
74
|
+
entered: detail.entered,
|
|
75
|
+
read: detail.read,
|
|
76
|
+
});
|
|
77
|
+
})
|
|
78
|
+
.filter(Boolean);
|
|
79
|
+
if (mismatchBullets.length > 0) {
|
|
80
|
+
return tslib_es6.__spreadArray([quality, readability], mismatchBullets, true).filter(Boolean);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
var document_1 = t("validation_points.".concat(code, ".document"), "");
|
|
51
84
|
// Filter out empty strings
|
|
52
85
|
return [quality, readability, document_1].filter(Boolean);
|
|
53
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validationUtils.js","sources":["../../../../src/utils/validationUtils.ts"],"sourcesContent":["import type { Prediction } from \"./apiAnalysis\";\n\n/**\n * Default validation points for success scenarios\n */\nconst DEFAULT_SUCCESS_VALIDATION_POINTS = {\n quality: \"success.quality_excellent\",\n readability: \"success.readability_confirmed\",\n authenticity: \"success.authenticity_verified\",\n} as const;\n\n/**\n * Default validation points for error scenarios\n */\nconst DEFAULT_ERROR_VALIDATION_POINTS = {\n quality: \"errors.image_quality_insufficient\",\n readability: \"errors.readability_problematic\",\n authenticity: \"errors.authenticity_not_verified\",\n} as const;\n\n/**\n * Safely extracts error code from predictions array\n */\nexport function getErrorCodeFromPredictions(predictions?: Prediction[] | null): string | null {\n if (!predictions || !Array.isArray(predictions) || predictions.length === 0) {\n return null;\n }\n return predictions[0].code || null;\n}\n\n/**\n * Gets validation points based on error code and scenario type\n
|
|
1
|
+
{"version":3,"file":"validationUtils.js","sources":["../../../../src/utils/validationUtils.ts"],"sourcesContent":["import type { Prediction, JdiMismatchDetail } from \"./apiAnalysis\";\n\n/**\n * Clé i18n (suffixe de `validation_points.7.0.*`) pour chaque champ d'identité\n * en échec. Voir docs backend NFC_JDI_ERROR_MAPPING.md pour le référentiel de\n * codes — 7.0 = \"owner\" (le détenteur du document ne correspond pas à la\n * saisie utilisateur).\n */\nconst MISMATCH_FIELD_KEY: Record<JdiMismatchDetail[\"field\"], string> = {\n firstName: \"mismatch_first_name\",\n lastName: \"mismatch_last_name\",\n birthDate: \"mismatch_birth_date\",\n};\n\n/**\n * Default validation points for success scenarios\n */\nconst DEFAULT_SUCCESS_VALIDATION_POINTS = {\n quality: \"success.quality_excellent\",\n readability: \"success.readability_confirmed\",\n authenticity: \"success.authenticity_verified\",\n} as const;\n\n/**\n * Default validation points for error scenarios\n */\nconst DEFAULT_ERROR_VALIDATION_POINTS = {\n quality: \"errors.image_quality_insufficient\",\n readability: \"errors.readability_problematic\",\n authenticity: \"errors.authenticity_not_verified\",\n} as const;\n\n/**\n * Safely extracts error code from predictions array\n */\nexport function getErrorCodeFromPredictions(predictions?: Prediction[] | null): string | null {\n if (!predictions || !Array.isArray(predictions) || predictions.length === 0) {\n return null;\n }\n return predictions[0].code || null;\n}\n\n/**\n * Gets validation points based on error code and scenario type\n *\n * @param errorCode - The error code from API response (e.g., \"1.0\", \"2.1\")\n * @param predictions - Optional predictions array as fallback for error code\n * @param t - Translation function from i18n\n * @param type - Type of scenario: 'success' or 'error'\n * @param mismatchDetails - Pour le code 7.0 uniquement : champs d'identité en\n * échec (saisi vs lu), calculés côté backend. S'ils sont fournis et non\n * vides, remplacent la bullet \"document\" générique par un message\n * personnalisé par champ. Sinon, comportement inchangé (message générique).\n * @returns Array of validation point strings\n */\nexport function getValidationPoints(\n errorCode: string | undefined | null,\n predictions: Prediction[] | undefined | null,\n t: any, // Using any to be compatible with i18n TFunction\n type: 'success' | 'error',\n mismatchDetails?: JdiMismatchDetail[] | null,\n): string[] {\n // Use errorCode from props, or try to get from predictions as fallback\n let code = errorCode;\n if (!code) {\n code = getErrorCodeFromPredictions(predictions);\n }\n\n if (code) {\n // Try to get code-specific validation points from i18n\n const quality = t(`validation_points.${code}.quality`, \"\");\n const readability = t(`validation_points.${code}.readability`, \"\");\n\n // If we have at least quality and readability, use code-specific points\n if (quality && readability) {\n if (code === '7.0' && mismatchDetails && mismatchDetails.length > 0) {\n const mismatchBullets = mismatchDetails\n .map((detail) => {\n const fieldKey = MISMATCH_FIELD_KEY[detail.field];\n if (!fieldKey) return \"\";\n return t(`validation_points.7.0.${fieldKey}`, {\n entered: detail.entered,\n read: detail.read,\n });\n })\n .filter(Boolean);\n\n if (mismatchBullets.length > 0) {\n return [quality, readability, ...mismatchBullets].filter(Boolean);\n }\n }\n\n const document = t(`validation_points.${code}.document`, \"\");\n // Filter out empty strings\n return [quality, readability, document].filter(Boolean);\n }\n }\n\n // Fallback to default validation points\n const defaults = type === 'success'\n ? DEFAULT_SUCCESS_VALIDATION_POINTS\n : DEFAULT_ERROR_VALIDATION_POINTS;\n\n return [\n t(defaults.quality, \"\"),\n t(defaults.readability, \"\"),\n t(defaults.authenticity, \"\"),\n ].filter(Boolean);\n}\n"],"names":["__spreadArray"],"mappings":"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"}
|
|
@@ -10,13 +10,17 @@ import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
|
10
10
|
|
|
11
11
|
var DEFAULT_PREDICTIONS = [];
|
|
12
12
|
var JDIError = function (_a) {
|
|
13
|
-
|
|
13
|
+
var _b;
|
|
14
|
+
_a.documentType; var onRetry = _a.onRetry, onContinueAnyway = _a.onContinueAnyway, onBackToUserInput = _a.onBackToUserInput, _c = _a.retryCount, retryCount = _c === void 0 ? 0 : _c, _d = _a.predictions, predictions = _d === void 0 ? DEFAULT_PREDICTIONS : _d, errorCode = _a.errorCode; _a.allowResubmission; var maxResubmissionAttempts = _a.maxResubmissionAttempts, _e = _a.isRetryAllowed, isRetryAllowed = _e === void 0 ? true : _e, _f = _a.blockContinue, blockContinue = _f === void 0 ? false : _f;
|
|
14
15
|
var t = useI18n().t;
|
|
15
|
-
var
|
|
16
|
+
var _g = useState([]), validationPoints = _g[0], setValidationPoints = _g[1];
|
|
17
|
+
// Détail de mismatch d'identité (code 7.0), calculé côté backend et porté
|
|
18
|
+
// par la première prédiction. Absent pour tous les autres codes.
|
|
19
|
+
var mismatchDetails = (_b = predictions === null || predictions === void 0 ? void 0 : predictions[0]) === null || _b === void 0 ? void 0 : _b.mismatchDetails;
|
|
16
20
|
useEffect(function () {
|
|
17
21
|
// Use shared utility to get validation points
|
|
18
|
-
setValidationPoints(getValidationPoints(errorCode, predictions, t, "error"));
|
|
19
|
-
}, [predictions, errorCode, t]);
|
|
22
|
+
setValidationPoints(getValidationPoints(errorCode, predictions, t, "error", mismatchDetails));
|
|
23
|
+
}, [predictions, errorCode, t, mismatchDetails]);
|
|
20
24
|
// Get user guidance message if available
|
|
21
25
|
var getUserGuidance = function () {
|
|
22
26
|
if (!errorCode)
|
|
@@ -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 /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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"],"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 /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\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 // Détail de mismatch d'identité (code 7.0), calculé côté backend et porté\n // par la première prédiction. Absent pour tous les autres codes.\n const mismatchDetails = predictions?.[0]?.mismatchDetails;\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\", mismatchDetails),\n );\n }, [predictions, errorCode, t, mismatchDetails]);\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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 && onContinueAnyway && (\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"],"mappings":"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"}
|
|
@@ -128,7 +128,7 @@ var JDIProcessing = memo(function (_a) {
|
|
|
128
128
|
});
|
|
129
129
|
}); };
|
|
130
130
|
var processFiles = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
131
|
-
var i, response, extractedCode, codeName, codeDescription, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed;
|
|
131
|
+
var i, response, extractedCode, codeName, codeDescription, mismatchDetails, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed;
|
|
132
132
|
return __generator(this, function (_a) {
|
|
133
133
|
switch (_a.label) {
|
|
134
134
|
case 0:
|
|
@@ -240,14 +240,10 @@ var JDIProcessing = memo(function (_a) {
|
|
|
240
240
|
extractedCode = String(response.code);
|
|
241
241
|
codeName = response === null || response === void 0 ? void 0 : response.codeName;
|
|
242
242
|
codeDescription = response === null || response === void 0 ? void 0 : response.codeDescription;
|
|
243
|
+
mismatchDetails = response === null || response === void 0 ? void 0 : response.mismatchDetails;
|
|
243
244
|
predictions = [];
|
|
244
245
|
if (extractedCode && codeName) {
|
|
245
|
-
predictions.push({
|
|
246
|
-
code: extractedCode,
|
|
247
|
-
codeName: codeName,
|
|
248
|
-
codeDescription: codeDescription || "",
|
|
249
|
-
type: "document",
|
|
250
|
-
});
|
|
246
|
+
predictions.push(__assign({ code: extractedCode, codeName: codeName, codeDescription: codeDescription || "", type: "document" }, (mismatchDetails ? { mismatchDetails: mismatchDetails } : {})));
|
|
251
247
|
}
|
|
252
248
|
isSuccess = !isBlockingCode(extractedCode, blockingCodes);
|
|
253
249
|
canRetry = isSuccess === false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport { isS3UploadNotConfirmedError } from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\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 // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n const extractedCode = String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n\n setAnalysisResult({\n success: false,\n data: null,\n canRetry: isNetworkError || 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 documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\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 {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\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\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport { isS3UploadNotConfirmedError } from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\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 // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n const extractedCode = String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n const mismatchDetails = response?.mismatchDetails;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n ...(mismatchDetails ? { mismatchDetails } : {}),\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n\n setAnalysisResult({\n success: false,\n data: null,\n canRetry: isNetworkError || 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 documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\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 {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\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\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/dist/esm/i18n/en.json.js
CHANGED
|
@@ -173,7 +173,8 @@ var validation_points = {
|
|
|
173
173
|
},
|
|
174
174
|
"4.0": {
|
|
175
175
|
quality: "• Image quality: Validated",
|
|
176
|
-
readability: "• Information readability: Confirmed"
|
|
176
|
+
readability: "• Information readability: Confirmed",
|
|
177
|
+
document: "• Document: A security element on the card could not be verified due to its quality, please submit another file."
|
|
177
178
|
},
|
|
178
179
|
"4.1": {
|
|
179
180
|
quality: "• Image quality: Validated",
|
|
@@ -185,7 +186,8 @@ var validation_points = {
|
|
|
185
186
|
},
|
|
186
187
|
"5.0": {
|
|
187
188
|
quality: "• Image quality: Validated",
|
|
188
|
-
readability: "• Information readability: Confirmed"
|
|
189
|
+
readability: "• Information readability: Confirmed",
|
|
190
|
+
document: "• Document: A security element on the card could not be verified due to its quality, please submit another file."
|
|
189
191
|
},
|
|
190
192
|
"6.0": {
|
|
191
193
|
quality: "• Image quality: Validated",
|
|
@@ -194,7 +196,10 @@ var validation_points = {
|
|
|
194
196
|
"7.0": {
|
|
195
197
|
quality: "• Image quality: Validated",
|
|
196
198
|
readability: "• Information readability: Confirmed",
|
|
197
|
-
document: "• Document: Information on document and entered data do not match"
|
|
199
|
+
document: "• Document: Information on document and entered data do not match",
|
|
200
|
+
mismatch_first_name: "• Document: The entered first name: \"{{entered}}\" does not match the one read on the document: \"{{read}}\"",
|
|
201
|
+
mismatch_last_name: "• Document: The entered last name: \"{{entered}}\" does not match the one read on the document: \"{{read}}\"",
|
|
202
|
+
mismatch_birth_date: "• Document: The entered date of birth: \"{{entered}}\" does not match the one read on the document: \"{{read}}\""
|
|
198
203
|
},
|
|
199
204
|
"7.1": {
|
|
200
205
|
quality: "• Image quality: Validated",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/i18n/fr.json.js
CHANGED
|
@@ -173,7 +173,8 @@ var validation_points = {
|
|
|
173
173
|
},
|
|
174
174
|
"4.0": {
|
|
175
175
|
quality: "• Qualité des images : Validée",
|
|
176
|
-
readability: "• Lisibilité des informations : Confirmée"
|
|
176
|
+
readability: "• Lisibilité des informations : Confirmée",
|
|
177
|
+
document: "• Document : Un élément de sécurité de la carte n'a pas pu être vérifié en raison de sa qualité, veuillez soumettre un autre fichier."
|
|
177
178
|
},
|
|
178
179
|
"4.1": {
|
|
179
180
|
quality: "• Qualité des images : Validée",
|
|
@@ -185,7 +186,8 @@ var validation_points = {
|
|
|
185
186
|
},
|
|
186
187
|
"5.0": {
|
|
187
188
|
quality: "• Qualité des images : Validée",
|
|
188
|
-
readability: "• Lisibilité des informations : Confirmée"
|
|
189
|
+
readability: "• Lisibilité des informations : Confirmée",
|
|
190
|
+
document: "• Document : Un élément de sécurité de la carte n'a pas pu être vérifié en raison de sa qualité, veuillez soumettre un autre fichier."
|
|
189
191
|
},
|
|
190
192
|
"6.0": {
|
|
191
193
|
quality: "• Qualité des images : Validée",
|
|
@@ -194,7 +196,10 @@ var validation_points = {
|
|
|
194
196
|
"7.0": {
|
|
195
197
|
quality: "• Qualité des images : Validée",
|
|
196
198
|
readability: "• Lisibilité des informations : Confirmée",
|
|
197
|
-
document: "• Document : Les informations sur le document et celles saisies ne correspondent pas"
|
|
199
|
+
document: "• Document : Les informations sur le document et celles saisies ne correspondent pas",
|
|
200
|
+
mismatch_first_name: "• Document : Le prénom saisi : \"{{entered}}\" ne correspond pas à celui lu sur la pièce : \"{{read}}\"",
|
|
201
|
+
mismatch_last_name: "• Document : Le nom saisi : \"{{entered}}\" ne correspond pas à celui lu sur la pièce : \"{{read}}\"",
|
|
202
|
+
mismatch_birth_date: "• Document : La date de naissance saisie : \"{{entered}}\" ne correspond pas à celle lue sur la pièce : \"{{read}}\""
|
|
198
203
|
},
|
|
199
204
|
"7.1": {
|
|
200
205
|
quality: "• Qualité des images : Validée",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pollingService.js","sources":["../../../../src/services/pollingService.ts"],"sourcesContent":["import { apiService } from \"./api\";\n\nexport interface AnalysisStatusResponse {\n sessionId: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n progress: number; // 0-100\n currentStep: string; // Backend status: 'analyzing', 'approved', 'rejected', 'to_verify', 'failed', 'error'\n message: string;\n analysisId: string | null;\n analysisStatus?: string; // Raw backend analysis status for debugging\n code?: string; // Conformity code from document (e.g., \"1.0\", \"2.0\", etc.)\n codeName?: string; // Code name (e.g., \"conform\", \"non_conform\")\n codeDescription?: string; // Code description\n startedAt: string | null;\n completedAt: string | null;\n hasResults?: boolean;\n elapsedSeconds?: number;\n}\n\nexport interface PollingOptions {\n interval?: number; // milliseconds between polls (default: 2000)\n maxAttempts?: number; // max number of polls (default: 300 = 10 minutes at 2s interval)\n onProgress?: (status: AnalysisStatusResponse) => void; // callback on status update\n onComplete?: (status: AnalysisStatusResponse) => void; // callback when analysis completes\n onFailed?: (status: AnalysisStatusResponse, error?: string) => void; // callback when analysis fails\n timeout?: number; // total timeout in milliseconds (default: 600000 = 10 minutes)\n}\n\nlet pollingTimeoutId: NodeJS.Timeout | null = null;\nlet pollingStartTime: number = 0;\nlet isPollingActive: boolean = false;\n\n/**\n * Get user-friendly message based on analysis status\n */\nfunction getUserFriendlyMessage(status: AnalysisStatusResponse): string {\n const { currentStep, progress } = status;\n\n // Processing (50%)\n if (progress === 50 && currentStep === 'analyzing') {\n return 'Analyzing your documents...';\n }\n\n // Completed (100%)\n if (progress === 100) {\n switch (currentStep) {\n case 'approved':\n return 'Document verified successfully ✓';\n case 'rejected':\n return 'Document verification failed';\n case 'to_verify':\n return 'Manual verification required';\n case 'failed':\n case 'error':\n return 'Analysis error occurred';\n case 'completed':\n default:\n return 'Analysis completed';\n }\n }\n\n // Default fallback\n return status.message || 'Processing...';\n}\n\n/**\n * Poll the analysis status endpoint until analysis is complete or fails\n * @param sessionId Session ID to check status for\n * @param options Polling configuration\n * @returns Promise that resolves when analysis completes or rejects on failure\n */\nexport async function pollAnalysisStatus(\n sessionId: string,\n options: PollingOptions = {}\n): Promise<AnalysisStatusResponse> {\n const {\n interval = 2000,\n maxAttempts = 300,\n onProgress,\n onComplete,\n onFailed,\n timeout = 600000,\n } = options;\n\n console.log(\n `📡 Starting polling for session ${sessionId} (interval: ${interval}ms, max attempts: ${maxAttempts})`\n );\n\n pollingStartTime = Date.now();\n let attempts = 0;\n isPollingActive = true;\n\n return new Promise((resolve, reject) => {\n // Clear any existing polling\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n }\n\n const poll = async () => {\n if (!isPollingActive) {\n reject(new Error(\"Polling stopped\"));\n return;\n }\n\n try {\n attempts++;\n\n // Check if we've exceeded timeout\n const elapsedTime = Date.now() - pollingStartTime;\n if (elapsedTime > timeout) {\n const errorMsg = `⏱️ Polling timeout exceeded (${elapsedTime}ms)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Check if we've exceeded max attempts\n if (attempts > maxAttempts) {\n const errorMsg = `⚠️ Polling max attempts exceeded (${maxAttempts} attempts)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Fetch status from backend\n const response = await apiService.get<AnalysisStatusResponse>(\n `session/sdk/${sessionId}/analysis-status`\n );\n\n const status = response.data;\n\n // Add user-friendly message\n const userMessage = getUserFriendlyMessage(status);\n\n // Call progress callback with user-friendly message\n if (onProgress) {\n onProgress({\n ...status,\n message: userMessage,\n });\n }\n\n // Check if analysis is complete (progress = 100%)\n if (status.progress === 100) {\n // Check if it's a failure\n if (status.currentStep === 'failed' || status.currentStep === 'error') {\n console.error(\n `❌ Analysis failed for session ${sessionId}: ${status.message}`\n );\n if (onFailed) {\n onFailed(status, status.message);\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(`Analysis failed: ${userMessage}`));\n return;\n }\n\n // Analysis completed successfully (approved, rejected, to_verify, or completed)\n console.log(`✅ Analysis completed for session ${sessionId} with status: ${status.currentStep}`);\n if (onComplete) {\n onComplete({\n ...status,\n message: userMessage,\n });\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n resolve({\n ...status,\n message: userMessage,\n });\n return;\n }\n\n // Still processing (progress = 50%), schedule next poll\n pollingTimeoutId = setTimeout(poll, interval);\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\n `❌ Polling error on attempt #${attempts}: ${errorMsg}`\n );\n\n // On network error, retry if we haven't exceeded attempts\n if (attempts < maxAttempts) {\n console.log(`🔄 Retrying in ${interval}ms...`);\n pollingTimeoutId = setTimeout(poll, interval);\n } else {\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(\n new Error(\n `Failed to get analysis status after ${attempts} attempts: ${errorMsg}`\n )\n );\n }\n }\n };\n\n // Start polling\n poll();\n });\n}\n\n/**\n * Stop polling for analysis status\n */\nexport function stopPolling(): void {\n isPollingActive = false;\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n pollingTimeoutId = null;\n }\n console.log(\"🛑 Polling stopped\");\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pollingService.js","sources":["../../../../src/services/pollingService.ts"],"sourcesContent":["import { apiService } from \"./api\";\nimport type { JdiMismatchDetail } from \"../utils/apiAnalysis\";\n\nexport interface AnalysisStatusResponse {\n sessionId: string;\n status: \"pending\" | \"processing\" | \"completed\" | \"failed\";\n progress: number; // 0-100\n currentStep: string; // Backend status: 'analyzing', 'approved', 'rejected', 'to_verify', 'failed', 'error'\n message: string;\n analysisId: string | null;\n analysisStatus?: string; // Raw backend analysis status for debugging\n code?: string; // Conformity code from document (e.g., \"1.0\", \"2.0\", etc.)\n codeName?: string; // Code name (e.g., \"conform\", \"non_conform\")\n codeDescription?: string; // Code description\n // Présent uniquement pour le code 7.0, quand un mismatch d'identité est détecté.\n mismatchDetails?: JdiMismatchDetail[];\n startedAt: string | null;\n completedAt: string | null;\n hasResults?: boolean;\n elapsedSeconds?: number;\n}\n\nexport interface PollingOptions {\n interval?: number; // milliseconds between polls (default: 2000)\n maxAttempts?: number; // max number of polls (default: 300 = 10 minutes at 2s interval)\n onProgress?: (status: AnalysisStatusResponse) => void; // callback on status update\n onComplete?: (status: AnalysisStatusResponse) => void; // callback when analysis completes\n onFailed?: (status: AnalysisStatusResponse, error?: string) => void; // callback when analysis fails\n timeout?: number; // total timeout in milliseconds (default: 600000 = 10 minutes)\n}\n\nlet pollingTimeoutId: NodeJS.Timeout | null = null;\nlet pollingStartTime: number = 0;\nlet isPollingActive: boolean = false;\n\n/**\n * Get user-friendly message based on analysis status\n */\nfunction getUserFriendlyMessage(status: AnalysisStatusResponse): string {\n const { currentStep, progress } = status;\n\n // Processing (50%)\n if (progress === 50 && currentStep === 'analyzing') {\n return 'Analyzing your documents...';\n }\n\n // Completed (100%)\n if (progress === 100) {\n switch (currentStep) {\n case 'approved':\n return 'Document verified successfully ✓';\n case 'rejected':\n return 'Document verification failed';\n case 'to_verify':\n return 'Manual verification required';\n case 'failed':\n case 'error':\n return 'Analysis error occurred';\n case 'completed':\n default:\n return 'Analysis completed';\n }\n }\n\n // Default fallback\n return status.message || 'Processing...';\n}\n\n/**\n * Poll the analysis status endpoint until analysis is complete or fails\n * @param sessionId Session ID to check status for\n * @param options Polling configuration\n * @returns Promise that resolves when analysis completes or rejects on failure\n */\nexport async function pollAnalysisStatus(\n sessionId: string,\n options: PollingOptions = {}\n): Promise<AnalysisStatusResponse> {\n const {\n interval = 2000,\n maxAttempts = 300,\n onProgress,\n onComplete,\n onFailed,\n timeout = 600000,\n } = options;\n\n console.log(\n `📡 Starting polling for session ${sessionId} (interval: ${interval}ms, max attempts: ${maxAttempts})`\n );\n\n pollingStartTime = Date.now();\n let attempts = 0;\n isPollingActive = true;\n\n return new Promise((resolve, reject) => {\n // Clear any existing polling\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n }\n\n const poll = async () => {\n if (!isPollingActive) {\n reject(new Error(\"Polling stopped\"));\n return;\n }\n\n try {\n attempts++;\n\n // Check if we've exceeded timeout\n const elapsedTime = Date.now() - pollingStartTime;\n if (elapsedTime > timeout) {\n const errorMsg = `⏱️ Polling timeout exceeded (${elapsedTime}ms)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Check if we've exceeded max attempts\n if (attempts > maxAttempts) {\n const errorMsg = `⚠️ Polling max attempts exceeded (${maxAttempts} attempts)`;\n console.warn(errorMsg);\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(errorMsg));\n return;\n }\n\n // Fetch status from backend\n const response = await apiService.get<AnalysisStatusResponse>(\n `session/sdk/${sessionId}/analysis-status`\n );\n\n const status = response.data;\n\n // Add user-friendly message\n const userMessage = getUserFriendlyMessage(status);\n\n // Call progress callback with user-friendly message\n if (onProgress) {\n onProgress({\n ...status,\n message: userMessage,\n });\n }\n\n // Check if analysis is complete (progress = 100%)\n if (status.progress === 100) {\n // Check if it's a failure\n if (status.currentStep === 'failed' || status.currentStep === 'error') {\n console.error(\n `❌ Analysis failed for session ${sessionId}: ${status.message}`\n );\n if (onFailed) {\n onFailed(status, status.message);\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(new Error(`Analysis failed: ${userMessage}`));\n return;\n }\n\n // Analysis completed successfully (approved, rejected, to_verify, or completed)\n console.log(`✅ Analysis completed for session ${sessionId} with status: ${status.currentStep}`);\n if (onComplete) {\n onComplete({\n ...status,\n message: userMessage,\n });\n }\n isPollingActive = false;\n pollingTimeoutId = null;\n resolve({\n ...status,\n message: userMessage,\n });\n return;\n }\n\n // Still processing (progress = 50%), schedule next poll\n pollingTimeoutId = setTimeout(poll, interval);\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n console.error(\n `❌ Polling error on attempt #${attempts}: ${errorMsg}`\n );\n\n // On network error, retry if we haven't exceeded attempts\n if (attempts < maxAttempts) {\n console.log(`🔄 Retrying in ${interval}ms...`);\n pollingTimeoutId = setTimeout(poll, interval);\n } else {\n isPollingActive = false;\n pollingTimeoutId = null;\n reject(\n new Error(\n `Failed to get analysis status after ${attempts} attempts: ${errorMsg}`\n )\n );\n }\n }\n };\n\n // Start polling\n poll();\n });\n}\n\n/**\n * Stop polling for analysis status\n */\nexport function stopPolling(): void {\n isPollingActive = false;\n if (pollingTimeoutId) {\n clearTimeout(pollingTimeoutId);\n pollingTimeoutId = null;\n }\n console.log(\"🛑 Polling stopped\");\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiAnalysis.js","sources":["../../../../src/utils/apiAnalysis.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"apiAnalysis.js","sources":["../../../../src/utils/apiAnalysis.ts"],"sourcesContent":["/**\n * Détail d'un champ d'identité en échec pour le code 7.0 (owner mismatch) :\n * valeur saisie par l'utilisateur vs valeur lue sur le document, telles que\n * calculées côté backend (voir GET /session/sdk/:id/analysis-status).\n */\nexport interface JdiMismatchDetail {\n field: 'firstName' | 'lastName' | 'birthDate';\n entered: string;\n read: string;\n}\n\nexport interface Prediction {\n code: string;\n codeDescription: string;\n codeName: string;\n type: string;\n userInput?: {\n birthDate?: string;\n firstName?: string;\n lastName?: string;\n };\n /** Présent uniquement pour le code 7.0, quand un mismatch a été détecté. */\n mismatchDetails?: JdiMismatchDetail[];\n}\n\nexport interface AnalysisResult {\n predictions: Prediction[];\n internal_status: string;\n analysis_id: string;\n}\n\n/**\n * Extrait les root causes principales à partir des prédictions de l'API\n * Retourne les codes d'erreur (ex: \"2.2\", \"4.0\") au lieu des codeNames\n */\nexport const extractRootCauses = (predictions: Prediction[]): string[] => {\n if (!predictions || !Array.isArray(predictions)) {\n return [];\n }\n\n return predictions\n .filter(prediction => prediction.code && prediction.code !== '1.0')\n .map(prediction => prediction.code);\n};\n\n/**\n * Détermine si l'analyse a échoué basé sur les prédictions\n */\nexport const hasAnalysisFailed = (predictions: Prediction[]): boolean => {\n if (!predictions || !Array.isArray(predictions)) {\n return true;\n }\n\n // Si au moins une prédiction n'est pas '1.0' (conform), l'analyse a échoué\n return predictions.some(prediction =>\n prediction.code && prediction.code !== '1.0'\n );\n};\n\n/**\n * Obtient la root cause principale (première dans la liste)\n */\nexport const getPrimaryRootCause = (predictions: Prediction[]): string | null => {\n const rootCauses = extractRootCauses(predictions);\n return rootCauses.length > 0 ? rootCauses[0] : null;\n};\n\nexport function analyzeApiResponse(response: { status: number; data: any }) {\n // Dummy implementation for test\n return response.status === 200 ? 'success' : 'error';\n}\n"],"names":[],"mappings":"AA+BA;;;AAGG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO;AACJ,SAAA,MAAM,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK,CAAA,CAA5C,CAA4C;SACjE,GAAG,CAAC,UAAA,UAAU,EAAA,EAAI,OAAA,UAAU,CAAC,IAAI,CAAA,CAAf,CAAe,CAAC;AACvC;AAEA;;AAEG;AACI,IAAM,iBAAiB,GAAG,UAAC,WAAyB,EAAA;IACzD,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC/C,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,OAAO,WAAW,CAAC,IAAI,CAAC,UAAA,UAAU,EAAA;QAChC,OAAA,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;AAA5C,IAAA,CAA4C,CAC7C;AACH;AAEA;;AAEG;AACI,IAAM,mBAAmB,GAAG,UAAC,WAAyB,EAAA;AAC3D,IAAA,IAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC;AACjD,IAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;AACrD;;;;"}
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
import { __spreadArray } from '../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Clé i18n (suffixe de `validation_points.7.0.*`) pour chaque champ d'identité
|
|
5
|
+
* en échec. Voir docs backend NFC_JDI_ERROR_MAPPING.md pour le référentiel de
|
|
6
|
+
* codes — 7.0 = "owner" (le détenteur du document ne correspond pas à la
|
|
7
|
+
* saisie utilisateur).
|
|
8
|
+
*/
|
|
9
|
+
var MISMATCH_FIELD_KEY = {
|
|
10
|
+
firstName: "mismatch_first_name",
|
|
11
|
+
lastName: "mismatch_last_name",
|
|
12
|
+
birthDate: "mismatch_birth_date",
|
|
13
|
+
};
|
|
1
14
|
/**
|
|
2
15
|
* Default validation points for success scenarios
|
|
3
16
|
*/
|
|
@@ -30,10 +43,14 @@ function getErrorCodeFromPredictions(predictions) {
|
|
|
30
43
|
* @param predictions - Optional predictions array as fallback for error code
|
|
31
44
|
* @param t - Translation function from i18n
|
|
32
45
|
* @param type - Type of scenario: 'success' or 'error'
|
|
46
|
+
* @param mismatchDetails - Pour le code 7.0 uniquement : champs d'identité en
|
|
47
|
+
* échec (saisi vs lu), calculés côté backend. S'ils sont fournis et non
|
|
48
|
+
* vides, remplacent la bullet "document" générique par un message
|
|
49
|
+
* personnalisé par champ. Sinon, comportement inchangé (message générique).
|
|
33
50
|
* @returns Array of validation point strings
|
|
34
51
|
*/
|
|
35
52
|
function getValidationPoints(errorCode, predictions, t, // Using any to be compatible with i18n TFunction
|
|
36
|
-
type) {
|
|
53
|
+
type, mismatchDetails) {
|
|
37
54
|
// Use errorCode from props, or try to get from predictions as fallback
|
|
38
55
|
var code = errorCode;
|
|
39
56
|
if (!code) {
|
|
@@ -43,9 +60,25 @@ type) {
|
|
|
43
60
|
// Try to get code-specific validation points from i18n
|
|
44
61
|
var quality = t("validation_points.".concat(code, ".quality"), "");
|
|
45
62
|
var readability = t("validation_points.".concat(code, ".readability"), "");
|
|
46
|
-
var document_1 = t("validation_points.".concat(code, ".document"), "");
|
|
47
63
|
// If we have at least quality and readability, use code-specific points
|
|
48
64
|
if (quality && readability) {
|
|
65
|
+
if (code === '7.0' && mismatchDetails && mismatchDetails.length > 0) {
|
|
66
|
+
var mismatchBullets = mismatchDetails
|
|
67
|
+
.map(function (detail) {
|
|
68
|
+
var fieldKey = MISMATCH_FIELD_KEY[detail.field];
|
|
69
|
+
if (!fieldKey)
|
|
70
|
+
return "";
|
|
71
|
+
return t("validation_points.7.0.".concat(fieldKey), {
|
|
72
|
+
entered: detail.entered,
|
|
73
|
+
read: detail.read,
|
|
74
|
+
});
|
|
75
|
+
})
|
|
76
|
+
.filter(Boolean);
|
|
77
|
+
if (mismatchBullets.length > 0) {
|
|
78
|
+
return __spreadArray([quality, readability], mismatchBullets, true).filter(Boolean);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
var document_1 = t("validation_points.".concat(code, ".document"), "");
|
|
49
82
|
// Filter out empty strings
|
|
50
83
|
return [quality, readability, document_1].filter(Boolean);
|
|
51
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validationUtils.js","sources":["../../../../src/utils/validationUtils.ts"],"sourcesContent":["import type { Prediction } from \"./apiAnalysis\";\n\n/**\n * Default validation points for success scenarios\n */\nconst DEFAULT_SUCCESS_VALIDATION_POINTS = {\n quality: \"success.quality_excellent\",\n readability: \"success.readability_confirmed\",\n authenticity: \"success.authenticity_verified\",\n} as const;\n\n/**\n * Default validation points for error scenarios\n */\nconst DEFAULT_ERROR_VALIDATION_POINTS = {\n quality: \"errors.image_quality_insufficient\",\n readability: \"errors.readability_problematic\",\n authenticity: \"errors.authenticity_not_verified\",\n} as const;\n\n/**\n * Safely extracts error code from predictions array\n */\nexport function getErrorCodeFromPredictions(predictions?: Prediction[] | null): string | null {\n if (!predictions || !Array.isArray(predictions) || predictions.length === 0) {\n return null;\n }\n return predictions[0].code || null;\n}\n\n/**\n * Gets validation points based on error code and scenario type\n
|
|
1
|
+
{"version":3,"file":"validationUtils.js","sources":["../../../../src/utils/validationUtils.ts"],"sourcesContent":["import type { Prediction, JdiMismatchDetail } from \"./apiAnalysis\";\n\n/**\n * Clé i18n (suffixe de `validation_points.7.0.*`) pour chaque champ d'identité\n * en échec. Voir docs backend NFC_JDI_ERROR_MAPPING.md pour le référentiel de\n * codes — 7.0 = \"owner\" (le détenteur du document ne correspond pas à la\n * saisie utilisateur).\n */\nconst MISMATCH_FIELD_KEY: Record<JdiMismatchDetail[\"field\"], string> = {\n firstName: \"mismatch_first_name\",\n lastName: \"mismatch_last_name\",\n birthDate: \"mismatch_birth_date\",\n};\n\n/**\n * Default validation points for success scenarios\n */\nconst DEFAULT_SUCCESS_VALIDATION_POINTS = {\n quality: \"success.quality_excellent\",\n readability: \"success.readability_confirmed\",\n authenticity: \"success.authenticity_verified\",\n} as const;\n\n/**\n * Default validation points for error scenarios\n */\nconst DEFAULT_ERROR_VALIDATION_POINTS = {\n quality: \"errors.image_quality_insufficient\",\n readability: \"errors.readability_problematic\",\n authenticity: \"errors.authenticity_not_verified\",\n} as const;\n\n/**\n * Safely extracts error code from predictions array\n */\nexport function getErrorCodeFromPredictions(predictions?: Prediction[] | null): string | null {\n if (!predictions || !Array.isArray(predictions) || predictions.length === 0) {\n return null;\n }\n return predictions[0].code || null;\n}\n\n/**\n * Gets validation points based on error code and scenario type\n *\n * @param errorCode - The error code from API response (e.g., \"1.0\", \"2.1\")\n * @param predictions - Optional predictions array as fallback for error code\n * @param t - Translation function from i18n\n * @param type - Type of scenario: 'success' or 'error'\n * @param mismatchDetails - Pour le code 7.0 uniquement : champs d'identité en\n * échec (saisi vs lu), calculés côté backend. S'ils sont fournis et non\n * vides, remplacent la bullet \"document\" générique par un message\n * personnalisé par champ. Sinon, comportement inchangé (message générique).\n * @returns Array of validation point strings\n */\nexport function getValidationPoints(\n errorCode: string | undefined | null,\n predictions: Prediction[] | undefined | null,\n t: any, // Using any to be compatible with i18n TFunction\n type: 'success' | 'error',\n mismatchDetails?: JdiMismatchDetail[] | null,\n): string[] {\n // Use errorCode from props, or try to get from predictions as fallback\n let code = errorCode;\n if (!code) {\n code = getErrorCodeFromPredictions(predictions);\n }\n\n if (code) {\n // Try to get code-specific validation points from i18n\n const quality = t(`validation_points.${code}.quality`, \"\");\n const readability = t(`validation_points.${code}.readability`, \"\");\n\n // If we have at least quality and readability, use code-specific points\n if (quality && readability) {\n if (code === '7.0' && mismatchDetails && mismatchDetails.length > 0) {\n const mismatchBullets = mismatchDetails\n .map((detail) => {\n const fieldKey = MISMATCH_FIELD_KEY[detail.field];\n if (!fieldKey) return \"\";\n return t(`validation_points.7.0.${fieldKey}`, {\n entered: detail.entered,\n read: detail.read,\n });\n })\n .filter(Boolean);\n\n if (mismatchBullets.length > 0) {\n return [quality, readability, ...mismatchBullets].filter(Boolean);\n }\n }\n\n const document = t(`validation_points.${code}.document`, \"\");\n // Filter out empty strings\n return [quality, readability, document].filter(Boolean);\n }\n }\n\n // Fallback to default validation points\n const defaults = type === 'success'\n ? DEFAULT_SUCCESS_VALIDATION_POINTS\n : DEFAULT_ERROR_VALIDATION_POINTS;\n\n return [\n t(defaults.quality, \"\"),\n t(defaults.readability, \"\"),\n t(defaults.authenticity, \"\"),\n ].filter(Boolean);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Détail d'un champ d'identité en échec pour le code 7.0 (owner mismatch) :
|
|
3
|
+
* valeur saisie par l'utilisateur vs valeur lue sur le document, telles que
|
|
4
|
+
* calculées côté backend (voir GET /session/sdk/:id/analysis-status).
|
|
5
|
+
*/
|
|
6
|
+
interface JdiMismatchDetail {
|
|
7
|
+
field: 'firstName' | 'lastName' | 'birthDate';
|
|
8
|
+
entered: string;
|
|
9
|
+
read: string;
|
|
10
|
+
}
|
|
1
11
|
interface Prediction {
|
|
2
12
|
code: string;
|
|
3
13
|
codeDescription: string;
|
|
@@ -8,6 +18,8 @@ interface Prediction {
|
|
|
8
18
|
firstName?: string;
|
|
9
19
|
lastName?: string;
|
|
10
20
|
};
|
|
21
|
+
/** Présent uniquement pour le code 7.0, quand un mismatch a été détecté. */
|
|
22
|
+
mismatchDetails?: JdiMismatchDetail[];
|
|
11
23
|
}
|
|
12
24
|
interface AnalysisResult {
|
|
13
25
|
predictions: Prediction[];
|
|
@@ -29,4 +41,4 @@ declare const hasAnalysisFailed: (predictions: Prediction[]) => boolean;
|
|
|
29
41
|
declare const getPrimaryRootCause: (predictions: Prediction[]) => string | null;
|
|
30
42
|
|
|
31
43
|
export { extractRootCauses, getPrimaryRootCause, hasAnalysisFailed };
|
|
32
|
-
export type { AnalysisResult, Prediction };
|
|
44
|
+
export type { AnalysisResult, JdiMismatchDetail, Prediction };
|