datakeen-session-react 1.1.140-dev.129 → 1.1.140-dev.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/components/document-video/DocumentVideoCapture.js +2 -2
  2. package/dist/cjs/components/document-video/DocumentVideoCapture.js.map +1 -1
  3. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js +10 -11
  4. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  5. package/dist/cjs/components/jdi/JDIProcessing.js +136 -147
  6. package/dist/cjs/components/jdi/JDIProcessing.js.map +1 -1
  7. package/dist/cjs/components/session/DocumentCheck.js +36 -11
  8. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  9. package/dist/cjs/components/session/EndFlow.js +10 -1
  10. package/dist/cjs/components/session/EndFlow.js.map +1 -1
  11. package/dist/cjs/components/session/controleJdiPolicy.js +47 -0
  12. package/dist/cjs/components/session/controleJdiPolicy.js.map +1 -0
  13. package/dist/cjs/index.css.js +1 -1
  14. package/dist/cjs/services/sessionService.js +15 -0
  15. package/dist/cjs/services/sessionService.js.map +1 -1
  16. package/dist/cjs/types/session.js.map +1 -1
  17. package/dist/cjs/utils/jdiCodes.js +57 -0
  18. package/dist/cjs/utils/jdiCodes.js.map +1 -0
  19. package/dist/esm/components/document-video/DocumentVideoCapture.js +2 -2
  20. package/dist/esm/components/document-video/DocumentVideoCapture.js.map +1 -1
  21. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js +10 -11
  22. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  23. package/dist/esm/components/jdi/JDIProcessing.js +136 -147
  24. package/dist/esm/components/jdi/JDIProcessing.js.map +1 -1
  25. package/dist/esm/components/session/DocumentCheck.js +37 -12
  26. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  27. package/dist/esm/components/session/EndFlow.js +10 -1
  28. package/dist/esm/components/session/EndFlow.js.map +1 -1
  29. package/dist/esm/components/session/controleJdiPolicy.js +42 -0
  30. package/dist/esm/components/session/controleJdiPolicy.js.map +1 -0
  31. package/dist/esm/index.css.js +1 -1
  32. package/dist/esm/services/sessionService.js +15 -1
  33. package/dist/esm/services/sessionService.js.map +1 -1
  34. package/dist/esm/types/session.js.map +1 -1
  35. package/dist/esm/utils/jdiCodes.js +53 -0
  36. package/dist/esm/utils/jdiCodes.js.map +1 -0
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo, useRef } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n} from \"../../types/session\";\nimport JDIPreIntroduction from \"../jdi/JDIPreIntroduction\";\nimport JDICountrySelection from \"../jdi/JDICountrySelection\";\nimport JDIDocumentSelection from \"../jdi/JDIDocumentSelection\";\nimport JDIDocumentUpload from \"../jdi/JDIDocumentUpload\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport DocumentVideoCapture from \"../document-video/DocumentVideoCapture\";\nimport { Camera, Upload } from \"lucide-react\";\nimport { useDocumentContext } from \"../../context/DocumentContext\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n logDocumentTypeSelected,\n logCaptureModeSelected,\n logPhotoCaptured,\n logPhotosValidated,\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { ISO_COUNTRY_CODES } from \"../../utils/isoCountryCodes\";\nimport {\n DocumentTemplate,\n FetchedDocumentTemplates,\n getAllDocumentTemplates,\n getDocTypeKey,\n getDocumentTemplateId,\n} from \"../../services/documentTemplate\";\nimport { UserInput } from \"../../types/userInput\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n updateSessionUserInput,\n skipNfcWithReason,\n} from \"../../services/sessionService\";\nimport NfcScanStep from \"../nfc-scan/NfcScanNode\";\nimport NfcChipGate from \"../nfc-scan/NfcChipGate\";\nimport NfcFallbackSurvey from \"../nfc-scan/NfcFallbackSurvey\";\n\nexport interface CountryDocuments {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n residencePermit: string[];\n driverLicense: string[];\n pinkDriverLicense: string[];\n };\n}\n\nexport interface NodeIdentityControl {\n id: string;\n acceptedCountries: CountryDocuments[];\n automaticPhotoCapture?: boolean;\n withVideo?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy), normalisé via normalizeNfcMode.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n allowedAddingMethods?: string[];\n introductionPage?: {\n title: string;\n description: string;\n };\n countrySelection?: {\n title: string;\n description: string;\n };\n documentSelection?: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n /** Paramétrable par nœud dans le journey builder. Absent/true = comportement\n * actuel inchangé (bouton \"Continuer quand même\" proposé) ; false = masqué. */\n allowContinueOnFailure?: boolean;\n}\n\ninterface DocumentCheckProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeIdentityControl;\n onContinueOnPC?: () => void;\n documentTypeId: string;\n acceptedCountries?: AcceptedCountry[];\n isMobileCapture?: boolean;\n allowedAddingMethods?: string[];\n template?: SessionTemplate;\n templateIndex?: number;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n}\n\nimport { EUROPEAN_COUNTRY_CODES } from \"../../utils/europeanCountries\";\n\nconst NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([\n \"passport\",\n \"idCard\",\n \"residencePermit\",\n]);\n\n/**\n * Normalise le mode NFC vers les valeurs courantes.\n * Rétrocompat : les parcours enregistrés avant le renommage portent encore\n * `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).\n */\nconst normalizeNfcMode = (mode?: string): \"nfcOnly\" | \"nfcOrPhoto\" =>\n mode === \"nfcAndApi\" || mode === \"nfcOrPhoto\" ? \"nfcOrPhoto\" : \"nfcOnly\";\n\n/**\n * DocumentCheck component manages the multi-step document verification flow for a session.\n * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.\n * The component adapts its flow for mobile capture and supports custom session templates.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC (used for mobile capture fallback).\n * @param {string} props.documentTypeId - The ID of the required document type for verification (e.g., \"jdi-2\" for ID card).\n * @param {AcceptedCountry[]} [props.acceptedCountries] - Optional list of countries accepted for the document type. If not provided, resolved from the session template.\n * @param {boolean} [props.isMobileCapture=false] - If true, enables mobile photo capture flow instead of file upload.\n * @param {SessionTemplate} [props.template] - Optional session template object, used to resolve accepted countries and flow configuration.\n * @param {number} [props.templateIndex] - Optional index of the current template node, used for navigation and retry logic.\n *\n * @returns {JSX.Element} Multi-step document verification UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Handles both desktop and mobile flows, including photo capture and file upload.\n * - Integrates with context for selected document type and manages internal state for step navigation, country selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for misconfiguration or invalid navigation.\n * - Uses hooks for translation, retry navigation, and context management.\n */\nconst DocumentCheck = ({\n stepObject,\n sessionId,\n node,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [documentTemplates, setDocumentTemplates] =\n useState<FetchedDocumentTemplates>();\n const [loadingTemplates, setLoadingTemplates] = useState(true);\n\n useEffect(() => {\n (async () => {\n setLoadingTemplates(true);\n const templates = await getAllDocumentTemplates();\n setDocumentTemplates(templates);\n setLoadingTemplates(false);\n })();\n }, []);\n\n const initialRetryCount = getNodeRetryCount(session, node.id);\n const [selectedMethod, setSelectedMethod] = useState<\n \"download\" | \"picture\" | null\n >(null);\n\n const isPictureAllowed = allowedAddingMethods?.includes(\"picture\") ?? true;\n const isDownloadAllowed = allowedAddingMethods?.includes(\"download\") ?? true;\n\n // Check if retry is allowed based on initial retry count\n const isInitialRetryAllowed = () => {\n // Special case: if allowResubmission is false and retryCount > 0, no retries allowed\n if (node.allowResubmission === false && initialRetryCount > 0) {\n return false;\n }\n\n if (node.allowResubmission === undefined) return true;\n if (!node.allowResubmission) return false;\n if (node.maxResubmissionAttempts !== undefined) {\n return initialRetryCount <= node.maxResubmissionAttempts;\n }\n return true;\n };\n\n // Initialize docStep - if retries exhausted, start at error page (step 6)\n const [docStep, setDocStep] = useState(() => {\n if (initialRetryCount > 0 && !isInitialRetryAllowed()) {\n return 6; // Error page\n }\n return 0; // Normal flow - start with introduction\n });\n const [selectedCountry, setSelectedCountry] = useState(\n acceptedCountries?.[0]?.code?.toUpperCase() || \"FR\",\n );\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [blockContinue, setBlockContinue] = useState(false);\n const [nfcPreparationError, setNfcPreparationError] = useState<string | null>(null);\n // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),\n // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).\n const [nfcSkipped, setNfcSkipped] = useState(false);\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Restauration après refresh / déchargement de l'onglet : `docStep` est en mémoire et serait perdu\n // au rechargement. On s'appuie sur `session.nfcStatus` (persisté et exposé par le backend) pour\n // remettre l'utilisateur au bon endroit du nœud NFC au lieu de repartir au début (gate -1).\n //\n // En parcours full mobile, l'ouverture de l'app de scan peut décharger l'onglet ; au retour, le\n // composant remonte. Sans cette restauration, l'utilisateur retombait sur le choix pays/document.\n const hasRestoredNfcStep = useRef(false);\n useEffect(() => {\n if (hasRestoredNfcStep.current) return;\n if (node.nfcEnabled !== true) return;\n const status = session?.nfcStatus;\n // 'pending' (ou absent) → rien à restaurer : le scan n'a pas démarré, l'effet de reset affiche\n // le gate -1 (écran d'entrée normal).\n if (status !== \"opened\" && status !== \"failed\" && status !== \"completed\" && status !== \"skipped\") {\n return;\n }\n // À partir d'ici on prend la décision une seule fois (idempotence, y compris si l'effet se\n // re-déclenche) : on pose le flag AVANT toute navigation.\n hasRestoredNfcStep.current = true;\n\n if (status === \"opened\" || status === \"failed\") {\n // Scan en cours, ou échoué (définitivement, ou en attente d'une nouvelle tentative) :\n // rester sur l'écran de scan / d'échec (docStep 7) avec ses actions.\n setDocStep(7);\n return;\n }\n\n if (status === \"completed\") {\n // Scan réussi avant le déchargement : le nœud NFC est terminé → passer à l'étape suivante\n // (y compris en mode nfcOrPhoto — le NFC réussi suffit à valider le document).\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n return;\n }\n\n // status === \"skipped\" : l'utilisateur a poursuivi sans puce avant le déchargement.\n // Reproduit le routage de handleNfcFallback selon le mode :\n // - nfcOrPhoto → reprendre le flux photo/API du même nœud (intro/pays)\n // - nfcOnly → sauter le nœud (étape suivante)\n if (normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n } else if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }, [session, node, template, stepObject]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page immediately\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (node.allowResubmission === false && retryCount > 0) {\n setDocStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n // Inline retry check to avoid dependency issues\n const checkRetryLimit = () => {\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n // Check immediately on mount if retries are exhausted\n // This redirects to error page before showing any JDI steps\n if (retryCount > 0 && !checkRetryLimit()) {\n // User has exhausted retries, redirect to error page immediately\n setDocStep(6);\n }\n }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);\n\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>(\n {},\n );\n const [currentPhotoStep, setCurrentPhotoStep] = useState(\n \"before-recto\" as\n | \"before-recto\"\n | \"recto\"\n | \"before-verso\"\n | \"verso\"\n | \"confirmation\",\n );\n const [videoFlowPhase, setVideoFlowPhase] = useState<\"photo\" | \"video\">(\n \"photo\",\n );\n\n const { selectedDocumentType, setSelectedDocumentType } =\n useDocumentContext();\n\n const finalAcceptedCountries = useMemo(() => {\n if (loadingTemplates) return acceptedCountries;\n const result: AcceptedCountry[] = [];\n const hasInternational = acceptedCountries?.some(c => c.code === \"INT\");\n const hasEurope = acceptedCountries?.some(c => c.code === \"EU\");\n\n if (!hasInternational && !hasEurope) return acceptedCountries;\n\n const internationalDoc = acceptedCountries?.find(c => c.code === \"INT\");\n const europeDoc = acceptedCountries?.find(c => c.code === \"EU\");\n\n for (const ISOCode of ISO_COUNTRY_CODES) {\n if (ISOCode === \"INT\" || ISOCode === \"EU\") continue;\n\n const countryDocInput = acceptedCountries?.find(c => c.code?.toUpperCase() === ISOCode);\n const isEuropean = EUROPEAN_COUNTRY_CODES.includes(ISOCode);\n\n // Determine which configuration to use for this country\n // 1. Specific country config\n // 2. EU group config (if European)\n // 3. INT group config\n let configToUse: AcceptedCountry | undefined = countryDocInput;\n\n if (!configToUse) {\n if (isEuropean && europeDoc) {\n configToUse = europeDoc;\n } else if (internationalDoc) {\n configToUse = internationalDoc;\n }\n }\n\n if (configToUse) {\n const documents: AcceptedCountry['documents'] = {\n passport: [],\n idCard: [],\n driverLicense: [],\n residencePermit: [],\n pinkDriverLicense: [],\n };\n for (const key of Object.keys(configToUse.documents)) {\n const docKey = key as keyof AcceptedCountry['documents'];\n if (!isDocumentTypeAvailable(ISOCode, docKey)) continue;\n documents[docKey] = configToUse.documents[docKey];\n }\n if (\n documents.passport.length ||\n documents.idCard.length ||\n documents.driverLicense.length ||\n documents.residencePermit.length ||\n documents.pinkDriverLicense.length\n ) {\n result.push({ code: ISOCode, documents: { ...documents } });\n }\n }\n }\n return result;\n }, [acceptedCountries, documentTemplates, loadingTemplates]);\n\n // Helper to check if a document type is available for a country\n function isDocumentTypeAvailable(\n countryCode: string,\n documentType: keyof AcceptedCountry[\"documents\"],\n ) {\n if (countryCode === 'INT' || countryCode === 'EU') return true;\n const docTypeKey = (getDocTypeKey(documentType) ?? \"\").toLowerCase();\n return documentTemplates?.data?.some(\n (tpl: DocumentTemplate) =>\n tpl.countryCode === countryCode &&\n (tpl.name?.toLowerCase() || \"\").includes(docTypeKey),\n );\n }\n\n useEffect(() => {\n if (!documentTypeId) console.error(\"DocumentCheck: Missing documentTypeId\");\n console.debug(\"[DocumentCheck] node content:\", node);\n\n // Don't reset docStep if we're already on error page (step 6) due to exhausted retries\n if (docStep === 6) {\n return;\n }\n\n // En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1).\n // MAIS si un scan est déjà engagé/terminé/sauté côté backend (reload / retour après\n // déchargement de l'onglet), on ne force PAS le gate : on laisse l'effet de restauration\n // ci-dessus décider (sinon il l'écraserait et l'utilisateur repartirait au début du nœud).\n if (node.nfcEnabled === true) {\n const nfcStatus = session?.nfcStatus;\n if (\n nfcStatus === \"opened\" ||\n nfcStatus === \"failed\" ||\n nfcStatus === \"completed\" ||\n nfcStatus === \"skipped\"\n ) {\n return;\n }\n setDocStep(-1);\n return;\n }\n\n if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\n // Deps volontairement limitées au changement de NŒUD (documentTypeId/sessionId/isMobileCapture).\n // On NE met PAS `session`/`nfcStatus` ici : ce reset ré-initialise docStep, et le déclencher sur\n // une évolution de session renverrait l'utilisateur au début du nœud (ex. boucle pays→document).\n // La lecture de session?.nfcStatus ci-dessus ne sert qu'à NE PAS écraser une restauration déjà\n // décidée par l'effet dédié (protégé par hasRestoredNfcStep) au (re)montage.\n }, [documentTypeId, sessionId, isMobileCapture]);\n\n const handleCountrySelect = (countryId: string) => {\n console.debug(\n \"[DocumentCheck] handleCountrySelect - countryId:\",\n countryId,\n );\n setUserInput((prev) => ({ ...prev, countryCode: countryId.toUpperCase() }));\n setSelectedCountry(countryId.toUpperCase());\n setSelectedDocumentType(null);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n // Reset retry count to 0 (will be synced to session)\n setRetryCount(0);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(2);\n };\n\n const handlePhotoCapture = async (\n imageData: string,\n side: \"recto\" | \"verso\",\n ) => {\n try {\n // Convert data URL to Blob for processing\n const imageBlob = dataUrlToBlob(imageData);\n\n // Resize and optimize the image (only on mobile)\n const processedBlob = await resizeAfterCapture(imageBlob);\n\n // Convert back to data URL for storage and display\n const processedDataUrl = await blobToDataUrl(processedBlob);\n\n console.debug(`[DocumentCheck] Photo processed for ${side}`, {\n originalSize: imageBlob.size,\n processedSize: processedBlob.size,\n originalType: imageBlob.type,\n processedType: processedBlob.type,\n });\n\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n } catch (error) {\n console.error(\n `[DocumentCheck] Failed to process photo for ${side}:`,\n error,\n );\n // Fallback: use original image if processing fails\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n }\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n logPhotosValidated(sessionId);\n setFileUploaded({\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n });\n setDocStep(4);\n }\n };\n\n const handlePhotoConfirmedForVideo = () => {\n setVideoFlowPhase(\"video\");\n };\n\n const handleDocumentVideoComplete = (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n const analysisData =\n predictions && predictions.length > 0 ? predictions : null;\n if (analysisData) {\n setAnalysisData(analysisData);\n }\n if (errorCode) {\n setErrorCode(errorCode);\n }\n handleProcessingComplete(success, undefined, analysisData);\n };\n\n const handleDocumentTypeSelect = async (documentId: string) => {\n const documentLabel = t(`documentTypes.${documentId}`, documentId);\n logDocumentTypeSelected(sessionId, documentId, documentLabel);\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n const selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n const selectedCountryCode = selectedCountry.toUpperCase();\n const selectedDocumentInput = {\n countryCode: selectedCountryCode,\n identityDocumentType: documentId,\n identityDocumentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setUserInput((prev) => ({ ...prev, ...selectedDocumentInput }));\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n\n if (\n node.nfcEnabled === true &&\n !nfcSkipped &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId)\n ) {\n const nfcMode = normalizeNfcMode(node.nfcMode);\n try {\n await updateSessionUserInput(sessionId, {\n ...((session?.userInput as Record<string, unknown> | undefined) ?? {}),\n ...selectedDocumentInput,\n });\n } catch (error) {\n console.error(\"Failed to persist NFC document selection:\", error);\n setNfcPreparationError(\n t(\n \"nfc_scan.preparation_failed\",\n \"Impossible de préparer le scan NFC. Veuillez réessayer.\",\n ),\n );\n }\n setDocStep(nfcMode === \"nfcOrPhoto\" ? 3 : 7);\n return;\n }\n\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n logDocumentLoaded(sessionId, \"recto\");\n if (files.back) {\n logDocumentLoaded(sessionId, \"verso\");\n }\n logDocumentsValidated(sessionId);\n\n setFileUploaded(files);\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setDocStep(6);\n } else {\n // Proceed to processing\n setDocStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n _retryCount?: number,\n apiAnalysisData?: Prediction[] | null,\n shouldBlockContinue?: boolean,\n ) => {\n setBlockContinue(shouldBlockContinue === true);\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n\n // Extract and store the error code\n if (apiAnalysisData.length > 0) {\n const code = apiAnalysisData[0].code;\n setErrorCode(code);\n }\n }\n\n if (success) {\n const shouldRunNfcAfterApi =\n node.nfcEnabled === true &&\n !nfcSkipped &&\n normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\" &&\n !!selectedDocumentType?.id &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);\n\n if (shouldRunNfcAfterApi) {\n setDocStep(7);\n return;\n }\n\n // Increment currentStep in database immediately after successful analysis\n // This prevents double analysis if the user refreshes the page\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(5);\n } else {\n // Increment retry count both in state and session\n setRetryCount((prev) => {\n const newCount = prev + 1;\n // Update session asynchronously\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setDocStep(6);\n }\n };\n\n const handleRetryFromError = () => {\n setBlockContinue(false);\n // Note: retry count is already incremented in handleProcessingComplete\n // This function just handles navigation\n // Pour l'erreur 2.5 (face manquante), on conserve fileUploaded pour pré-remplir\n // l'upload avec la face déjà déposée. Pour les autres erreurs, on repart de zéro.\n if (errorCode !== \"2.5\") {\n setFileUploaded(null);\n }\n // Always stay on the current node and go back to upload step.\n // Never navigate to a different global step: if this node was reached via a\n // condition branch (e.g. \"true\"), navigating away would land on the other\n // branch (\"false\"). The retry means \"re-submit on THIS node\", not \"go back\n // in the journey\".\n setDocStep(3);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n console.log(\"isRetryAllowed - Props:\", {\n allowResubmission: node.allowResubmission,\n maxResubmissionAttempts: node.maxResubmissionAttempts,\n retryCount,\n });\n // Specimen documents (code 8.x) block retry — user can only continue anyway\n if (errorCode?.startsWith(\"8\")) {\n return false;\n }\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n // Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.\n // On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :\n // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC\n // - nfcOnly → on saute le nœud (nœud suivant)\n const handleNfcFallback = async (\n reason: string,\n label: string,\n comment?: string,\n ) => {\n setNfcSkipped(true);\n try {\n await skipNfcWithReason(sessionId, { reason, label, comment });\n } catch (error) {\n console.error(\"Failed to persist NFC fallback reason:\", error);\n }\n\n const nfcMode = normalizeNfcMode(node.nfcMode);\n if (nfcMode === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n return;\n }\n\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n\n // Le questionnaire de fallback (-2) revient au gate (-1)\n if (docStep === -2) {\n setDocStep(-1);\n return;\n }\n\n // En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)\n if (\n node.nfcEnabled === true &&\n docStep === (hasIntroduction ? 0 : 1)\n ) {\n setDocStep(-1);\n return;\n }\n\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\n case -1: {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n return (\n <NfcChipGate\n onConfirm={() => setDocStep(hasIntroduction ? 0 : 1)}\n // Pas de puce → questionnaire de fallback pour recueillir la raison\n onNoChip={() => setDocStep(-2)}\n />\n );\n }\n case -2:\n return <NfcFallbackSurvey onSubmit={handleNfcFallback} />;\n case 0:\n if (!documentTypeId) {\n console.error(\"DocumentCheck: Missing documentTypeId in step 0\");\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\n \"document_check.config_error.title\",\n \"Erreur de configuration\",\n )}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.config_error.description\",\n \"Type de document non spécifié.\",\n )}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() =>\n stepObject.setStep(Math.max(0, stepObject.step - 1))\n }\n >\n {t(\"document_check.config_error.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n );\n }\n return (\n <JDIPreIntroduction\n documentTypeId={documentTypeId}\n onContinue={() => setDocStep(1)}\n onBack={stepObject.canGoBack ? handleBack : undefined}\n introTitleText={\n node.introductionPage?.title || t(\"jdi.pre_introduction.title\")\n }\n introDescText={\n node.introductionPage?.description ||\n t(\"jdi.pre_introduction.description\")\n }\n />\n );\n case 1:\n return (\n <JDICountrySelection\n onCountrySelect={handleCountrySelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n acceptedCountries={finalAcceptedCountries}\n countryIntroText={\n node.countrySelection?.title || t(\"jdi.country_selection.title\")\n }\n countryDescText={\n node.countrySelection?.description ||\n t(\"jdi.country_selection.description\")\n }\n />\n );\n case 2:\n return (\n <JDIDocumentSelection\n onDocumentSelect={handleDocumentTypeSelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n sessionId={sessionId}\n chosenCountry={\n finalAcceptedCountries?.find((c) => c.code === selectedCountry) ||\n undefined\n }\n documentSelectionTitle={\n node.documentSelection?.title || t(\"jdi.document_selection.title\")\n }\n documentSelectionDescription={\n // En NFC, on laisse JDIDocumentSelection choisir le wording adapté\n // (subtitle_identity_nfc) plutôt que l'override \"téléverser\" du nœud.\n node.nfcEnabled === true\n ? undefined\n : node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\n nfcEnabled={node.nfcEnabled === true}\n />\n );\n case 3: {\n if (!selectedDocumentType) {\n console.error(\n \"DocumentCheck: selectedDocumentType is null for step 3!\",\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.selection_error.title\", \"Erreur de sélection\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.selection_error.description\",\n \"Aucun type de document sélectionné. Veuillez revenir à l'étape précédente.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(2)}\n >\n {t(\n \"document_check.selection_error.back\",\n \"Retour à la sélection\",\n )}\n </ButtonDesktop>\n </div>\n );\n }\n\n if (isPictureAllowed && isDownloadAllowed && !selectedMethod) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={handleBack}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\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 <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\n \"document_check.method_selection.title\",\n \"Choisissez une méthode\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\n \"document_check.method_selection.subtitle\",\n \"Comment souhaitez-vous ajouter votre document ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"grid gap-4\">\n <button\n onClick={() => { setSelectedMethod(\"picture\"); logCaptureModeSelected(sessionId, \"picture\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Camera size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.picture_title\",\n \"Prendre une photo\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.picture_desc\",\n \"Utilisez l'appareil photo de votre appareil\",\n )}\n </p>\n </div>\n </button>\n\n <button\n onClick={() => { setSelectedMethod(\"download\"); logCaptureModeSelected(sessionId, \"upload\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Upload size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.download_title\",\n \"Téléverser un fichier\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.download_desc\",\n \"Sélectionnez un fichier sur votre appareil\",\n )}\n </p>\n </div>\n </button>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n }\n\n const activeMethod =\n selectedMethod ||\n (isPictureAllowed && isMobileCapture ? \"picture\" : \"download\");\n\n if (activeMethod === \"picture\" && isPictureAllowed) {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n const onConfirm = node.withVideo\n ? handlePhotoConfirmedForVideo\n : handlePhotoConfirmation;\n\n if (node.withVideo && videoFlowPhase === \"video\") {\n return (\n <DocumentVideoCapture\n selectedDocumentType={selectedDocumentType}\n onComplete={handleDocumentVideoComplete}\n onBack={() => {\n setVideoFlowPhase(\"photo\");\n setCurrentPhotoStep(\"confirmation\");\n }}\n nodeId={node.id}\n sessionId={sessionId}\n previewOverrides={{\n recto: capturedImages.recto,\n verso: capturedImages.verso,\n }}\n />\n );\n }\n\n if (currentPhotoStep === \"before-recto\") {\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n if (currentPhotoStep === \"recto\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"recto\")}\n />\n );\n }\n if (currentPhotoStep === \"before-verso\") {\n return (\n <BeforeVersoPhoto setStep={() => setCurrentPhotoStep(\"verso\")} />\n );\n }\n if (currentPhotoStep === \"verso\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"verso\")}\n />\n );\n }\n if (currentPhotoStep === \"confirmation\") {\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto || \"\"}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={!!capturedImages.verso}\n onConfirm={onConfirm}\n onRetry={() => setCurrentPhotoStep(\"before-recto\")}\n onRetryAfterProcessing={() => setCurrentPhotoStep(\"before-recto\")}\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n }\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n } else {\n return (\n <JDIDocumentUpload\n documentType={selectedDocumentType?.id || documentTypeId}\n documentTypeId={documentTypeId}\n documentLabel={selectedDocumentType?.label}\n onUpload={handleDocumentUpload}\n onBack={() => {\n if (isPictureAllowed && isDownloadAllowed) {\n setSelectedMethod(null);\n } else {\n setDocStep(2);\n }\n }}\n initialFront={errorCode === \"2.5\" ? fileUploaded?.front : null}\n initialBack={errorCode === \"2.5\" ? fileUploaded?.back : null}\n sessionId={sessionId}\n />\n );\n }\n }\n // fall-through volontaire vers case 4 (comportement existant conservé)\n case 4:\n return (\n <JDIProcessing\n documentType={selectedDocumentType?.id || documentTypeId}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={documentTypeId}\n retryCount={retryCount}\n documentTemplateId={selectedDocumentType?.documentTemplateId}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <JDISuccess\n documentType={selectedDocumentType?.id || documentTypeId}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n />\n );\n case 6:\n return (\n <JDIError\n documentType={selectedDocumentType?.id || documentTypeId}\n onRetry={handleRetryFromError}\n onContinueAnyway={\n node.allowContinueOnFailure === false\n ? undefined\n : handleContinueAnyway\n }\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n blockContinue={blockContinue}\n />\n );\n case 7:\n if (nfcPreparationError) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={() => setDocStep(2)}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"nfc_scan.preparation_error_title\", \"Erreur de préparation NFC\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{nfcPreparationError}</p>\n </div>\n </MobilePageLayout>\n );\n }\n return (\n <NfcScanStep\n sessionId={sessionId}\n nodeId={node.id}\n stepObject={stepObject}\n template={template}\n onBack={() => {\n // Retour vers la sélection du document (corriger un mauvais choix, ou après échec NFC).\n // Le démontage de NfcScanStep ferme le SSE via le cleanup du hook (pas d'appel backend).\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n hasRestoredNfcStep.current = true; // ne pas re-restaurer l'étape QR après ce retour\n setDocStep(hasIntroduction ? 0 : 1);\n }}\n onContinueWithoutChip={() => {\n // \"Poursuivre sans puce\" après échec définitif : ouvre le questionnaire de raison\n // (docStep -2 → NfcFallbackSurvey → handleNfcFallback). handleNfcFallback applique\n // ensuite la reprise selon nfcMode (nfcOrPhoto → photo/API ; nfcOnly → nœud suivant).\n hasRestoredNfcStep.current = true;\n setDocStep(-2);\n }}\n />\n );\n default:\n console.error(`Invalid docStep: ${docStep}`);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.navigation_error.description\",\n \"Étape non valide. Veuillez recommencer.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(0)}\n >\n {t(\"document_check.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCheck;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo, useRef } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n} from \"../../types/session\";\nimport JDIPreIntroduction from \"../jdi/JDIPreIntroduction\";\nimport JDICountrySelection from \"../jdi/JDICountrySelection\";\nimport JDIDocumentSelection from \"../jdi/JDIDocumentSelection\";\nimport JDIDocumentUpload from \"../jdi/JDIDocumentUpload\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport DocumentVideoCapture from \"../document-video/DocumentVideoCapture\";\nimport { Camera, Upload } from \"lucide-react\";\nimport { useDocumentContext } from \"../../context/DocumentContext\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n logDocumentTypeSelected,\n logCaptureModeSelected,\n logPhotoCaptured,\n logPhotosValidated,\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { ISO_COUNTRY_CODES } from \"../../utils/isoCountryCodes\";\nimport {\n DocumentTemplate,\n FetchedDocumentTemplates,\n getAllDocumentTemplates,\n getDocTypeKey,\n getDocumentTemplateId,\n} from \"../../services/documentTemplate\";\nimport { UserInput } from \"../../types/userInput\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n updateSessionUserInput,\n skipNfcWithReason,\n hasOutgoingEdgeForHandle,\n} from \"../../services/sessionService\";\nimport NfcScanStep from \"../nfc-scan/NfcScanNode\";\nimport NfcChipGate from \"../nfc-scan/NfcChipGate\";\nimport NfcFallbackSurvey from \"../nfc-scan/NfcFallbackSurvey\";\nimport {\n normalizeMaxResubmissionAction,\n hasExceededResubmissionAttempts,\n resolveControleJdiOutcomeRoute,\n} from \"./controleJdiPolicy\";\n\nexport interface CountryDocuments {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n residencePermit: string[];\n driverLicense: string[];\n pinkDriverLicense: string[];\n };\n}\n\nexport interface NodeIdentityControl {\n id: string;\n acceptedCountries: CountryDocuments[];\n automaticPhotoCapture?: boolean;\n withVideo?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy), normalisé via normalizeNfcMode.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n allowedAddingMethods?: string[];\n introductionPage?: {\n title: string;\n description: string;\n };\n countrySelection?: {\n title: string;\n description: string;\n };\n documentSelection?: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n /** Paramétrable par nœud dans le journey builder. Absent/true = comportement\n * actuel inchangé (bouton \"Continuer quand même\" proposé) ; false = masqué.\n * Déprécié quand une sortie \"false\" est câblée sur ce nœud : le routage\n * automatique prend le relais et ce bouton n'est alors jamais affiché. */\n allowContinueOnFailure?: boolean;\n /** Codes JDI exacts bloquants pour ce nœud. Absent = DEFAULT_BLOCKING_CODES. */\n blockingCodes?: string[];\n /** Sortie suivie quand les resoumissions sont épuisées sur un code bloquant\n * ET qu'une sortie \"false\" est câblée. Défaut \"end-journey\". */\n maxResubmissionAction?: \"end-journey\" | \"force-true\";\n}\n\ninterface DocumentCheckProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeIdentityControl;\n onContinueOnPC?: () => void;\n documentTypeId: string;\n acceptedCountries?: AcceptedCountry[];\n isMobileCapture?: boolean;\n allowedAddingMethods?: string[];\n template?: SessionTemplate;\n templateIndex?: number;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n}\n\nimport { EUROPEAN_COUNTRY_CODES } from \"../../utils/europeanCountries\";\n\nconst NFC_ELIGIBLE_DOCUMENT_TYPES = new Set([\n \"passport\",\n \"idCard\",\n \"residencePermit\",\n]);\n\n/**\n * Normalise le mode NFC vers les valeurs courantes.\n * Rétrocompat : les parcours enregistrés avant le renommage portent encore\n * `nfcAndApi`, qui doit être traité comme `nfcOrPhoto` (scan NFC avec alternative photo).\n */\nconst normalizeNfcMode = (mode?: string): \"nfcOnly\" | \"nfcOrPhoto\" =>\n mode === \"nfcAndApi\" || mode === \"nfcOrPhoto\" ? \"nfcOrPhoto\" : \"nfcOnly\";\n\n/**\n * DocumentCheck component manages the multi-step document verification flow for a session.\n * It handles country and document type selection, document upload or photo capture, processing, and error/success handling.\n * The component adapts its flow for mobile capture and supports custom session templates.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC (used for mobile capture fallback).\n * @param {string} props.documentTypeId - The ID of the required document type for verification (e.g., \"jdi-2\" for ID card).\n * @param {AcceptedCountry[]} [props.acceptedCountries] - Optional list of countries accepted for the document type. If not provided, resolved from the session template.\n * @param {boolean} [props.isMobileCapture=false] - If true, enables mobile photo capture flow instead of file upload.\n * @param {SessionTemplate} [props.template] - Optional session template object, used to resolve accepted countries and flow configuration.\n * @param {number} [props.templateIndex] - Optional index of the current template node, used for navigation and retry logic.\n *\n * @returns {JSX.Element} Multi-step document verification UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Handles both desktop and mobile flows, including photo capture and file upload.\n * - Integrates with context for selected document type and manages internal state for step navigation, country selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for misconfiguration or invalid navigation.\n * - Uses hooks for translation, retry navigation, and context management.\n */\nconst DocumentCheck = ({\n stepObject,\n sessionId,\n node,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [documentTemplates, setDocumentTemplates] =\n useState<FetchedDocumentTemplates>();\n const [loadingTemplates, setLoadingTemplates] = useState(true);\n\n useEffect(() => {\n (async () => {\n setLoadingTemplates(true);\n const templates = await getAllDocumentTemplates();\n setDocumentTemplates(templates);\n setLoadingTemplates(false);\n })();\n }, []);\n\n const initialRetryCount = getNodeRetryCount(session, node.id);\n const [selectedMethod, setSelectedMethod] = useState<\n \"download\" | \"picture\" | null\n >(null);\n\n const isPictureAllowed = allowedAddingMethods?.includes(\"picture\") ?? true;\n const isDownloadAllowed = allowedAddingMethods?.includes(\"download\") ?? true;\n\n // Check if retry is allowed based on initial retry count\n const isInitialRetryAllowed = () => {\n // Special case: if allowResubmission is false and retryCount > 0, no retries allowed\n if (node.allowResubmission === false && initialRetryCount > 0) {\n return false;\n }\n\n if (node.allowResubmission === undefined) return true;\n if (!node.allowResubmission) return false;\n if (node.maxResubmissionAttempts !== undefined) {\n return initialRetryCount <= node.maxResubmissionAttempts;\n }\n return true;\n };\n\n // Initialize docStep - if retries exhausted, start at error page (step 6)\n const [docStep, setDocStep] = useState(() => {\n if (initialRetryCount > 0 && !isInitialRetryAllowed()) {\n return 6; // Error page\n }\n return 0; // Normal flow - start with introduction\n });\n const [selectedCountry, setSelectedCountry] = useState(\n acceptedCountries?.[0]?.code?.toUpperCase() || \"FR\",\n );\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [blockContinue, setBlockContinue] = useState(false);\n const [nfcPreparationError, setNfcPreparationError] = useState<string | null>(null);\n // Quand l'utilisateur déclare ne pas avoir de puce (questionnaire de fallback),\n // on ne doit plus le réorienter vers le scan NFC (ni avant, ni après l'analyse API).\n const [nfcSkipped, setNfcSkipped] = useState(false);\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Restauration après refresh / déchargement de l'onglet : `docStep` est en mémoire et serait perdu\n // au rechargement. On s'appuie sur `session.nfcStatus` (persisté et exposé par le backend) pour\n // remettre l'utilisateur au bon endroit du nœud NFC au lieu de repartir au début (gate -1).\n //\n // En parcours full mobile, l'ouverture de l'app de scan peut décharger l'onglet ; au retour, le\n // composant remonte. Sans cette restauration, l'utilisateur retombait sur le choix pays/document.\n const hasRestoredNfcStep = useRef(false);\n useEffect(() => {\n if (hasRestoredNfcStep.current) return;\n if (node.nfcEnabled !== true) return;\n const status = session?.nfcStatus;\n // 'pending' (ou absent) → rien à restaurer : le scan n'a pas démarré, l'effet de reset affiche\n // le gate -1 (écran d'entrée normal).\n if (status !== \"opened\" && status !== \"failed\" && status !== \"completed\" && status !== \"skipped\") {\n return;\n }\n // À partir d'ici on prend la décision une seule fois (idempotence, y compris si l'effet se\n // re-déclenche) : on pose le flag AVANT toute navigation.\n hasRestoredNfcStep.current = true;\n\n if (status === \"opened\" || status === \"failed\") {\n // Scan en cours, ou échoué (définitivement, ou en attente d'une nouvelle tentative) :\n // rester sur l'écran de scan / d'échec (docStep 7) avec ses actions.\n setDocStep(7);\n return;\n }\n\n if (status === \"completed\") {\n // Scan réussi avant le déchargement : le nœud NFC est terminé → passer à l'étape suivante\n // (y compris en mode nfcOrPhoto — le NFC réussi suffit à valider le document).\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n return;\n }\n\n // status === \"skipped\" : l'utilisateur a poursuivi sans puce avant le déchargement.\n // Reproduit le routage de handleNfcFallback selon le mode :\n // - nfcOrPhoto → reprendre le flux photo/API du même nœud (intro/pays)\n // - nfcOnly → sauter le nœud (étape suivante)\n if (normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n } else if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }, [session, node, template, stepObject]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page immediately\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (node.allowResubmission === false && retryCount > 0) {\n setDocStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n // Inline retry check to avoid dependency issues\n const checkRetryLimit = () => {\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n // Check immediately on mount if retries are exhausted\n // This redirects to error page before showing any JDI steps\n if (retryCount > 0 && !checkRetryLimit()) {\n // User has exhausted retries, redirect to error page immediately\n setDocStep(6);\n }\n }, [retryCount, node.allowResubmission, node.maxResubmissionAttempts]);\n\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>(\n {},\n );\n const [currentPhotoStep, setCurrentPhotoStep] = useState(\n \"before-recto\" as\n | \"before-recto\"\n | \"recto\"\n | \"before-verso\"\n | \"verso\"\n | \"confirmation\",\n );\n const [videoFlowPhase, setVideoFlowPhase] = useState<\"photo\" | \"video\">(\n \"photo\",\n );\n\n const { selectedDocumentType, setSelectedDocumentType } =\n useDocumentContext();\n\n const finalAcceptedCountries = useMemo(() => {\n if (loadingTemplates) return acceptedCountries;\n const result: AcceptedCountry[] = [];\n const hasInternational = acceptedCountries?.some(c => c.code === \"INT\");\n const hasEurope = acceptedCountries?.some(c => c.code === \"EU\");\n\n if (!hasInternational && !hasEurope) return acceptedCountries;\n\n const internationalDoc = acceptedCountries?.find(c => c.code === \"INT\");\n const europeDoc = acceptedCountries?.find(c => c.code === \"EU\");\n\n for (const ISOCode of ISO_COUNTRY_CODES) {\n if (ISOCode === \"INT\" || ISOCode === \"EU\") continue;\n\n const countryDocInput = acceptedCountries?.find(c => c.code?.toUpperCase() === ISOCode);\n const isEuropean = EUROPEAN_COUNTRY_CODES.includes(ISOCode);\n\n // Determine which configuration to use for this country\n // 1. Specific country config\n // 2. EU group config (if European)\n // 3. INT group config\n let configToUse: AcceptedCountry | undefined = countryDocInput;\n\n if (!configToUse) {\n if (isEuropean && europeDoc) {\n configToUse = europeDoc;\n } else if (internationalDoc) {\n configToUse = internationalDoc;\n }\n }\n\n if (configToUse) {\n const documents: AcceptedCountry['documents'] = {\n passport: [],\n idCard: [],\n driverLicense: [],\n residencePermit: [],\n pinkDriverLicense: [],\n };\n for (const key of Object.keys(configToUse.documents)) {\n const docKey = key as keyof AcceptedCountry['documents'];\n if (!isDocumentTypeAvailable(ISOCode, docKey)) continue;\n documents[docKey] = configToUse.documents[docKey];\n }\n if (\n documents.passport.length ||\n documents.idCard.length ||\n documents.driverLicense.length ||\n documents.residencePermit.length ||\n documents.pinkDriverLicense.length\n ) {\n result.push({ code: ISOCode, documents: { ...documents } });\n }\n }\n }\n return result;\n }, [acceptedCountries, documentTemplates, loadingTemplates]);\n\n // Helper to check if a document type is available for a country\n function isDocumentTypeAvailable(\n countryCode: string,\n documentType: keyof AcceptedCountry[\"documents\"],\n ) {\n if (countryCode === 'INT' || countryCode === 'EU') return true;\n const docTypeKey = (getDocTypeKey(documentType) ?? \"\").toLowerCase();\n return documentTemplates?.data?.some(\n (tpl: DocumentTemplate) =>\n tpl.countryCode === countryCode &&\n (tpl.name?.toLowerCase() || \"\").includes(docTypeKey),\n );\n }\n\n useEffect(() => {\n if (!documentTypeId) console.error(\"DocumentCheck: Missing documentTypeId\");\n console.debug(\"[DocumentCheck] node content:\", node);\n\n // Don't reset docStep if we're already on error page (step 6) due to exhausted retries\n if (docStep === 6) {\n return;\n }\n\n // En NFC, on affiche d'abord l'écran de confirmation de la puce (gate -1).\n // MAIS si un scan est déjà engagé/terminé/sauté côté backend (reload / retour après\n // déchargement de l'onglet), on ne force PAS le gate : on laisse l'effet de restauration\n // ci-dessus décider (sinon il l'écraserait et l'utilisateur repartirait au début du nœud).\n if (node.nfcEnabled === true) {\n const nfcStatus = session?.nfcStatus;\n if (\n nfcStatus === \"opened\" ||\n nfcStatus === \"failed\" ||\n nfcStatus === \"completed\" ||\n nfcStatus === \"skipped\"\n ) {\n return;\n }\n setDocStep(-1);\n return;\n }\n\n if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\n // Deps volontairement limitées au changement de NŒUD (documentTypeId/sessionId/isMobileCapture).\n // On NE met PAS `session`/`nfcStatus` ici : ce reset ré-initialise docStep, et le déclencher sur\n // une évolution de session renverrait l'utilisateur au début du nœud (ex. boucle pays→document).\n // La lecture de session?.nfcStatus ci-dessus ne sert qu'à NE PAS écraser une restauration déjà\n // décidée par l'effet dédié (protégé par hasRestoredNfcStep) au (re)montage.\n }, [documentTypeId, sessionId, isMobileCapture]);\n\n const handleCountrySelect = (countryId: string) => {\n console.debug(\n \"[DocumentCheck] handleCountrySelect - countryId:\",\n countryId,\n );\n setUserInput((prev) => ({ ...prev, countryCode: countryId.toUpperCase() }));\n setSelectedCountry(countryId.toUpperCase());\n setSelectedDocumentType(null);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n // Reset retry count to 0 (will be synced to session)\n setRetryCount(0);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(2);\n };\n\n const handlePhotoCapture = async (\n imageData: string,\n side: \"recto\" | \"verso\",\n ) => {\n try {\n // Convert data URL to Blob for processing\n const imageBlob = dataUrlToBlob(imageData);\n\n // Resize and optimize the image (only on mobile)\n const processedBlob = await resizeAfterCapture(imageBlob);\n\n // Convert back to data URL for storage and display\n const processedDataUrl = await blobToDataUrl(processedBlob);\n\n console.debug(`[DocumentCheck] Photo processed for ${side}`, {\n originalSize: imageBlob.size,\n processedSize: processedBlob.size,\n originalType: imageBlob.type,\n processedType: processedBlob.type,\n });\n\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n } catch (error) {\n console.error(\n `[DocumentCheck] Failed to process photo for ${side}:`,\n error,\n );\n // Fallback: use original image if processing fails\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n logPhotoCaptured(sessionId, side);\n\n if (side === \"recto\") {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n setCurrentPhotoStep(isSingleSided ? \"confirmation\" : \"before-verso\");\n } else {\n setCurrentPhotoStep(\"confirmation\");\n }\n }\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n logPhotosValidated(sessionId);\n setFileUploaded({\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n });\n setDocStep(4);\n }\n };\n\n const handlePhotoConfirmedForVideo = () => {\n setVideoFlowPhase(\"video\");\n };\n\n const handleDocumentVideoComplete = (\n success: boolean,\n predictions?: Prediction[],\n errorCode?: string,\n ) => {\n const analysisData =\n predictions && predictions.length > 0 ? predictions : null;\n if (analysisData) {\n setAnalysisData(analysisData);\n }\n if (errorCode) {\n setErrorCode(errorCode);\n }\n handleProcessingComplete(success, undefined, analysisData);\n };\n\n const handleDocumentTypeSelect = async (documentId: string) => {\n const documentLabel = t(`documentTypes.${documentId}`, documentId);\n logDocumentTypeSelected(sessionId, documentId, documentLabel);\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n const selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n const selectedCountryCode = selectedCountry.toUpperCase();\n const selectedDocumentInput = {\n countryCode: selectedCountryCode,\n identityDocumentType: documentId,\n identityDocumentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setUserInput((prev) => ({ ...prev, ...selectedDocumentInput }));\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n setNfcPreparationError(null);\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n\n if (\n node.nfcEnabled === true &&\n !nfcSkipped &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(documentId)\n ) {\n const nfcMode = normalizeNfcMode(node.nfcMode);\n try {\n await updateSessionUserInput(sessionId, {\n ...((session?.userInput as Record<string, unknown> | undefined) ?? {}),\n ...selectedDocumentInput,\n });\n } catch (error) {\n console.error(\"Failed to persist NFC document selection:\", error);\n setNfcPreparationError(\n t(\n \"nfc_scan.preparation_failed\",\n \"Impossible de préparer le scan NFC. Veuillez réessayer.\",\n ),\n );\n }\n setDocStep(nfcMode === \"nfcOrPhoto\" ? 3 : 7);\n return;\n }\n\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n logDocumentLoaded(sessionId, \"recto\");\n if (files.back) {\n logDocumentLoaded(sessionId, \"verso\");\n }\n logDocumentsValidated(sessionId);\n\n setFileUploaded(files);\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setDocStep(6);\n } else {\n // Proceed to processing\n setDocStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n _retryCount?: number,\n apiAnalysisData?: Prediction[] | null,\n shouldBlockContinue?: boolean,\n ) => {\n setBlockContinue(shouldBlockContinue === true);\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n\n // Extract and store the error code\n if (apiAnalysisData.length > 0) {\n const code = apiAnalysisData[0].code;\n setErrorCode(code);\n }\n }\n\n if (success) {\n const shouldRunNfcAfterApi =\n node.nfcEnabled === true &&\n !nfcSkipped &&\n normalizeNfcMode(node.nfcMode) === \"nfcOrPhoto\" &&\n !!selectedDocumentType?.id &&\n NFC_ELIGIBLE_DOCUMENT_TYPES.has(selectedDocumentType.id);\n\n if (shouldRunNfcAfterApi) {\n setDocStep(7);\n return;\n }\n\n // Increment currentStep in database immediately after successful analysis\n // This prevents double analysis if the user refreshes the page\n // Handle \"true\" explicite : sûr même sur un nœud legacy à une seule\n // arête (findOutgoingEdge retombe sur la première arête existante).\n if (template) {\n stepObject.goToNextStep(node.id, template, \"true\");\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(5);\n } else {\n const newRetryCount = retryCount + 1;\n // Increment retry count both in state and session\n setRetryCount(newRetryCount);\n incrementNodeRetryCount(sessionId, node.id, retryCount).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n\n // Routage automatique vers la sortie \"false\" (nouveau) : uniquement\n // pour un véritable échec de code JDI bloquant (pas un souci d'upload\n // S3 non confirmé — cf. shouldBlockContinue), une fois les\n // resoumissions épuisées ET si l'auteur a câblé une sortie \"false\".\n // Sinon, comportement legacy inchangé : écran d'erreur (retry et/ou\n // \"continuer quand même\" selon isRetryAllowed/allowContinueOnFailure).\n if (shouldBlockContinue !== true && template) {\n const currentCode =\n apiAnalysisData && apiAnalysisData.length > 0\n ? apiAnalysisData[0].code\n : (errorCode ?? undefined);\n const effectiveMaxAttempts =\n currentCode?.startsWith(\"8\") || node.allowResubmission === false\n ? 0\n : (node.maxResubmissionAttempts ?? Infinity);\n const route = resolveControleJdiOutcomeRoute({\n isBlockingCode: true, // success === false ⇒ le code était bloquant\n hasExceededAttempts: hasExceededResubmissionAttempts(\n newRetryCount,\n effectiveMaxAttempts,\n ),\n hasFalseEdge: hasOutgoingEdgeForHandle(node.id, template, \"false\"),\n action: normalizeMaxResubmissionAction(node.maxResubmissionAction),\n });\n\n if (!route.showErrorScreen && route.handle) {\n stepObject.goToNextStep(node.id, template, route.handle);\n setDocStep(0);\n return;\n }\n }\n\n setDocStep(6);\n }\n };\n\n const handleRetryFromError = () => {\n setBlockContinue(false);\n // Note: retry count is already incremented in handleProcessingComplete\n // This function just handles navigation\n // Pour l'erreur 2.5 (face manquante), on conserve fileUploaded pour pré-remplir\n // l'upload avec la face déjà déposée. Pour les autres erreurs, on repart de zéro.\n if (errorCode !== \"2.5\") {\n setFileUploaded(null);\n }\n // Always stay on the current node and go back to upload step.\n // Never navigate to a different global step: if this node was reached via a\n // condition branch (e.g. \"true\"), navigating away would land on the other\n // branch (\"false\"). The retry means \"re-submit on THIS node\", not \"go back\n // in the journey\".\n setDocStep(3);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n console.log(\"isRetryAllowed - Props:\", {\n allowResubmission: node.allowResubmission,\n maxResubmissionAttempts: node.maxResubmissionAttempts,\n retryCount,\n });\n // Specimen documents (code 8.x) block retry — user can only continue anyway\n if (errorCode?.startsWith(\"8\")) {\n return false;\n }\n // If allowResubmission is undefined (old journeys), allow unlimited retries\n if (node.allowResubmission === undefined) {\n return true;\n }\n // If allowResubmission is false, no retries allowed\n if (!node.allowResubmission) {\n return false;\n }\n // If allowResubmission is true, check against maxResubmissionAttempts\n if (node.maxResubmissionAttempts !== undefined) {\n return retryCount <= node.maxResubmissionAttempts;\n }\n // If maxResubmissionAttempts is not set, allow unlimited retries\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n const handleSuccessContinue = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template, \"true\");\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n };\n\n // Questionnaire de fallback NFC : l'utilisateur a déclaré ne pas avoir de puce.\n // On enregistre la raison (non bloquant) puis on poursuit selon le mode du nœud :\n // - nfcOrPhoto → flux photo/API du même nœud (intro/pays → upload → analyse), sans scan NFC\n // - nfcOnly → on saute le nœud (nœud suivant)\n const handleNfcFallback = async (\n reason: string,\n label: string,\n comment?: string,\n ) => {\n setNfcSkipped(true);\n try {\n await skipNfcWithReason(sessionId, { reason, label, comment });\n } catch (error) {\n console.error(\"Failed to persist NFC fallback reason:\", error);\n }\n\n const nfcMode = normalizeNfcMode(node.nfcMode);\n if (nfcMode === \"nfcOrPhoto\") {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n setDocStep(hasIntroduction ? 0 : 1);\n return;\n }\n\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n const handleBack = () => {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n\n // Le questionnaire de fallback (-2) revient au gate (-1)\n if (docStep === -2) {\n setDocStep(-1);\n return;\n }\n\n // En NFC, le premier écran réel (intro=0 sinon pays=1) revient au gate (-1)\n if (\n node.nfcEnabled === true &&\n docStep === (hasIntroduction ? 0 : 1)\n ) {\n setDocStep(-1);\n return;\n }\n\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\n case -1: {\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n return (\n <NfcChipGate\n onConfirm={() => setDocStep(hasIntroduction ? 0 : 1)}\n // Pas de puce → questionnaire de fallback pour recueillir la raison\n onNoChip={() => setDocStep(-2)}\n />\n );\n }\n case -2:\n return <NfcFallbackSurvey onSubmit={handleNfcFallback} />;\n case 0:\n if (!documentTypeId) {\n console.error(\"DocumentCheck: Missing documentTypeId in step 0\");\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\n \"document_check.config_error.title\",\n \"Erreur de configuration\",\n )}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.config_error.description\",\n \"Type de document non spécifié.\",\n )}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() =>\n stepObject.setStep(Math.max(0, stepObject.step - 1))\n }\n >\n {t(\"document_check.config_error.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n );\n }\n return (\n <JDIPreIntroduction\n documentTypeId={documentTypeId}\n onContinue={() => setDocStep(1)}\n onBack={stepObject.canGoBack ? handleBack : undefined}\n introTitleText={\n node.introductionPage?.title || t(\"jdi.pre_introduction.title\")\n }\n introDescText={\n node.introductionPage?.description ||\n t(\"jdi.pre_introduction.description\")\n }\n />\n );\n case 1:\n return (\n <JDICountrySelection\n onCountrySelect={handleCountrySelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n acceptedCountries={finalAcceptedCountries}\n countryIntroText={\n node.countrySelection?.title || t(\"jdi.country_selection.title\")\n }\n countryDescText={\n node.countrySelection?.description ||\n t(\"jdi.country_selection.description\")\n }\n />\n );\n case 2:\n return (\n <JDIDocumentSelection\n onDocumentSelect={handleDocumentTypeSelect}\n onBack={handleBack}\n documentTypeId={documentTypeId}\n sessionId={sessionId}\n chosenCountry={\n finalAcceptedCountries?.find((c) => c.code === selectedCountry) ||\n undefined\n }\n documentSelectionTitle={\n node.documentSelection?.title || t(\"jdi.document_selection.title\")\n }\n documentSelectionDescription={\n // En NFC, on laisse JDIDocumentSelection choisir le wording adapté\n // (subtitle_identity_nfc) plutôt que l'override \"téléverser\" du nœud.\n node.nfcEnabled === true\n ? undefined\n : node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\n nfcEnabled={node.nfcEnabled === true}\n />\n );\n case 3: {\n if (!selectedDocumentType) {\n console.error(\n \"DocumentCheck: selectedDocumentType is null for step 3!\",\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.selection_error.title\", \"Erreur de sélection\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.selection_error.description\",\n \"Aucun type de document sélectionné. Veuillez revenir à l'étape précédente.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(2)}\n >\n {t(\n \"document_check.selection_error.back\",\n \"Retour à la sélection\",\n )}\n </ButtonDesktop>\n </div>\n );\n }\n\n if (isPictureAllowed && isDownloadAllowed && !selectedMethod) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={handleBack}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\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 <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\n \"document_check.method_selection.title\",\n \"Choisissez une méthode\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\n \"document_check.method_selection.subtitle\",\n \"Comment souhaitez-vous ajouter votre document ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"grid gap-4\">\n <button\n onClick={() => { setSelectedMethod(\"picture\"); logCaptureModeSelected(sessionId, \"picture\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Camera size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.picture_title\",\n \"Prendre une photo\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.picture_desc\",\n \"Utilisez l'appareil photo de votre appareil\",\n )}\n </p>\n </div>\n </button>\n\n <button\n onClick={() => { setSelectedMethod(\"download\"); logCaptureModeSelected(sessionId, \"upload\"); }}\n className=\"flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group\"\n >\n <div className=\"w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4\">\n <Upload size={24} />\n </div>\n <div>\n <p className=\"font-semibold text-gray-900\">\n {t(\n \"document_check.method_selection.download_title\",\n \"Téléverser un fichier\",\n )}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\n \"document_check.method_selection.download_desc\",\n \"Sélectionnez un fichier sur votre appareil\",\n )}\n </p>\n </div>\n </button>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n }\n\n const activeMethod =\n selectedMethod ||\n (isPictureAllowed && isMobileCapture ? \"picture\" : \"download\");\n\n if (activeMethod === \"picture\" && isPictureAllowed) {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n const onConfirm = node.withVideo\n ? handlePhotoConfirmedForVideo\n : handlePhotoConfirmation;\n\n if (node.withVideo && videoFlowPhase === \"video\") {\n return (\n <DocumentVideoCapture\n selectedDocumentType={selectedDocumentType}\n onComplete={handleDocumentVideoComplete}\n onBack={() => {\n setVideoFlowPhase(\"photo\");\n setCurrentPhotoStep(\"confirmation\");\n }}\n nodeId={node.id}\n sessionId={sessionId}\n previewOverrides={{\n recto: capturedImages.recto,\n verso: capturedImages.verso,\n }}\n blockingCodes={node.blockingCodes}\n />\n );\n }\n\n if (currentPhotoStep === \"before-recto\") {\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n if (currentPhotoStep === \"recto\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"recto\")}\n />\n );\n }\n if (currentPhotoStep === \"before-verso\") {\n return (\n <BeforeVersoPhoto setStep={() => setCurrentPhotoStep(\"verso\")} />\n );\n }\n if (currentPhotoStep === \"verso\") {\n return (\n <Photo\n onCapture={(imageData) => handlePhotoCapture(imageData, \"verso\")}\n />\n );\n }\n if (currentPhotoStep === \"confirmation\") {\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto || \"\"}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={!!capturedImages.verso}\n onConfirm={onConfirm}\n onRetry={() => setCurrentPhotoStep(\"before-recto\")}\n onRetryAfterProcessing={() => setCurrentPhotoStep(\"before-recto\")}\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n }\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n } else {\n return (\n <JDIDocumentUpload\n documentType={selectedDocumentType?.id || documentTypeId}\n documentTypeId={documentTypeId}\n documentLabel={selectedDocumentType?.label}\n onUpload={handleDocumentUpload}\n onBack={() => {\n if (isPictureAllowed && isDownloadAllowed) {\n setSelectedMethod(null);\n } else {\n setDocStep(2);\n }\n }}\n initialFront={errorCode === \"2.5\" ? fileUploaded?.front : null}\n initialBack={errorCode === \"2.5\" ? fileUploaded?.back : null}\n sessionId={sessionId}\n />\n );\n }\n }\n // fall-through volontaire vers case 4 (comportement existant conservé)\n case 4:\n return (\n <JDIProcessing\n documentType={selectedDocumentType?.id || documentTypeId}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={documentTypeId}\n retryCount={retryCount}\n documentTemplateId={selectedDocumentType?.documentTemplateId}\n nodeId={node.id}\n blockingCodes={node.blockingCodes}\n />\n );\n case 5:\n return (\n <JDISuccess\n documentType={selectedDocumentType?.id || documentTypeId}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n />\n );\n case 6:\n return (\n <JDIError\n documentType={selectedDocumentType?.id || documentTypeId}\n onRetry={handleRetryFromError}\n onContinueAnyway={\n node.allowContinueOnFailure === false\n ? undefined\n : handleContinueAnyway\n }\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n blockContinue={blockContinue}\n />\n );\n case 7:\n if (nfcPreparationError) {\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <ButtonDesktop\n type=\"back\"\n onClick={() => setDocStep(2)}\n className=\"w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2\"\n >\n {t(\"buttons.back\", \"Retour\")}\n </ButtonDesktop>\n </div>\n }\n >\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"nfc_scan.preparation_error_title\", \"Erreur de préparation NFC\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{nfcPreparationError}</p>\n </div>\n </MobilePageLayout>\n );\n }\n return (\n <NfcScanStep\n sessionId={sessionId}\n nodeId={node.id}\n stepObject={stepObject}\n template={template}\n onBack={() => {\n // Retour vers la sélection du document (corriger un mauvais choix, ou après échec NFC).\n // Le démontage de NfcScanStep ferme le SSE via le cleanup du hook (pas d'appel backend).\n const hasIntroduction =\n node.introductionPage?.title !== undefined ||\n node.introductionPage?.description !== undefined;\n hasRestoredNfcStep.current = true; // ne pas re-restaurer l'étape QR après ce retour\n setDocStep(hasIntroduction ? 0 : 1);\n }}\n onContinueWithoutChip={() => {\n // \"Poursuivre sans puce\" après échec définitif : ouvre le questionnaire de raison\n // (docStep -2 → NfcFallbackSurvey → handleNfcFallback). handleNfcFallback applique\n // ensuite la reprise selon nfcMode (nfcOrPhoto → photo/API ; nfcOnly → nœud suivant).\n hasRestoredNfcStep.current = true;\n setDocStep(-2);\n }}\n />\n );\n default:\n console.error(`Invalid docStep: ${docStep}`);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_check.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\n \"document_check.navigation_error.description\",\n \"Étape non valide. Veuillez recommencer.\",\n )}\n </p>\n <ButtonDesktop\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n type=\"back\"\n onClick={() => setDocStep(0)}\n >\n {t(\"document_check.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCheck;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -45,7 +45,16 @@ var EndFlow = function (_a) {
45
45
  // Décalage horizontal du bloc d'items réservé au desktop. On le pilote en JS
