datakeen-session-react 1.1.140-dev.26 → 1.1.140-dev.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/jdi/JDIDocumentUpload.js +44 -22
- package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +6 -1
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/jdi/JDIDocumentUpload.js +44 -22
- package/dist/esm/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +6 -1
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n SessionData,\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 { documentTypesFromCountryId } from \"../../utils/jdiCountry\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useTranslation } from \"react-i18next\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useRetryNavigation } from \"../../hooks/useRetryNavigation\";\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 { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\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 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}\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\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 onContinueOnPC,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n templateIndex,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useTranslation();\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\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page 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 { tryReturnToInformationInput } = useRetryNavigation(\n template,\n templateIndex,\n stepObject,\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 if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\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 // 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\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\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 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 = (documentId: string) => {\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n // Find the selected document details\n let selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n // Don't reset retry count when selecting document type\n // Keep existing retry count for this node\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\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 ) => {\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 // 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 // Note: retry count is already incremented in handleProcessingComplete\n // This function just handles navigation\n if (!tryReturnToInformationInput()) {\n // If we couldn't go back to information-input, go back to upload step\n setDocStep(3);\n }\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 // 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 (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n }\n };\n\n const handleBack = () => {\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\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={handleBack}\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 node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\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\")}\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\")}\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 renderPhotoCaptureFlow = (onConfirm: () => void) => {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n switch (currentPhotoStep) {\n case \"before-recto\":\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n case \"recto\":\n return (\n <Photo\n onCapture={(imageData) =>\n handlePhotoCapture(imageData, \"recto\")\n }\n />\n );\n case \"before-verso\":\n return (\n <BeforeVersoPhoto\n setStep={() => setCurrentPhotoStep(\"verso\")}\n />\n );\n case \"verso\":\n return (\n <Photo\n onCapture={(imageData) =>\n handlePhotoCapture(imageData, \"verso\")\n }\n />\n );\n case \"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={() =>\n setCurrentPhotoStep(\"before-recto\")\n }\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n default:\n setCurrentPhotoStep(\"before-recto\");\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n };\n\n if (node.withVideo) {\n if (videoFlowPhase === \"photo\") {\n return renderPhotoCaptureFlow(handlePhotoConfirmedForVideo);\n }\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 return renderPhotoCaptureFlow(handlePhotoConfirmation);\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 />\n );\n }\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={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\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":["useTranslation","getSession","useState","useEffect","__awaiter","getAllDocumentTemplates","getNodeRetryCount","useRetryNavigation","useDocumentContext","useMemo","EUROPEAN_COUNTRY_CODES","__assign","ISO_COUNTRY_CODES","getDocTypeKey","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","getDocumentTemplateId","incrementNodeRetryCount","_jsxs","_jsx","ButtonDesktop","JDIPreIntroduction","JDICountrySelection","JDIDocumentSelection","MobilePageLayout","Title","Subtitle","Camera","Upload","BeforePhoto","Photo","BeforeVersoPhoto","PhotoConfirmation","DocumentVideoCapture","JDIDocumentUpload","JDIProcessing","JDISuccess","JDIError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentCheck.js","sources":["../../../../../src/components/session/DocumentCheck.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from \"react\";\nimport type {\n AcceptedCountry,\n stepObject,\n SessionTemplate,\n SessionData,\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 { documentTypesFromCountryId } from \"../../utils/jdiCountry\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport { useTranslation } from \"react-i18next\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useRetryNavigation } from \"../../hooks/useRetryNavigation\";\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 { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\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 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}\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\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 onContinueOnPC,\n documentTypeId,\n acceptedCountries,\n isMobileCapture = false,\n allowedAddingMethods,\n template,\n templateIndex,\n setUserInput,\n}: DocumentCheckProps): JSX.Element => {\n const { t } = useTranslation();\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\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page 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 { tryReturnToInformationInput } = useRetryNavigation(\n template,\n templateIndex,\n stepObject,\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 if (\n node.introductionPage?.title === undefined &&\n node.introductionPage?.description === undefined\n ) {\n setDocStep(1);\n } else {\n setDocStep(0);\n }\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 // 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\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\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 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 = (documentId: string) => {\n const documentTemplateID = loadingTemplates\n ? undefined\n : getDocumentTemplateId({\n acceptedCountries: finalAcceptedCountries,\n countryCode: selectedCountry,\n documentId,\n documentTemplates,\n });\n\n // Find the selected document details\n let selectedDoc = {\n id: documentId,\n label: t(`documentTypes.${documentId}`),\n hasTwoSides:\n documentId !== \"passport\" && documentId !== \"pinkDriverLicense\",\n documentTemplateId: documentTemplateID,\n };\n\n setSelectedDocumentType(selectedDoc);\n setFileUploaded(null);\n setAnalysisData(null);\n setErrorCode(null);\n // Don't reset retry count when selecting document type\n // Keep existing retry count for this node\n setCapturedImages({});\n setCurrentPhotoStep(\"before-recto\");\n setVideoFlowPhase(\"photo\");\n setDocStep(3);\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\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 ) => {\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 // 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 // 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 if (!tryReturnToInformationInput()) {\n // If we couldn't go back to information-input, go back to upload step\n setDocStep(3);\n }\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 // 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 (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setDocStep(0);\n }\n };\n\n const handleBack = () => {\n if (docStep === 0) {\n stepObject.goBack();\n } else {\n setDocStep((prev) => prev - 1);\n }\n };\n\n switch (docStep) {\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={handleBack}\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 node.documentSelection?.description ||\n t(\"jdi.document_selection.description\")\n }\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\")}\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\")}\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 renderPhotoCaptureFlow = (onConfirm: () => void) => {\n const isSingleSided =\n selectedDocumentType?.id === \"passport\" ||\n selectedDocumentType?.id === \"pinkDriverLicense\";\n switch (currentPhotoStep) {\n case \"before-recto\":\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n case \"recto\":\n return (\n <Photo\n onCapture={(imageData) =>\n handlePhotoCapture(imageData, \"recto\")\n }\n />\n );\n case \"before-verso\":\n return (\n <BeforeVersoPhoto\n setStep={() => setCurrentPhotoStep(\"verso\")}\n />\n );\n case \"verso\":\n return (\n <Photo\n onCapture={(imageData) =>\n handlePhotoCapture(imageData, \"verso\")\n }\n />\n );\n case \"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={() =>\n setCurrentPhotoStep(\"before-recto\")\n }\n fileUploaded={fileUploaded}\n isSingleSided={isSingleSided}\n />\n );\n default:\n setCurrentPhotoStep(\"before-recto\");\n return (\n <BeforePhoto\n setStep={() => setCurrentPhotoStep(\"recto\")}\n isSingleSided={isSingleSided}\n onBack={() => setDocStep(2)}\n />\n );\n }\n };\n\n if (node.withVideo) {\n if (videoFlowPhase === \"photo\") {\n return renderPhotoCaptureFlow(handlePhotoConfirmedForVideo);\n }\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 return renderPhotoCaptureFlow(handlePhotoConfirmation);\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 />\n );\n }\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={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\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":["useTranslation","getSession","useState","useEffect","__awaiter","getAllDocumentTemplates","getNodeRetryCount","useRetryNavigation","useDocumentContext","useMemo","EUROPEAN_COUNTRY_CODES","__assign","ISO_COUNTRY_CODES","getDocTypeKey","dataUrlToBlob","resizeAfterCapture","blobToDataUrl","getDocumentTemplateId","incrementNodeRetryCount","_jsxs","_jsx","ButtonDesktop","JDIPreIntroduction","JDICountrySelection","JDIDocumentSelection","MobilePageLayout","Title","Subtitle","Camera","Upload","BeforePhoto","Photo","BeforeVersoPhoto","PhotoConfirmation","DocumentVideoCapture","JDIDocumentUpload","JDIProcessing","JDISuccess","JDIError"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import { requiresTwoSides } from '../../utils/documentLabels.js';
|
|
|
11
11
|
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
12
12
|
|
|
13
13
|
var JDIDocumentUpload = function (_a) {
|
|
14
|
-
var documentType = _a.documentType, onUpload = _a.onUpload, onBack = _a.onBack, documentTypeId = _a.documentTypeId, documentLabel = _a.documentLabel;
|
|
14
|
+
var documentType = _a.documentType, onUpload = _a.onUpload, onBack = _a.onBack, documentTypeId = _a.documentTypeId, documentLabel = _a.documentLabel, _b = _a.initialFront, initialFront = _b === void 0 ? null : _b, _c = _a.initialBack, initialBack = _c === void 0 ? null : _c;
|
|
15
15
|
var t = useI18n().t;
|
|
16
16
|
// Helper functions for conditional text
|
|
17
17
|
var getDropZoneText = function () {
|
|
@@ -50,13 +50,17 @@ var JDIDocumentUpload = function (_a) {
|
|
|
50
50
|
}
|
|
51
51
|
}, [documentType, documentTypeId, documentLabel]);
|
|
52
52
|
// Store File objects instead of base64 strings
|
|
53
|
-
|
|
54
|
-
var
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
|
|
59
|
-
var _h = useState(
|
|
53
|
+
// initialFront/initialBack permettent de pré-remplir en cas de retry (ex: erreur 2.5)
|
|
54
|
+
var _d = useState(null), frontFile = _d[0], setFrontFile = _d[1];
|
|
55
|
+
var _e = useState(null), backFile = _e[0], setBackFile = _e[1];
|
|
56
|
+
var _f = useState(initialFront !== null && initialFront !== void 0 ? initialFront : null), frontPreview = _f[0], setFrontPreview = _f[1];
|
|
57
|
+
var _g = useState(initialBack !== null && initialBack !== void 0 ? initialBack : null), backPreview = _g[0], setBackPreview = _g[1];
|
|
58
|
+
// Indique que le recto/verso vient d'un dépôt précédent (pas un File local)
|
|
59
|
+
var _h = useState(!!initialFront), isFrontFromInitial = _h[0], setIsFrontFromInitial = _h[1];
|
|
60
|
+
var _j = useState(!!initialBack), isBackFromInitial = _j[0], setIsBackFromInitial = _j[1];
|
|
61
|
+
var _k = useState(false), isUploading = _k[0], setIsUploading = _k[1];
|
|
62
|
+
var _l = useState(""), error = _l[0], setError = _l[1];
|
|
63
|
+
var _m = useState(false), isDragging = _m[0], setIsDragging = _m[1];
|
|
60
64
|
var frontInputRef = useRef(null);
|
|
61
65
|
var multipleInputRef = useRef(null);
|
|
62
66
|
var dropZoneRef = useRef(null);
|
|
@@ -221,10 +225,12 @@ var JDIDocumentUpload = function (_a) {
|
|
|
221
225
|
if (side === "front") {
|
|
222
226
|
setFrontFile(processedFile);
|
|
223
227
|
setFrontPreview(result);
|
|
228
|
+
setIsFrontFromInitial(false);
|
|
224
229
|
}
|
|
225
230
|
else {
|
|
226
231
|
setBackFile(processedFile);
|
|
227
232
|
setBackPreview(result);
|
|
233
|
+
setIsBackFromInitial(false);
|
|
228
234
|
}
|
|
229
235
|
};
|
|
230
236
|
reader.readAsDataURL(processedFile);
|
|
@@ -239,8 +245,8 @@ var JDIDocumentUpload = function (_a) {
|
|
|
239
245
|
case 0:
|
|
240
246
|
// Clear previous errors
|
|
241
247
|
setError("");
|
|
242
|
-
// Validation
|
|
243
|
-
if (!frontFile) {
|
|
248
|
+
// Validation : recto obligatoire (soit un File local, soit une valeur initiale)
|
|
249
|
+
if (!frontFile && !isFrontFromInitial) {
|
|
244
250
|
errorKey = documentTypeId === "jdd"
|
|
245
251
|
? "jdi.document_upload.errors.add_photo_jdd"
|
|
246
252
|
: documentTypeId === "income-proof"
|
|
@@ -254,42 +260,55 @@ var JDIDocumentUpload = function (_a) {
|
|
|
254
260
|
setIsUploading(true);
|
|
255
261
|
_a.label = 1;
|
|
256
262
|
case 1:
|
|
257
|
-
_a.trys.push([1,
|
|
263
|
+
_a.trys.push([1, 8, , 9]);
|
|
264
|
+
frontBase64 = void 0;
|
|
265
|
+
if (!frontFile) return [3 /*break*/, 3];
|
|
258
266
|
return [4 /*yield*/, fileToBase64(frontFile)];
|
|
259
267
|
case 2:
|
|
260
268
|
frontBase64 = _a.sent();
|
|
261
|
-
// Validate the converted data
|
|
262
269
|
if (!isValidBase64Data(frontBase64)) {
|
|
263
270
|
setError(t("jdi.document_upload.errors.front_corrupted"));
|
|
264
271
|
setIsUploading(false);
|
|
265
272
|
return [2 /*return*/];
|
|
266
273
|
}
|
|
274
|
+
return [3 /*break*/, 4];
|
|
275
|
+
case 3:
|
|
276
|
+
// isFrontFromInitial === true : on réutilise la valeur initiale
|
|
277
|
+
frontBase64 = initialFront;
|
|
278
|
+
_a.label = 4;
|
|
279
|
+
case 4:
|
|
267
280
|
backBase64 = null;
|
|
268
|
-
if (!
|
|
281
|
+
if (!twoSidesRequired) return [3 /*break*/, 7];
|
|
282
|
+
if (!backFile) return [3 /*break*/, 6];
|
|
269
283
|
return [4 /*yield*/, fileToBase64(backFile)];
|
|
270
|
-
case
|
|
284
|
+
case 5:
|
|
271
285
|
backBase64 = _a.sent();
|
|
272
|
-
// Validate back image
|
|
273
286
|
if (!isValidBase64Data(backBase64)) {
|
|
274
287
|
setError(t("jdi.document_upload.errors.back_corrupted"));
|
|
275
288
|
setIsUploading(false);
|
|
276
289
|
return [2 /*return*/];
|
|
277
290
|
}
|
|
278
|
-
|
|
279
|
-
case
|
|
291
|
+
return [3 /*break*/, 7];
|
|
292
|
+
case 6:
|
|
293
|
+
if (isBackFromInitial) {
|
|
294
|
+
// On réutilise le verso initial
|
|
295
|
+
backBase64 = initialBack;
|
|
296
|
+
}
|
|
297
|
+
_a.label = 7;
|
|
298
|
+
case 7:
|
|
280
299
|
files = {
|
|
281
300
|
front: frontBase64,
|
|
282
301
|
back: twoSidesRequired ? backBase64 : null,
|
|
283
302
|
};
|
|
284
303
|
onUpload(files);
|
|
285
|
-
return [3 /*break*/,
|
|
286
|
-
case
|
|
304
|
+
return [3 /*break*/, 9];
|
|
305
|
+
case 8:
|
|
287
306
|
err_1 = _a.sent();
|
|
288
307
|
console.error("JDIDocumentUpload: Upload error:", err_1);
|
|
289
308
|
setError(t("jdi.document_upload.errors.upload_error"));
|
|
290
309
|
setIsUploading(false);
|
|
291
|
-
return [3 /*break*/,
|
|
292
|
-
case
|
|
310
|
+
return [3 /*break*/, 9];
|
|
311
|
+
case 9: return [2 /*return*/];
|
|
293
312
|
}
|
|
294
313
|
});
|
|
295
314
|
}); };
|
|
@@ -297,6 +316,7 @@ var JDIDocumentUpload = function (_a) {
|
|
|
297
316
|
{
|
|
298
317
|
setFrontFile(null);
|
|
299
318
|
setFrontPreview(null);
|
|
319
|
+
setIsFrontFromInitial(false);
|
|
300
320
|
if (frontInputRef.current)
|
|
301
321
|
frontInputRef.current.value = "";
|
|
302
322
|
}
|
|
@@ -307,6 +327,8 @@ var JDIDocumentUpload = function (_a) {
|
|
|
307
327
|
setBackFile(null);
|
|
308
328
|
setFrontPreview(null);
|
|
309
329
|
setBackPreview(null);
|
|
330
|
+
setIsFrontFromInitial(false);
|
|
331
|
+
setIsBackFromInitial(false);
|
|
310
332
|
if (frontInputRef.current)
|
|
311
333
|
frontInputRef.current.value = "";
|
|
312
334
|
if (multipleInputRef.current)
|
|
@@ -429,7 +451,7 @@ var JDIDocumentUpload = function (_a) {
|
|
|
429
451
|
}
|
|
430
452
|
});
|
|
431
453
|
}); };
|
|
432
|
-
return (jsx(MobilePageLayout, { contentClassName: "h-full", footer: jsx(PageActions, { primary: jsx(Button, { onClick: handleUpload, disabled: !frontFile || isUploading, children: getValidateButtonText() }), secondary: jsx(Button, { variant: "secondary", onClick: onBack, disabled: isUploading, children: t("jdi.document_upload.back") }) }), children: jsx("div", { className: "flex-1 flex items-center justify-center p-4", children: jsxs("div", { className: "w-full max-w-lg", children: [jsxs("div", { className: "text-center mb-8", children: [jsx("h1", { className: "text-2xl md:text-3xl font-bold text-gray-900 mb-2", children: getDropZoneText() }), jsx("p", { className: "text-gray-600", children: getUploadInstruction() })] }), jsx(Card, { ref: dropZoneRef, className: "border-2 border-dashed ".concat(isDragging
|
|
454
|
+
return (jsx(MobilePageLayout, { contentClassName: "h-full", footer: jsx(PageActions, { primary: jsx(Button, { onClick: handleUpload, disabled: (!frontFile && !isFrontFromInitial) || isUploading, children: getValidateButtonText() }), secondary: jsx(Button, { variant: "secondary", onClick: onBack, disabled: isUploading, children: t("jdi.document_upload.back") }) }), children: jsx("div", { className: "flex-1 flex items-center justify-center p-4", children: jsxs("div", { className: "w-full max-w-lg", children: [jsxs("div", { className: "text-center mb-8", children: [jsx("h1", { className: "text-2xl md:text-3xl font-bold text-gray-900 mb-2", children: getDropZoneText() }), jsx("p", { className: "text-gray-600", children: getUploadInstruction() })] }), jsx(Card, { ref: dropZoneRef, className: "border-2 border-dashed ".concat(isDragging
|
|
433
455
|
? "border-teal-500 bg-teal-100/50"
|
|
434
456
|
: "border-teal-300 bg-teal-50/30", " p-8 mb-6 transition-colors"), onDragEnter: handleDragEnter, onDragLeave: handleDragLeave, onDragOver: handleDragOver, onDrop: handleDrop, children: jsx("div", { className: "text-center space-y-6", children: !frontPreview ? (jsxs(Fragment, { children: [jsx("h3", { className: "text-lg font-semibold text-gray-900 mb-4", children: t("documentTypes." + documentType) }), jsx("div", { className: "flex justify-center w-full", children: jsx(Button, { onClick: function () { var _a; return (_a = frontInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, className: "border border-teal-300 text-teal-600 bg-transparent hover:bg-teal-50 px-4 py-2 rounded-lg font-medium text-sm mx-auto flex items-center", disabled: isUploading, children: jsx("span", { children: t("jdi.document_upload.add_file") }) }) }), jsx("p", { className: "text-sm text-gray-500 italic", children: t("jdi.document_upload.drag_drop_hint", "ou glissez-déposez vos fichiers ici") }), jsxs("div", { className: "text-sm text-gray-600 space-y-1", children: [jsx("p", { children: t("jdi.document_upload.accepted_formats") }), jsx("p", { children: twoSidesRequired
|
|
435
457
|
? frontPreview
|