46
46
  // (useIsMobile, cohérent avec le composant Button) plutôt que via `md:` Tailwind :
47
47
  // les variantes responsive `md:translate-*` ne sont pas fiables dans le bundle SDK.
48
+ // Utilisé uniquement par l'écran d'erreur générique hardcodé ci-dessous.
48
49
  var desktopTranslateX = isMobile ? "" : "translate-x-10";
50
+ // Même décalage, mais via padding plutôt que transform — réservé aux écrans à
51
+ // message personnalisé (renderCustomCase) : un `transform: translateX(...)` ne fait
52
+ // déborder aucune boîte visuellement, mais contribue quand même au "scrollable
53
+ // overflow" du conteneur `overflow-y-auto` ancêtre (DatakeenSession), ce qui
54
+ // affichait une scrollbar horizontale fantôme sur desktop. `padding-left` reste
55
+ // contenu dans la largeur déclarée (box-sizing: border-box global du SDK), donc ne
56
+ // peut pas produire ce débordement invisible.
57
+ var desktopOffsetX = isMobile ? "" : "pl-10";
49
58
  // Le nœud end peut déjà forcer un résultat non conforme : dans ce cas on
50
59
  // connaît l'issue sans attendre le backend.
51
60
  var expectedError = expectedResult === "non_compliant" || expectedResult === "error";
@@ -204,7 +213,7 @@ var EndFlow = function (_a) {
204
213
  // items centrés verticalement, icônes à la couleur du bouton du journey).
205
214
  var renderCustomCase = function (config, fallbackTitle) {
206
215
  var _a;
207
- return (jsxs("div", { className: "flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8", children: [jsx(Title, { className: "text-2xl md:text-3xl text-center", children: ((_a = config.title) === null || _a === void 0 ? void 0 : _a.trim()) || fallbackTitle }), jsx("div", { className: "flex flex-1 items-center w-full max-w-md mx-auto", children: jsx("div", { className: "flex w-full flex-col items-start gap-7 -translate-y-20 ".concat(desktopTranslateX), children: config.items.map(function (item, index) {
216
+ return (jsxs("div", { className: "flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8", children: [jsx(Title, { className: "text-2xl md:text-3xl text-center", children: ((_a = config.title) === null || _a === void 0 ? void 0 : _a.trim()) || fallbackTitle }), jsx("div", { className: "flex flex-1 items-center w-full max-w-md mx-auto", children: jsx("div", { className: "flex w-full flex-col items-start gap-7 -translate-y-20 ".concat(desktopOffsetX), children: config.items.map(function (item, index) {
208
217
  var Icon = resolveEndScreenIcon(item.icon);
209
218
  return (jsxs("div", { className: "flex w-full items-center gap-4 text-left", children: [jsx(Icon, { className: "w-7 h-7 shrink-0", style: { color: ICON_COLOR } }), jsx("span", { className: "flex-1 text-base md:text-lg text-[#3C3C40]", children: item.text })] }, index));
210
219
  }) }) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"EndFlow.js","sources":["../../../../../src/components/session/EndFlow.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { HeartHandshake, Send, Mail } from \"lucide-react\";\nimport checkIcon from \"../../assets/check.svg\";\nimport LoadingState from \"../states/LoadingState\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport {\n clearSessionSensitiveData,\n updateSessionStatus,\n} from \"../../services/sessionService\";\nimport { logSessionEnded } from \"../../services/auditTrailService\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport type { EndScreenCase } from \"../../types/session\";\nimport { resolveEndScreenIcon } from \"./endScreenIcons\";\n\n// Couleur des icônes = couleur du bouton choisie pour le journey (buttonBgColor).\nconst ICON_COLOR = \"var(--dk-btn-bg, #11e5c5)\";\n\ninterface EndFlowProps {\n sessionId: string;\n sessionStatus?: string; // Ajout du statut de session optionnel\n callbackURL?: string | null;\n endNodeId?: string; // Id du nœud `end` atteint, transmis au backend pour forcer le bon statut\n expectedResult?: string; // Résultat forcé du nœud end atteint (ex: 'non_compliant')\n /** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\n compliantCase?: EndScreenCase;\n nonCompliantCase?: EndScreenCase;\n}\n\n/**\n * EndFlow Component\n *\n * Composant affiché à la fin du flux de vérification lorsque toutes les étapes ont été complétées.\n * Affiche un message de confirmation avec une icône de succès.\n *\n * @param {EndFlowProps} props - Propriétés du composant\n * @param {string} props.sessionId - L'identifiant de la session\n * @param {string} props.sessionStatus - Le statut actuel de la session\n * @returns {JSX.Element} Le composant EndFlow\n */\nconst EndFlow: React.FC<EndFlowProps> = ({\n sessionId,\n sessionStatus,\n callbackURL,\n endNodeId,\n expectedResult,\n compliantCase,\n nonCompliantCase,\n}) => {\n const [isEnding, setIsEnding] = useState(false);\n const [isRedirecting, setIsRedirecting] = useState(false);\n const [shouldRedirect, setShouldRedirect] = useState(false);\n // Statut consolidé renvoyé par le backend après updateSessionStatus —\n // sert à détecter un échec « poursuivre quand même » non porté par expectedResult.\n const [backendStatus, setBackendStatus] = useState<string | undefined>(\n undefined,\n );\n // Le verdict backend arrive de façon asynchrone (~1-2s). On le marque résolu\n // pour éviter de flasher l'écran succès puis basculer sur l'écran erreur.\n const [statusResolved, setStatusResolved] = useState(false);\n const { t } = useI18n();\n const isMobile = useIsMobile(768);\n // Décalage horizontal du bloc d'items réservé au desktop. On le pilote en JS\n // (useIsMobile, cohérent avec le composant Button) plutôt que via `md:` Tailwind :\n // les variantes responsive `md:translate-*` ne sont pas fiables dans le bundle SDK.\n const desktopTranslateX = isMobile ? \"\" : \"translate-x-10\";\n\n // Le nœud end peut déjà forcer un résultat non conforme : dans ce cas on\n // connaît l'issue sans attendre le backend.\n const expectedError =\n expectedResult === \"non_compliant\" || expectedResult === \"error\";\n\n // L'écran « erreur conservée » s'affiche si le nœud end force un résultat\n // non conforme, OU si le backend a consolidé un statut d'échec/vérification.\n const isError =\n expectedError ||\n backendStatus === \"ai_rejected\" ||\n backendStatus === \"verify\";\n\n // Tant que le verdict n'est pas connu (ni forcé par le nœud, ni renvoyé par\n // le backend), on affiche un état neutre plutôt que de présumer le succès.\n const isResolving = !expectedError && !statusResolved;\n\n // Trigger session end as soon as the user reaches this screen,\n // regardless of whether they click the button (e.g. tab close)\n useEffect(() => {\n updateSessionStatus(sessionId, \"ended\", endNodeId)\n .then((updatedSession) => {\n if (updatedSession?.status) {\n setBackendStatus(updatedSession.status);\n }\n if (updatedSession && updatedSession.analysisId) {\n logSessionEnded(sessionId).catch((err) => {\n console.error(\"Failed to log session end in audit trail:\", err);\n });\n }\n })\n .catch((error) => {\n console.error(\"Error updating session status on EndFlow mount:\", error);\n })\n .finally(() => {\n // Verdict connu (ou échec d'appel) : on peut afficher l'écran final.\n setStatusResolved(true);\n });\n }, []);\n\n const handleEndSession = async () => {\n setIsEnding(true);\n try {\n clearSessionSensitiveData(sessionId);\n } catch (error) {\n console.error(\"Erreur lors de la finalisation de la session:\", error);\n } finally {\n setIsEnding(false);\n if (callbackURL) {\n setIsRedirecting(true);\n setShouldRedirect(true);\n } else {\n // Forcer la fermeture immédiatement lorsqu'aucune redirection n'est attendue\n closeWindow();\n }\n }\n };\n\n const redirectToCallback = (url: string) => {\n try {\n window.location.replace(url);\n } catch (e) {\n console.error(\"Redirection vers le callback échouée:\", e);\n setIsRedirecting(false);\n closeWindow();\n }\n };\n\n useEffect(() => {\n if (sessionStatus === \"ended\" && callbackURL && !shouldRedirect) {\n setIsRedirecting(true);\n setShouldRedirect(true);\n }\n }, [sessionStatus, callbackURL, shouldRedirect]);\n\n useEffect(() => {\n if (!shouldRedirect || !callbackURL) {\n return;\n }\n\n const REDIRECT_DELAY_MS = 2000;\n const timer = window.setTimeout(\n () => redirectToCallback(callbackURL),\n REDIRECT_DELAY_MS,\n );\n return () => window.clearTimeout(timer);\n }, [shouldRedirect, callbackURL]);\n\n const closeWindow = () => {\n console.log(\"Tentative de fermeture de la fenêtre...\");\n\n // Méthode 1: Si dans un iframe, communiquer avec le parent IMMÉDIATEMENT\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(\n {\n action: \"closeSession\",\n sessionId,\n status: \"ended\",\n message: \"Session terminée, veuillez fermer cette fenêtre\",\n },\n \"*\",\n );\n console.log(\"Message envoyé au parent pour fermeture\");\n } catch (e) {\n console.log(\"postMessage échoué:\", e);\n }\n }\n\n // Méthode 2: Essayer window.close() avec différentes approches\n try {\n // Essayer close direct\n window.close();\n console.log(\"window.close() direct appelé\");\n } catch (e) {\n console.log(\"window.close() direct échoué:\", e);\n }\n\n // Méthode 3: Si on a un opener, essayer de se fermer via l'opener\n setTimeout(() => {\n try {\n if (window.opener) {\n window.opener.focus();\n window.close();\n console.log(\"Fermeture via opener\");\n }\n } catch (e) {\n console.log(\"Fermeture via opener échouée:\", e);\n }\n }, 100);\n\n // Méthode 4: Forcer avec self.close()\n setTimeout(() => {\n try {\n self.close();\n console.log(\"self.close() appelé\");\n } catch (e) {\n console.log(\"self.close() échoué:\", e);\n }\n }, 200);\n\n // Méthode 5: Essayer de manipuler l'historique pour forcer la fermeture\n setTimeout(() => {\n try {\n window.history.back();\n window.close();\n console.log(\"history.back() + close\");\n } catch (e) {\n console.log(\"history.back() + close échoué:\", e);\n }\n }, 300);\n\n // Méthode 6: Rediriger vers une page de fermeture personnalisée\n setTimeout(() => {\n try {\n // Créer une URL de données avec un script de fermeture automatique\n const closeScript = `\n <html>\n <head><title>Session terminée</title></head>\n <body style=\"margin:0;padding:0;background:#f0f0f0;font-family:Arial,sans-serif;\">\n <div style=\"display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;text-align:center;\">\n <h1 style=\"color:#4ade80;margin-bottom:20px;\">✅ Session terminée avec succès</h1>\n <p style=\"color:#666;margin-bottom:30px;\">Cette fenêtre va se fermer automatiquement.</p>\n <button onclick=\"attemptClose()\" style=\"background:#3b82f6;color:white;border:none;padding:12px 24px;border-radius:6px;cursor:pointer;font-size:16px;\">\n Fermer maintenant\n </button>\n </div>\n <script>\n function attemptClose() {\n try {\n window.close();\n self.close();\n if (window.opener) {\n window.opener.focus();\n window.close();\n }\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({action:'closeWindow'}, '*');\n }\n } catch(e) {\n console.log('Fermeture impossible:', e);\n document.body.innerHTML = '<div style=\"text-align:center;padding:50px;\"><h2>Veuillez fermer cette fenêtre manuellement</h2><p>Appuyez sur Alt+F4 ou cliquez sur le X</p></div>';\n }\n }\n // Essayer de fermer automatiquement après 1 seconde\n setTimeout(attemptClose, 1000);\n </script>\n </body>\n </html>\n `;\n const dataUrl =\n \"data:text/html;charset=utf-8,\" + encodeURIComponent(closeScript);\n window.location.replace(dataUrl);\n console.log(\"Redirection vers page de fermeture personnalisée\");\n } catch (e) {\n console.log(\"Redirection vers page personnalisée échouée:\", e);\n }\n }, 500);\n };\n\n // Rendu d'un jeu de textes de fin personnalisé (titre ancré en haut,\n // items centrés verticalement, icônes à la couleur du bouton du journey).\n const renderCustomCase = (config: EndScreenCase, fallbackTitle: string) => (\n <div className=\"flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8\">\n <Title className=\"text-2xl md:text-3xl text-center\">\n {config.title?.trim() || fallbackTitle}\n </Title>\n <div className=\"flex flex-1 items-center w-full max-w-md mx-auto\">\n {/* Translate appliqué uniquement sur desktop (md+) ; sur mobile il\n décalait le texte hors écran et le tronquait. */}\n <div\n className={`flex w-full flex-col items-start gap-7 -translate-y-20 ${desktopTranslateX}`}\n >\n {config.items.map((item, index) => {\n const Icon = resolveEndScreenIcon(item.icon);\n return (\n <div\n key={index}\n className=\"flex w-full items-center gap-4 text-left\"\n >\n <Icon\n className=\"w-7 h-7 shrink-0\"\n style={{ color: ICON_COLOR }}\n />\n <span className=\"flex-1 text-base md:text-lg text-[#3C3C40]\">\n {item.text}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n\n const hasCustomError = !!nonCompliantCase?.items?.length;\n const hasCustomSuccess = !!compliantCase?.items?.length;\n\n // En attente du verdict backend : éviter le flash de l'écran succès.\n if (isResolving) {\n return (\n <LoadingState\n message={t(\"session.end.finalizing\", \"Finalisation du parcours...\")}\n subtitle=\"\"\n />\n );\n }\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleEndSession}\n disabled={isEnding || isRedirecting}\n >\n {isRedirecting\n ? t(\"session.end.button_redirecting\", \"Redirection...\")\n : isEnding\n ? t(\"session.end.button_finalizing\", \"Finalisation...\")\n : t(\"session.end.button_end\", \"Terminer\")}\n </Button>\n }\n />\n }\n >\n {isError ? (\n hasCustomError ? (\n renderCustomCase(\n nonCompliantCase as EndScreenCase,\n t(\"session.end.error_title\", \"Les prochaines étapes\"),\n )\n ) : (\n <div className=\"flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8\">\n {/* Titre ancré en haut */}\n <Title className=\"text-2xl md:text-3xl text-center\">\n {t(\"session.end.error_title\", \"Les prochaines étapes\")}\n </Title>\n\n {/* Liste centrée verticalement dans l'espace restant */}\n <div className=\"flex flex-1 items-center w-full max-w-md mx-auto\">\n {/* Translate desktop-only : sur mobile il tronquait le texte. */}\n <div\n className={`flex w-full flex-col items-start gap-7 -translate-y-20 ${desktopTranslateX}`}\n >\n {[\n {\n Icon: HeartHandshake,\n key: \"session.end.error_step_thanks\",\n fallback: \"Nous vous remercions pour ces informations\",\n },\n {\n Icon: Send,\n key: \"session.end.error_step_transmitted\",\n fallback: \"Votre dossier a été transmis à notre équipe\",\n },\n {\n Icon: Mail,\n key: \"session.end.error_step_contact\",\n fallback: \"Nous vous recontacterons si nécessaire\",\n },\n ].map(({ Icon, key, fallback }) => (\n <div\n key={key}\n className=\"flex w-full items-center gap-4 text-left\"\n >\n <Icon\n className=\"w-7 h-7 shrink-0\"\n style={{ color: ICON_COLOR }}\n />\n <span className=\"flex-1 text-base md:text-lg text-[#3C3C40]\">\n {t(key, fallback)}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n ) : hasCustomSuccess ? (\n renderCustomCase(\n compliantCase as EndScreenCase,\n t(\"session.end.title\", \"C'est tout bon !\"),\n )\n ) : (\n <div className=\"flex flex-1 flex-col items-center justify-center h-full px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6\">\n {/* Icon - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n <img\n src={checkIcon}\n alt={t(\"session.end.image_alt\", \"Vérification terminée\")}\n className=\"w-48 h-48\"\n />\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\"session.end.title\", \"C'est tout bon !\")}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed\">\n {t(\n \"session.end.subtitle\",\n \"Merci d'avoir terminé ce parcours, vous pouvez quitter cette fenêtre.\",\n )}\n </Subtitle>\n </div>\n </div>\n </div>\n )}\n </MobilePageLayout>\n );\n};\n\nexport default EndFlow;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"EndFlow.js","sources":["../../../../../src/components/session/EndFlow.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { HeartHandshake, Send, Mail } from \"lucide-react\";\nimport checkIcon from \"../../assets/check.svg\";\nimport LoadingState from \"../states/LoadingState\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport {\n clearSessionSensitiveData,\n updateSessionStatus,\n} from \"../../services/sessionService\";\nimport { logSessionEnded } from \"../../services/auditTrailService\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport type { EndScreenCase } from \"../../types/session\";\nimport { resolveEndScreenIcon } from \"./endScreenIcons\";\n\n// Couleur des icônes = couleur du bouton choisie pour le journey (buttonBgColor).\nconst ICON_COLOR = \"var(--dk-btn-bg, #11e5c5)\";\n\ninterface EndFlowProps {\n sessionId: string;\n sessionStatus?: string; // Ajout du statut de session optionnel\n callbackURL?: string | null;\n endNodeId?: string; // Id du nœud `end` atteint, transmis au backend pour forcer le bon statut\n expectedResult?: string; // Résultat forcé du nœud end atteint (ex: 'non_compliant')\n /** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\n compliantCase?: EndScreenCase;\n nonCompliantCase?: EndScreenCase;\n}\n\n/**\n * EndFlow Component\n *\n * Composant affiché à la fin du flux de vérification lorsque toutes les étapes ont été complétées.\n * Affiche un message de confirmation avec une icône de succès.\n *\n * @param {EndFlowProps} props - Propriétés du composant\n * @param {string} props.sessionId - L'identifiant de la session\n * @param {string} props.sessionStatus - Le statut actuel de la session\n * @returns {JSX.Element} Le composant EndFlow\n */\nconst EndFlow: React.FC<EndFlowProps> = ({\n sessionId,\n sessionStatus,\n callbackURL,\n endNodeId,\n expectedResult,\n compliantCase,\n nonCompliantCase,\n}) => {\n const [isEnding, setIsEnding] = useState(false);\n const [isRedirecting, setIsRedirecting] = useState(false);\n const [shouldRedirect, setShouldRedirect] = useState(false);\n // Statut consolidé renvoyé par le backend après updateSessionStatus —\n // sert à détecter un échec « poursuivre quand même » non porté par expectedResult.\n const [backendStatus, setBackendStatus] = useState<string | undefined>(\n undefined,\n );\n // Le verdict backend arrive de façon asynchrone (~1-2s). On le marque résolu\n // pour éviter de flasher l'écran succès puis basculer sur l'écran erreur.\n const [statusResolved, setStatusResolved] = useState(false);\n const { t } = useI18n();\n const isMobile = useIsMobile(768);\n // Décalage horizontal du bloc d'items réservé au desktop. On le pilote en JS\n // (useIsMobile, cohérent avec le composant Button) plutôt que via `md:` Tailwind :\n // les variantes responsive `md:translate-*` ne sont pas fiables dans le bundle SDK.\n // Utilisé uniquement par l'écran d'erreur générique hardcodé ci-dessous.\n const desktopTranslateX = isMobile ? \"\" : \"translate-x-10\";\n // Même décalage, mais via padding plutôt que transform — réservé aux écrans à\n // message personnalisé (renderCustomCase) : un `transform: translateX(...)` ne fait\n // déborder aucune boîte visuellement, mais contribue quand même au \"scrollable\n // overflow\" du conteneur `overflow-y-auto` ancêtre (DatakeenSession), ce qui\n // affichait une scrollbar horizontale fantôme sur desktop. `padding-left` reste\n // contenu dans la largeur déclarée (box-sizing: border-box global du SDK), donc ne\n // peut pas produire ce débordement invisible.\n const desktopOffsetX = isMobile ? \"\" : \"pl-10\";\n\n // Le nœud end peut déjà forcer un résultat non conforme : dans ce cas on\n // connaît l'issue sans attendre le backend.\n const expectedError =\n expectedResult === \"non_compliant\" || expectedResult === \"error\";\n\n // L'écran « erreur conservée » s'affiche si le nœud end force un résultat\n // non conforme, OU si le backend a consolidé un statut d'échec/vérification.\n const isError =\n expectedError ||\n backendStatus === \"ai_rejected\" ||\n backendStatus === \"verify\";\n\n // Tant que le verdict n'est pas connu (ni forcé par le nœud, ni renvoyé par\n // le backend), on affiche un état neutre plutôt que de présumer le succès.\n const isResolving = !expectedError && !statusResolved;\n\n // Trigger session end as soon as the user reaches this screen,\n // regardless of whether they click the button (e.g. tab close)\n useEffect(() => {\n updateSessionStatus(sessionId, \"ended\", endNodeId)\n .then((updatedSession) => {\n if (updatedSession?.status) {\n setBackendStatus(updatedSession.status);\n }\n if (updatedSession && updatedSession.analysisId) {\n logSessionEnded(sessionId).catch((err) => {\n console.error(\"Failed to log session end in audit trail:\", err);\n });\n }\n })\n .catch((error) => {\n console.error(\"Error updating session status on EndFlow mount:\", error);\n })\n .finally(() => {\n // Verdict connu (ou échec d'appel) : on peut afficher l'écran final.\n setStatusResolved(true);\n });\n }, []);\n\n const handleEndSession = async () => {\n setIsEnding(true);\n try {\n clearSessionSensitiveData(sessionId);\n } catch (error) {\n console.error(\"Erreur lors de la finalisation de la session:\", error);\n } finally {\n setIsEnding(false);\n if (callbackURL) {\n setIsRedirecting(true);\n setShouldRedirect(true);\n } else {\n // Forcer la fermeture immédiatement lorsqu'aucune redirection n'est attendue\n closeWindow();\n }\n }\n };\n\n const redirectToCallback = (url: string) => {\n try {\n window.location.replace(url);\n } catch (e) {\n console.error(\"Redirection vers le callback échouée:\", e);\n setIsRedirecting(false);\n closeWindow();\n }\n };\n\n useEffect(() => {\n if (sessionStatus === \"ended\" && callbackURL && !shouldRedirect) {\n setIsRedirecting(true);\n setShouldRedirect(true);\n }\n }, [sessionStatus, callbackURL, shouldRedirect]);\n\n useEffect(() => {\n if (!shouldRedirect || !callbackURL) {\n return;\n }\n\n const REDIRECT_DELAY_MS = 2000;\n const timer = window.setTimeout(\n () => redirectToCallback(callbackURL),\n REDIRECT_DELAY_MS,\n );\n return () => window.clearTimeout(timer);\n }, [shouldRedirect, callbackURL]);\n\n const closeWindow = () => {\n console.log(\"Tentative de fermeture de la fenêtre...\");\n\n // Méthode 1: Si dans un iframe, communiquer avec le parent IMMÉDIATEMENT\n if (window.parent && window.parent !== window) {\n try {\n window.parent.postMessage(\n {\n action: \"closeSession\",\n sessionId,\n status: \"ended\",\n message: \"Session terminée, veuillez fermer cette fenêtre\",\n },\n \"*\",\n );\n console.log(\"Message envoyé au parent pour fermeture\");\n } catch (e) {\n console.log(\"postMessage échoué:\", e);\n }\n }\n\n // Méthode 2: Essayer window.close() avec différentes approches\n try {\n // Essayer close direct\n window.close();\n console.log(\"window.close() direct appelé\");\n } catch (e) {\n console.log(\"window.close() direct échoué:\", e);\n }\n\n // Méthode 3: Si on a un opener, essayer de se fermer via l'opener\n setTimeout(() => {\n try {\n if (window.opener) {\n window.opener.focus();\n window.close();\n console.log(\"Fermeture via opener\");\n }\n } catch (e) {\n console.log(\"Fermeture via opener échouée:\", e);\n }\n }, 100);\n\n // Méthode 4: Forcer avec self.close()\n setTimeout(() => {\n try {\n self.close();\n console.log(\"self.close() appelé\");\n } catch (e) {\n console.log(\"self.close() échoué:\", e);\n }\n }, 200);\n\n // Méthode 5: Essayer de manipuler l'historique pour forcer la fermeture\n setTimeout(() => {\n try {\n window.history.back();\n window.close();\n console.log(\"history.back() + close\");\n } catch (e) {\n console.log(\"history.back() + close échoué:\", e);\n }\n }, 300);\n\n // Méthode 6: Rediriger vers une page de fermeture personnalisée\n setTimeout(() => {\n try {\n // Créer une URL de données avec un script de fermeture automatique\n const closeScript = `\n <html>\n <head><title>Session terminée</title></head>\n <body style=\"margin:0;padding:0;background:#f0f0f0;font-family:Arial,sans-serif;\">\n <div style=\"display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;text-align:center;\">\n <h1 style=\"color:#4ade80;margin-bottom:20px;\">✅ Session terminée avec succès</h1>\n <p style=\"color:#666;margin-bottom:30px;\">Cette fenêtre va se fermer automatiquement.</p>\n <button onclick=\"attemptClose()\" style=\"background:#3b82f6;color:white;border:none;padding:12px 24px;border-radius:6px;cursor:pointer;font-size:16px;\">\n Fermer maintenant\n </button>\n </div>\n <script>\n function attemptClose() {\n try {\n window.close();\n self.close();\n if (window.opener) {\n window.opener.focus();\n window.close();\n }\n if (window.parent && window.parent !== window) {\n window.parent.postMessage({action:'closeWindow'}, '*');\n }\n } catch(e) {\n console.log('Fermeture impossible:', e);\n document.body.innerHTML = '<div style=\"text-align:center;padding:50px;\"><h2>Veuillez fermer cette fenêtre manuellement</h2><p>Appuyez sur Alt+F4 ou cliquez sur le X</p></div>';\n }\n }\n // Essayer de fermer automatiquement après 1 seconde\n setTimeout(attemptClose, 1000);\n </script>\n </body>\n </html>\n `;\n const dataUrl =\n \"data:text/html;charset=utf-8,\" + encodeURIComponent(closeScript);\n window.location.replace(dataUrl);\n console.log(\"Redirection vers page de fermeture personnalisée\");\n } catch (e) {\n console.log(\"Redirection vers page personnalisée échouée:\", e);\n }\n }, 500);\n };\n\n // Rendu d'un jeu de textes de fin personnalisé (titre ancré en haut,\n // items centrés verticalement, icônes à la couleur du bouton du journey).\n const renderCustomCase = (config: EndScreenCase, fallbackTitle: string) => (\n <div className=\"flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8\">\n <Title className=\"text-2xl md:text-3xl text-center\">\n {config.title?.trim() || fallbackTitle}\n </Title>\n <div className=\"flex flex-1 items-center w-full max-w-md mx-auto\">\n {/* Padding appliqué uniquement sur desktop (md+) ; sur mobile il\n décalait le texte hors écran et le tronquait. */}\n <div\n className={`flex w-full flex-col items-start gap-7 -translate-y-20 ${desktopOffsetX}`}\n >\n {config.items.map((item, index) => {\n const Icon = resolveEndScreenIcon(item.icon);\n return (\n <div\n key={index}\n className=\"flex w-full items-center gap-4 text-left\"\n >\n <Icon\n className=\"w-7 h-7 shrink-0\"\n style={{ color: ICON_COLOR }}\n />\n <span className=\"flex-1 text-base md:text-lg text-[#3C3C40]\">\n {item.text}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n\n const hasCustomError = !!nonCompliantCase?.items?.length;\n const hasCustomSuccess = !!compliantCase?.items?.length;\n\n // En attente du verdict backend : éviter le flash de l'écran succès.\n if (isResolving) {\n return (\n <LoadingState\n message={t(\"session.end.finalizing\", \"Finalisation du parcours...\")}\n subtitle=\"\"\n />\n );\n }\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleEndSession}\n disabled={isEnding || isRedirecting}\n >\n {isRedirecting\n ? t(\"session.end.button_redirecting\", \"Redirection...\")\n : isEnding\n ? t(\"session.end.button_finalizing\", \"Finalisation...\")\n : t(\"session.end.button_end\", \"Terminer\")}\n </Button>\n }\n />\n }\n >\n {isError ? (\n hasCustomError ? (\n renderCustomCase(\n nonCompliantCase as EndScreenCase,\n t(\"session.end.error_title\", \"Les prochaines étapes\"),\n )\n ) : (\n <div className=\"flex flex-1 flex-col items-center h-full px-4 pt-10 pb-8 md:px-8\">\n {/* Titre ancré en haut */}\n <Title className=\"text-2xl md:text-3xl text-center\">\n {t(\"session.end.error_title\", \"Les prochaines étapes\")}\n </Title>\n\n {/* Liste centrée verticalement dans l'espace restant */}\n <div className=\"flex flex-1 items-center w-full max-w-md mx-auto\">\n {/* Translate desktop-only : sur mobile il tronquait le texte. */}\n <div\n className={`flex w-full flex-col items-start gap-7 -translate-y-20 ${desktopTranslateX}`}\n >\n {[\n {\n Icon: HeartHandshake,\n key: \"session.end.error_step_thanks\",\n fallback: \"Nous vous remercions pour ces informations\",\n },\n {\n Icon: Send,\n key: \"session.end.error_step_transmitted\",\n fallback: \"Votre dossier a été transmis à notre équipe\",\n },\n {\n Icon: Mail,\n key: \"session.end.error_step_contact\",\n fallback: \"Nous vous recontacterons si nécessaire\",\n },\n ].map(({ Icon, key, fallback }) => (\n <div\n key={key}\n className=\"flex w-full items-center gap-4 text-left\"\n >\n <Icon\n className=\"w-7 h-7 shrink-0\"\n style={{ color: ICON_COLOR }}\n />\n <span className=\"flex-1 text-base md:text-lg text-[#3C3C40]\">\n {t(key, fallback)}\n </span>\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n ) : hasCustomSuccess ? (\n renderCustomCase(\n compliantCase as EndScreenCase,\n t(\"session.end.title\", \"C'est tout bon !\"),\n )\n ) : (\n <div className=\"flex flex-1 flex-col items-center justify-center h-full px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6\">\n {/* Icon - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n <img\n src={checkIcon}\n alt={t(\"session.end.image_alt\", \"Vérification terminée\")}\n className=\"w-48 h-48\"\n />\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\"session.end.title\", \"C'est tout bon !\")}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed\">\n {t(\n \"session.end.subtitle\",\n \"Merci d'avoir terminé ce parcours, vous pouvez quitter cette fenêtre.\",\n )}\n </Subtitle>\n </div>\n </div>\n </div>\n )}\n </MobilePageLayout>\n );\n};\n\nexport default EndFlow;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Politique de routage du nœud controle-jdi quand les resoumissions sont
3
+ * épuisées sur un code bloquant — miroir de `conditionNodePolicy.ts`
4
+ * (nœud condition), extrait en fonctions pures pour rester testable sans
5
+ * monter DocumentCheck.tsx en entier.
6
+ *
7
+ * Décision produit (rétrocompat) : la sortie "false" du nœud controle-jdi
8
+ * est OPTIONNELLE. Un nœud legacy sans sortie "false" câblée doit conserver
9
+ * EXACTEMENT son comportement actuel (écran d'erreur + bouton "continuer
10
+ * quand même"). Le routage automatique true/false ne s'active que si
11
+ * l'auteur du parcours a explicitement câblé une sortie "false".
12
+ */
13
+ var DEFAULT_MAX_RESUBMISSION_ACTION = 'end-journey';
14
+ function normalizeMaxResubmissionAction(value) {
15
+ return value === 'force-true' ? 'force-true' : DEFAULT_MAX_RESUBMISSION_ACTION;
16
+ }
17
+ function hasExceededResubmissionAttempts(retryCountAfterFailure, maxAttempts) {
18
+ return retryCountAfterFailure >= maxAttempts;
19
+ }
20
+ /**
21
+ * Point de décision unique pour le routage du nœud controle-jdi après un
22
+ * résultat d'analyse.
23
+ *
24
+ * - Succès (code non bloquant) → toujours "true" (sûr même sur un nœud
25
+ * legacy à une seule arête : `findOutgoingEdge` retombe sur la première
26
+ * arête si aucune n'a le handle "true").
27
+ * - Échec, tentatives non épuisées → écran d'erreur actuel (retry possible).
28
+ * - Échec épuisé, PAS de sortie "false" câblée → écran d'erreur actuel
29
+ * inchangé (rétrocompat totale, aucune navigation automatique).
30
+ * - Échec épuisé, sortie "false" câblée → navigation automatique silencieuse
31
+ * selon `action` (miroir de `conditionMaxRetryAction`).
32
+ */
33
+ function resolveControleJdiOutcomeRoute(params) {
34
+ var hasExceededAttempts = params.hasExceededAttempts, hasFalseEdge = params.hasFalseEdge, action = params.action;
35
+ if (!hasExceededAttempts || !hasFalseEdge) {
36
+ return { handle: undefined, showErrorScreen: true };
37
+ }
38
+ return { handle: action === 'force-true' ? 'true' : 'false', showErrorScreen: false };
39
+ }
40
+
41
+ export { DEFAULT_MAX_RESUBMISSION_ACTION, hasExceededResubmissionAttempts, normalizeMaxResubmissionAction, resolveControleJdiOutcomeRoute };
42
+ //# sourceMappingURL=controleJdiPolicy.js.map