datakeen-session-react 1.1.140-dev.76 → 1.1.140-dev.78

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 (61) hide show
  1. package/dist/cjs/components/document-collection/DocumentCollection.js +1 -1
  2. package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
  3. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js +9 -1
  4. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js.map +1 -1
  5. package/dist/cjs/components/jdi/JDIDocumentUpload.js +1 -1
  6. package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +1 -1
  7. package/dist/cjs/components/nfc-scan/NfcScanNode.js +89 -0
  8. package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -0
  9. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js +40 -0
  10. package/dist/cjs/components/nfc-scan/NfcSuccessAnimation.js.map +1 -0
  11. package/dist/cjs/components/session/DocumentCheck.js +100 -35
  12. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  13. package/dist/cjs/components/template/TemplateNodeRenderer.js +1 -1
  14. package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
  15. package/dist/cjs/hooks/useNfcSseStatus.js +46 -0
  16. package/dist/cjs/hooks/useNfcSseStatus.js.map +1 -0
  17. package/dist/cjs/hooks/useUserInputForm.js +6 -1
  18. package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
  19. package/dist/cjs/i18n/en.json.js +10 -1
  20. package/dist/cjs/i18n/en.json.js.map +1 -1
  21. package/dist/cjs/i18n/fr.json.js +10 -1
  22. package/dist/cjs/i18n/fr.json.js.map +1 -1
  23. package/dist/cjs/index.css.js +1 -1
  24. package/dist/cjs/services/analysis.js +1 -5
  25. package/dist/cjs/services/analysis.js.map +1 -1
  26. package/dist/cjs/services/api.js +1 -0
  27. package/dist/cjs/services/api.js.map +1 -1
  28. package/dist/cjs/services/auditTrailService.js +73 -0
  29. package/dist/cjs/services/auditTrailService.js.map +1 -1
  30. package/dist/cjs/types/session.js.map +1 -1
  31. package/dist/esm/components/document-collection/DocumentCollection.js +1 -1
  32. package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
  33. package/dist/esm/components/document-collection/DocumentCollectionUpload.js +9 -1
  34. package/dist/esm/components/document-collection/DocumentCollectionUpload.js.map +1 -1
  35. package/dist/esm/components/jdi/JDIDocumentUpload.js +1 -1
  36. package/dist/esm/components/jdi/JDIDocumentUpload.js.map +1 -1
  37. package/dist/esm/components/nfc-scan/NfcScanNode.js +85 -0
  38. package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -0
  39. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js +36 -0
  40. package/dist/esm/components/nfc-scan/NfcSuccessAnimation.js.map +1 -0
  41. package/dist/esm/components/session/DocumentCheck.js +100 -35
  42. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  43. package/dist/esm/components/template/TemplateNodeRenderer.js +1 -1
  44. package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
  45. package/dist/esm/hooks/useNfcSseStatus.js +44 -0
  46. package/dist/esm/hooks/useNfcSseStatus.js.map +1 -0
  47. package/dist/esm/hooks/useUserInputForm.js +6 -1
  48. package/dist/esm/hooks/useUserInputForm.js.map +1 -1
  49. package/dist/esm/i18n/en.json.js +10 -2
  50. package/dist/esm/i18n/en.json.js.map +1 -1
  51. package/dist/esm/i18n/fr.json.js +10 -2
  52. package/dist/esm/i18n/fr.json.js.map +1 -1
  53. package/dist/esm/index.css.js +1 -1
  54. package/dist/esm/services/analysis.js +1 -5
  55. package/dist/esm/services/analysis.js.map +1 -1
  56. package/dist/esm/services/api.js +1 -1
  57. package/dist/esm/services/api.js.map +1 -1
  58. package/dist/esm/services/auditTrailService.js +67 -1
  59. package/dist/esm/services/auditTrailService.js.map +1 -1
  60. package/dist/esm/types/session.js.map +1 -1
  61. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"analysis.js","sources":["../../../../src/services/analysis.ts"],"sourcesContent":["import type { onUploadFiles } from \"../types/uploadFiles\";\nimport { dataURLtoFile, getMimeTypeFromDataURL } from \"./utils\";\nimport { mimeTypeToExtension } from \"../utils/mimeTypes\";\nimport { apiService } from \"./api\";\nimport type { SelfieCaptureData } from \"../types/selfie\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../types/documentVideo\";\nimport { getSessionMemoryUserInput } from \"./sessionMemoryStore\";\nimport {\n logDocumentUploaded,\n logSelfieCaptured,\n logAiControlled,\n logStatusModified,\n} from \"./auditTrailService\";\nimport { pollAnalysisStatus, stopPolling } from \"./pollingService\";\nimport type { PollingOptions } from \"./pollingService\";\n\n// Timeout configurations (in milliseconds)\nconst ANALYSIS_TIMEOUT = 600000; // 10 minutes for document analysis (increased for large files + ML processing)\nconst SELFIE_ANALYSIS_TIMEOUT = 600000; // 10 minutes for selfie analysis\nconst UPLOAD_TIMEOUT = 300000; // 5 minutes for file uploads\n\n// Map pour suivre les analyses en cours et éviter les doublons\nconst ongoingAnalyses = new Map<string, Promise<any>>();\n\nexport interface AnalyzeFilesOptions {\n personPhoto?: string | null;\n save?: boolean;\n incrementAnalysis?: boolean;\n forceUpload?: boolean;\n documentTypeKey?: string | null;\n requiresTwoSides?: boolean;\n enablePolling?: boolean; // Enable polling for analysis progress (default: true)\n pollingOptions?: PollingOptions; // Custom polling configuration\n collectOnly?: boolean; // Bypass AI verification — document is collected as-is\n}\n\ninterface LaunchAnalysisOptions extends AnalyzeFilesOptions {}\n\nfunction createFileName(fileURL: string, baseName: string = \"file\") {\n const mimeType = getMimeTypeFromDataURL(fileURL);\n if (!mimeType) {\n throw new Error(\"Unable to determine MIME type from file URL\");\n }\n\n const ext = mimeTypeToExtension(mimeType);\n const safeBase = baseName.replace(/\\.+$/, \"\");\n return ext ? `${safeBase}.${ext}` : safeBase;\n}\n\nfunction normalizeDocumentTypeKey(\n rawType?: string | null,\n fallback: string = \"document\",\n) {\n if (!rawType) {\n return fallback;\n }\n\n const trimmed = rawType.trim();\n if (!trimmed) {\n return fallback;\n }\n\n const withUnderscores = trimmed\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .replace(/[^a-zA-Z0-9_]/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return withUnderscores || fallback;\n}\n\n// Fonction pour créer une clé unique pour identifier une analyse\nfunction createAnalysisKey(\n sessionId: string,\n files: onUploadFiles,\n documentTypeId: string,\n): string {\n const frontHash = files.front ? files.front.substring(0, 50) : \"no-front\";\n const backHash = files.back ? files.back.substring(0, 50) : \"no-back\";\n return `${sessionId}-${documentTypeId}-${frontHash}-${backHash}`;\n}\n\nasync function launchAnalysis(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string | null,\n options: LaunchAnalysisOptions = {},\n) {\n if (!sessionId || !files) {\n throw new Error(\"Invalid parameters for analysis\");\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n collectOnly = false,\n } = options;\n\n const formData = new FormData();\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"save\", String(save));\n\n const userInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(userInput).length > 0) {\n const fullName = `${userInput.firstName || \"\"} ${\n userInput.lastName || \"\"\n }`.trim();\n formData.append(\"name\", fullName || \"Unknown\");\n\n formData.append(\"firstName\", userInput.firstName || \"\");\n formData.append(\"lastName\", userInput.lastName || \"\");\n formData.append(\"birthDate\", userInput.birthDate || \"\");\n formData.append(\"countryCode\", userInput.countryCode || \"\");\n }\n\n const fileTypes: Record<string, string> = {};\n const normalizedDocumentType = normalizeDocumentTypeKey(\n documentTypeKey ?? documentTypeId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof requiresTwoSides === \"boolean\"\n ? requiresTwoSides\n : Boolean(files.back);\n\n if (files.front) {\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const frontFileName = createFileName(files.front, frontBaseName);\n const frontFile = dataURLtoFile(files.front, frontFileName);\n formData.append(\"files\", frontFile, frontFileName);\n\n fileTypes[frontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n }\n\n if (files.back) {\n const backBaseName = `${normalizedDocumentType}_back`;\n const backFileName = createFileName(files.back, backBaseName);\n const backFile = dataURLtoFile(files.back, backFileName);\n formData.append(\"files\", backFile, backFileName);\n\n fileTypes[backFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"incrementAnalysis\", String(incrementAnalysis));\n formData.append(\"forceUpload\", String(forceUpload));\n\n if (documentTypeId) {\n formData.append(\"documentTemplateId\", documentTypeId);\n }\n\n if (personPhoto) {\n formData.append(\"personPhoto\", personPhoto);\n }\n\n if (collectOnly) {\n formData.append(\"collectOnly\", \"true\");\n }\n\n console.debug(\"FormData prepared for analysis:\", {\n sessionId,\n documentTypeId,\n files: Object.keys(fileTypes),\n save,\n incrementAnalysis,\n forceUpload,\n collectOnly,\n });\n return formData;\n}\n\nexport async function analyzeFiles(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string,\n options: AnalyzeFilesOptions = {},\n): Promise<any> {\n // Validate required parameters\n if (!sessionId) {\n throw new Error(\"Missing sessionId: A valid session ID is required.\");\n }\n if (!files || Object.keys(files).length === 0) {\n throw new Error(\n \"Missing files: At least one file must be provided for analysis.\",\n );\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n enablePolling = true,\n pollingOptions = {},\n collectOnly = false,\n } = options;\n\n // Pour les retry, on ne force pas l'upload mais on écrase l'analyse existante\n const isRetry = !incrementAnalysis && !forceUpload;\n\n // Créer une clé unique pour cette analyse\n const analysisKey = createAnalysisKey(sessionId, files, documentTypeId);\n\n // Vérifier si une analyse identique est déjà en cours\n if (ongoingAnalyses.has(analysisKey) && !isRetry) {\n return ongoingAnalyses.get(analysisKey);\n }\n\n // Helper function for retry logic with exponential backoff\n async function submitAnalysisWithRetry(\n formData: FormData,\n maxAttempts: number = 3,\n ) {\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const rawClient = apiService.getRawClient();\n\n const response = await rawClient.post(\n `/session/sdk/${sessionId}/analysis`,\n formData,\n {\n timeout: ANALYSIS_TIMEOUT,\n },\n );\n\n return response;\n } catch (error: any) {\n lastError = error;\n\n // Check if it's a network error (likely backend didn't respond in time)\n if (\n error.code === \"ERR_NETWORK\" ||\n error.message?.includes(\"CORS request did not succeed\")\n ) {\n console.warn(\n `⚠️ Network error on attempt ${attempt}: ${error.message}`,\n );\n\n if (attempt < maxAttempts) {\n // Exponential backoff: wait 2s, 4s, 8s...\n const waitTime = Math.pow(2, attempt) * 1000;\n console.log(`⏳ Retrying in ${waitTime / 1000}s...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n continue;\n }\n }\n\n // For other errors, don't retry\n throw error;\n }\n }\n\n throw lastError;\n }\n\n // Créer la promesse d'analyse et la stocker\n const analysisPromise = (async () => {\n try {\n const formData = await launchAnalysis(\n sessionId,\n nodeId,\n files,\n documentTypeId,\n {\n personPhoto,\n save,\n incrementAnalysis: isRetry ? false : incrementAnalysis,\n forceUpload: isRetry ? true : forceUpload,\n documentTypeKey,\n requiresTwoSides,\n collectOnly,\n },\n );\n\n await logDocumentUploaded(sessionId, {\n documentTypeId: documentTypeId || \"unknown\",\n hasFrontImage: !!files.front,\n hasBackImage: !!files.back,\n });\n\n // Submit with automatic retry on network errors\n const response = await submitAnalysisWithRetry(formData);\n\n // Wrap response to match ApiResponse type\n const wrappedResponse = {\n data: response.data,\n success: true,\n status: response.status,\n };\n\n await logAiControlled(\n sessionId,\n {\n analysisResult: response.data.status || \"unknown\",\n documentTypeId: documentTypeId || \"unknown\",\n },\n response.data.clientInfoId || undefined,\n );\n\n if (!wrappedResponse.success) {\n throw new Error(`Analysis failed: ${response.data}`);\n }\n\n // Start polling for analysis progress if enabled\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n };\n\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (analysis may still be processing):\",\n pollError,\n );\n // Don't throw - polling error shouldn't fail the analysis submission\n // The backend is still processing even if polling fails\n return response.data;\n }\n }\n\n return response.data;\n } catch (error) {\n console.error(\"❌ Analysis failed:\", error);\n // Stop any ongoing polling on error\n stopPolling();\n throw error;\n } finally {\n // Nettoyer la promesse de la map une fois terminée\n ongoingAnalyses.delete(analysisKey);\n }\n })();\n\n // Stocker la promesse pour éviter les appels simultanés\n ongoingAnalyses.set(analysisKey, analysisPromise);\n\n return analysisPromise;\n}\n\nexport async function analyzeSelfie(\n sessionId: string,\n selfieFile: SelfieCaptureData,\n selfiePhoto: string,\n): Promise<any> {\n console.log(\"🤳 Starting selfie analysis for session:\", sessionId);\n console.log(\"� File size:\", selfieFile.media.size, \"bytes\");\n\n const formData = new FormData();\n formData.append(\"file\", selfieFile.media, \"selfie.mp4\");\n formData.append(\"photo\", selfiePhoto);\n\n try {\n console.log(\"🚀 Sending selfie to UNISSEY API...\");\n\n const response = await apiService.post(\n `/session/unissey/${sessionId}/analyze`,\n formData,\n {\n timeout: SELFIE_ANALYSIS_TIMEOUT,\n },\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n // Si la réponse API indique un succès, traiter la réponse Unissey\n if (response.success && response.data) {\n console.log(\"🎉 Unissey analysis completed - checking results...\");\n\n // response.data contient directement la réponse Unissey avec status, message, data\n const unisseyResponse = response.data;\n\n // Vérifier si Unissey a répondu avec succès\n if (\n unisseyResponse.status === 200 &&\n (unisseyResponse.message === \"success\" ||\n unisseyResponse.message === \"ok\")\n ) {\n console.log(\"✅ Unissey returned success status\");\n\n // Utiliser les données réelles de la réponse Unissey\n const unisseyData = unisseyResponse.data;\n\n // Vérifier si la comparaison faciale a un niveau de confiance élevé\n const faceComparison = unisseyData.details?.face_comparison;\n const isHighConfidence = faceComparison?.confidence_level === \"high\";\n const isMatch =\n unisseyData.is_match && faceComparison?.result === \"match\";\n\n // is_genuine est basé sur la confiance élevée de la comparaison faciale\n const isGenuine = isHighConfidence && isMatch;\n\n // Log selfie captured in audit trail\n try {\n const analysisResponse = await apiService.get(\n `/session/sdk/${sessionId}`,\n );\n if (analysisResponse.data && analysisResponse.data.analysisId) {\n await logSelfieCaptured(\n sessionId,\n analysisResponse.data.clientInfoId || undefined,\n );\n\n // Log AI control with selfie analysis results\n await logAiControlled(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n\n await logStatusModified(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n }\n } catch (err) {\n console.error(\"Failed to log selfie capture in audit trail:\", err);\n // Non-blocking error - continue analysis\n }\n\n // Retourner la structure attendue par l'UI\n return {\n success: true,\n data: {\n ...unisseyData,\n is_genuine: isGenuine, // Basé sur confidence_level === \"high\"\n },\n };\n } else {\n console.error(\n \"❌ Unissey returned error status:\",\n unisseyResponse.status,\n unisseyResponse.message,\n );\n throw new Error(\n `Unissey analysis failed: ${\n unisseyResponse.message || \"Unknown Unissey error\"\n }`,\n );\n }\n }\n\n // Gestion des erreurs spécifiques API\n const errorMessage =\n response.data?.message || response.data || \"Unknown error\";\n console.error(\"❌ API call failed:\", errorMessage);\n throw new Error(`Face comparison analysis failed: ${errorMessage}`);\n } catch (error: any) {\n console.error(\"💥 Analysis error:\", error);\n\n // Améliorer le message d'erreur pour l'UI\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n } else if (error.message) {\n throw error; // Garder le message d'erreur original si déjà formaté\n } else {\n throw new Error(\n \"Face comparison analysis failed due to an unexpected error\",\n );\n }\n }\n}\n\nexport async function uploadConvertedIdCardImage(\n sessionId: string,\n file: File,\n): Promise<any> {\n if (!sessionId || !file) {\n throw new Error(\"Invalid parameters for uploading converted ID card image\");\n }\n\n // rename file to converted_id_card.png\n const renamedFile = new File([file], \"converted_id_card.png\", {\n type: file.type,\n });\n\n const formData = new FormData();\n formData.append(\"file\", renamedFile, renamedFile.name);\n\n try {\n console.log(\n `🚀 Uploading converted ID card image for session: ${sessionId}`,\n );\n const response = await apiService.post(\n `/session/sdk/${sessionId}/converted_id_card.png`,\n formData,\n {\n timeout: UPLOAD_TIMEOUT,\n },\n );\n console.log(\"✅ Upload response:\", response);\n return response.data;\n } catch (error) {\n console.error(\"❌ Upload error:\", error);\n throw new Error(\"Failed to upload converted ID card image\");\n }\n}\n\n/**\n * Analyzes a document video captured with Unissey DOC_VIDEO preset.\n * Sends the video file and thumbnail to the backend for document verification.\n *\n * @param sessionId - Unique identifier for the current session\n * @param nodeId - Identifier for the current node in the journey\n * @param videoData - Document video capture data containing media blob and metadata\n * @param thumbnail - Base64 thumbnail extracted from the video\n * @param documentTemplateId - Template ID for the document type being verified\n * @returns Analysis response from the backend\n */\nexport async function analyzeDocumentVideo(\n sessionId: string,\n nodeId: string,\n videoData: DocumentVideoCaptureBySide,\n previews: DocumentVideoPreviewBySide,\n documentTemplateId: string,\n options: {\n documentType?: string;\n requiresTwoSides?: boolean;\n enablePolling?: boolean;\n pollingOptions?: PollingOptions;\n } = {},\n): Promise<any> {\n if (!videoData.recto || !previews.recto) {\n throw new Error(\"Missing recto video or preview\");\n }\n\n const normalizedDocumentType = normalizeDocumentTypeKey(\n options.documentType ?? documentTemplateId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof options.requiresTwoSides === \"boolean\"\n ? options.requiresTwoSides\n : Boolean(videoData.verso || previews.verso);\n\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const backBaseName = `${normalizedDocumentType}_back`;\n\n const previewFrontFileName = `${frontBaseName}.jpg`;\n const previewFrontFile = dataURLtoFile(previews.recto, previewFrontFileName);\n const previewBackFileName = `${backBaseName}.jpg`;\n const previewBackFile = previews.verso\n ? dataURLtoFile(previews.verso, previewBackFileName)\n : null;\n\n const formData = new FormData();\n\n formData.append(\n \"videoFront\",\n videoData.recto.media,\n \"document_video_recto.mp4\",\n );\n if (videoData.verso) {\n formData.append(\n \"videoBack\",\n videoData.verso.media,\n \"document_video_verso.mp4\",\n );\n }\n\n formData.append(\"previewFront\", previewFrontFile, previewFrontFileName);\n if (previewBackFile) {\n formData.append(\"previewBack\", previewBackFile, previewBackFileName);\n }\n\n const fileTypes: Record<string, string> = {};\n fileTypes[previewFrontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n if (previewBackFile) {\n fileTypes[previewBackFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"documentTemplateId\", documentTemplateId);\n formData.append(\"documentType\", options.documentType || \"\");\n formData.append(\"requiresTwoSides\", String(appendSide));\n formData.append(\"save\", \"true\");\n\n const { enablePolling = true, pollingOptions = {} } = options;\n\n try {\n console.log(\"🚀 Sending document video to document-video API...\");\n const response = await apiService.post(\n `/session/sdk/${sessionId}/document-video`,\n formData,\n { timeout: ANALYSIS_TIMEOUT },\n );\n\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n defaultValue: {\n sessionId,\n status: \"processing\",\n progress: 50,\n currentStep: \"processing\",\n message: \"Document analysis in progress\",\n analysisId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n error: null,\n },\n };\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (document-video may still be processing):\",\n pollError,\n );\n }\n }\n\n if (response?.success || response?.data?.success) {\n return response.data ?? response;\n }\n\n const errorMessage = response?.data?.message || \"Unknown error\";\n throw new Error(`Document video analysis failed: ${errorMessage}`);\n } catch (error: any) {\n stopPolling();\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n }\n if (error.message) {\n throw error;\n }\n throw new Error(\n \"Document video analysis failed due to an unexpected error\",\n );\n }\n}\n"],"names":["getMimeTypeFromDataURL","mimeTypeToExtension","__awaiter","getSessionMemoryUserInput","dataURLtoFile","apiService","logDocumentUploaded","logAiControlled","__assign","pollAnalysisStatus","stopPolling","logSelfieCaptured","logStatusModified"],"mappings":"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"}
1
+ {"version":3,"file":"analysis.js","sources":["../../../../src/services/analysis.ts"],"sourcesContent":["import type { onUploadFiles } from \"../types/uploadFiles\";\nimport { dataURLtoFile, getMimeTypeFromDataURL } from \"./utils\";\nimport { mimeTypeToExtension } from \"../utils/mimeTypes\";\nimport { apiService } from \"./api\";\nimport type { SelfieCaptureData } from \"../types/selfie\";\nimport type {\n DocumentVideoCaptureBySide,\n DocumentVideoPreviewBySide,\n} from \"../types/documentVideo\";\nimport { getSessionMemoryUserInput } from \"./sessionMemoryStore\";\nimport {\n logDocumentUploaded,\n logSelfieCaptured,\n logAiControlled,\n logStatusModified,\n} from \"./auditTrailService\";\nimport { pollAnalysisStatus, stopPolling } from \"./pollingService\";\nimport type { PollingOptions } from \"./pollingService\";\n\n// Timeout configurations (in milliseconds)\nconst ANALYSIS_TIMEOUT = 600000; // 10 minutes for document analysis (increased for large files + ML processing)\nconst SELFIE_ANALYSIS_TIMEOUT = 600000; // 10 minutes for selfie analysis\nconst UPLOAD_TIMEOUT = 300000; // 5 minutes for file uploads\n\n// Map pour suivre les analyses en cours et éviter les doublons\nconst ongoingAnalyses = new Map<string, Promise<any>>();\n\nexport interface AnalyzeFilesOptions {\n personPhoto?: string | null;\n save?: boolean;\n incrementAnalysis?: boolean;\n forceUpload?: boolean;\n documentTypeKey?: string | null;\n requiresTwoSides?: boolean;\n enablePolling?: boolean; // Enable polling for analysis progress (default: true)\n pollingOptions?: PollingOptions; // Custom polling configuration\n collectOnly?: boolean; // Bypass AI verification — document is collected as-is\n}\n\ninterface LaunchAnalysisOptions extends AnalyzeFilesOptions {}\n\nfunction createFileName(fileURL: string, baseName: string = \"file\") {\n const mimeType = getMimeTypeFromDataURL(fileURL);\n if (!mimeType) {\n throw new Error(\"Unable to determine MIME type from file URL\");\n }\n\n const ext = mimeTypeToExtension(mimeType);\n const safeBase = baseName.replace(/\\.+$/, \"\");\n return ext ? `${safeBase}.${ext}` : safeBase;\n}\n\nfunction normalizeDocumentTypeKey(\n rawType?: string | null,\n fallback: string = \"document\",\n) {\n if (!rawType) {\n return fallback;\n }\n\n const trimmed = rawType.trim();\n if (!trimmed) {\n return fallback;\n }\n\n const withUnderscores = trimmed\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .replace(/[^a-zA-Z0-9_]/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .toLowerCase();\n\n return withUnderscores || fallback;\n}\n\n// Fonction pour créer une clé unique pour identifier une analyse\nfunction createAnalysisKey(\n sessionId: string,\n files: onUploadFiles,\n documentTypeId: string,\n): string {\n const frontHash = files.front ? files.front.substring(0, 50) : \"no-front\";\n const backHash = files.back ? files.back.substring(0, 50) : \"no-back\";\n return `${sessionId}-${documentTypeId}-${frontHash}-${backHash}`;\n}\n\nasync function launchAnalysis(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string | null,\n options: LaunchAnalysisOptions = {},\n) {\n if (!sessionId || !files) {\n throw new Error(\"Invalid parameters for analysis\");\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n collectOnly = false,\n } = options;\n\n const formData = new FormData();\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"save\", String(save));\n\n const userInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(userInput).length > 0) {\n const fullName = `${userInput.firstName || \"\"} ${\n userInput.lastName || \"\"\n }`.trim();\n formData.append(\"name\", fullName || \"Unknown\");\n\n formData.append(\"firstName\", userInput.firstName || \"\");\n formData.append(\"lastName\", userInput.lastName || \"\");\n formData.append(\"birthDate\", userInput.birthDate || \"\");\n formData.append(\"countryCode\", userInput.countryCode || \"\");\n }\n\n const fileTypes: Record<string, string> = {};\n const normalizedDocumentType = normalizeDocumentTypeKey(\n documentTypeKey ?? documentTypeId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof requiresTwoSides === \"boolean\"\n ? requiresTwoSides\n : Boolean(files.back);\n\n if (files.front) {\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const frontFileName = createFileName(files.front, frontBaseName);\n const frontFile = dataURLtoFile(files.front, frontFileName);\n formData.append(\"files\", frontFile, frontFileName);\n\n fileTypes[frontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n }\n\n if (files.back) {\n const backBaseName = `${normalizedDocumentType}_back`;\n const backFileName = createFileName(files.back, backBaseName);\n const backFile = dataURLtoFile(files.back, backFileName);\n formData.append(\"files\", backFile, backFileName);\n\n fileTypes[backFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"incrementAnalysis\", String(incrementAnalysis));\n formData.append(\"forceUpload\", String(forceUpload));\n\n if (documentTypeId) {\n formData.append(\"documentTemplateId\", documentTypeId);\n }\n\n if (personPhoto) {\n formData.append(\"personPhoto\", personPhoto);\n }\n\n if (collectOnly) {\n formData.append(\"collectOnly\", \"true\");\n }\n\n console.debug(\"FormData prepared for analysis:\", {\n sessionId,\n documentTypeId,\n files: Object.keys(fileTypes),\n save,\n incrementAnalysis,\n forceUpload,\n collectOnly,\n });\n return formData;\n}\n\nexport async function analyzeFiles(\n sessionId: string,\n nodeId: string,\n files: onUploadFiles,\n documentTypeId: string,\n options: AnalyzeFilesOptions = {},\n): Promise<any> {\n // Validate required parameters\n if (!sessionId) {\n throw new Error(\"Missing sessionId: A valid session ID is required.\");\n }\n if (!files || Object.keys(files).length === 0) {\n throw new Error(\n \"Missing files: At least one file must be provided for analysis.\",\n );\n }\n\n const {\n personPhoto = null,\n save = true,\n incrementAnalysis = true,\n forceUpload = false,\n documentTypeKey = null,\n requiresTwoSides,\n enablePolling = true,\n pollingOptions = {},\n collectOnly = false,\n } = options;\n\n // Pour les retry, on ne force pas l'upload mais on écrase l'analyse existante\n const isRetry = !incrementAnalysis && !forceUpload;\n\n // Créer une clé unique pour cette analyse\n const analysisKey = createAnalysisKey(sessionId, files, documentTypeId);\n\n // Vérifier si une analyse identique est déjà en cours\n if (ongoingAnalyses.has(analysisKey) && !isRetry) {\n return ongoingAnalyses.get(analysisKey);\n }\n\n // Helper function for retry logic with exponential backoff\n async function submitAnalysisWithRetry(\n formData: FormData,\n maxAttempts: number = 3,\n ) {\n let lastError: any;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const rawClient = apiService.getRawClient();\n\n const response = await rawClient.post(\n `/session/sdk/${sessionId}/analysis`,\n formData,\n {\n timeout: ANALYSIS_TIMEOUT,\n },\n );\n\n return response;\n } catch (error: any) {\n lastError = error;\n\n // Check if it's a network error (likely backend didn't respond in time)\n if (\n error.code === \"ERR_NETWORK\" ||\n error.message?.includes(\"CORS request did not succeed\")\n ) {\n console.warn(\n `⚠️ Network error on attempt ${attempt}: ${error.message}`,\n );\n\n if (attempt < maxAttempts) {\n // Exponential backoff: wait 2s, 4s, 8s...\n const waitTime = Math.pow(2, attempt) * 1000;\n console.log(`⏳ Retrying in ${waitTime / 1000}s...`);\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n continue;\n }\n }\n\n // For other errors, don't retry\n throw error;\n }\n }\n\n throw lastError;\n }\n\n // Créer la promesse d'analyse et la stocker\n const analysisPromise = (async () => {\n try {\n const formData = await launchAnalysis(\n sessionId,\n nodeId,\n files,\n documentTypeId,\n {\n personPhoto,\n save,\n incrementAnalysis: isRetry ? false : incrementAnalysis,\n forceUpload: isRetry ? true : forceUpload,\n documentTypeKey,\n requiresTwoSides,\n collectOnly,\n },\n );\n\n await logDocumentUploaded(sessionId, {\n documentTypeId: documentTypeId || \"unknown\",\n ...(documentTypeKey ? { documentTypeKey } : {}),\n hasFrontImage: !!files.front,\n hasBackImage: !!files.back,\n });\n\n // Submit with automatic retry on network errors\n const response = await submitAnalysisWithRetry(formData);\n\n // Wrap response to match ApiResponse type\n const wrappedResponse = {\n data: response.data,\n success: true,\n status: response.status,\n };\n\n await logAiControlled(\n sessionId,\n {\n analysisResult: response.data.status || \"unknown\",\n documentTypeId: documentTypeId || \"unknown\",\n },\n response.data.clientInfoId || undefined,\n );\n\n if (!wrappedResponse.success) {\n throw new Error(`Analysis failed: ${response.data}`);\n }\n\n // Start polling for analysis progress if enabled\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n };\n\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (analysis may still be processing):\",\n pollError,\n );\n // Don't throw - polling error shouldn't fail the analysis submission\n // The backend is still processing even if polling fails\n return response.data;\n }\n }\n\n return response.data;\n } catch (error) {\n console.error(\"❌ Analysis failed:\", error);\n // Stop any ongoing polling on error\n stopPolling();\n throw error;\n } finally {\n // Nettoyer la promesse de la map une fois terminée\n ongoingAnalyses.delete(analysisKey);\n }\n })();\n\n // Stocker la promesse pour éviter les appels simultanés\n ongoingAnalyses.set(analysisKey, analysisPromise);\n\n return analysisPromise;\n}\n\nexport async function analyzeSelfie(\n sessionId: string,\n selfieFile: SelfieCaptureData,\n selfiePhoto: string,\n): Promise<any> {\n console.log(\"🤳 Starting selfie analysis for session:\", sessionId);\n console.log(\"� File size:\", selfieFile.media.size, \"bytes\");\n\n const formData = new FormData();\n formData.append(\"file\", selfieFile.media, \"selfie.mp4\");\n formData.append(\"photo\", selfiePhoto);\n\n try {\n console.log(\"🚀 Sending selfie to UNISSEY API...\");\n\n const response = await apiService.post(\n `/session/unissey/${sessionId}/analyze`,\n formData,\n {\n timeout: SELFIE_ANALYSIS_TIMEOUT,\n },\n );\n\n console.log(\"✅ Analysis response:\", response);\n\n // Si la réponse API indique un succès, traiter la réponse Unissey\n if (response.success && response.data) {\n console.log(\"🎉 Unissey analysis completed - checking results...\");\n\n // response.data contient directement la réponse Unissey avec status, message, data\n const unisseyResponse = response.data;\n\n // Vérifier si Unissey a répondu avec succès\n if (\n unisseyResponse.status === 200 &&\n (unisseyResponse.message === \"success\" ||\n unisseyResponse.message === \"ok\")\n ) {\n console.log(\"✅ Unissey returned success status\");\n\n // Utiliser les données réelles de la réponse Unissey\n const unisseyData = unisseyResponse.data;\n\n // Vérifier si la comparaison faciale a un niveau de confiance élevé\n const faceComparison = unisseyData.details?.face_comparison;\n const isHighConfidence = faceComparison?.confidence_level === \"high\";\n const isMatch =\n unisseyData.is_match && faceComparison?.result === \"match\";\n\n // is_genuine est basé sur la confiance élevée de la comparaison faciale\n const isGenuine = isHighConfidence && isMatch;\n\n // Log selfie captured in audit trail\n try {\n const analysisResponse = await apiService.get(\n `/session/sdk/${sessionId}`,\n );\n if (analysisResponse.data && analysisResponse.data.analysisId) {\n await logSelfieCaptured(\n sessionId,\n analysisResponse.data.clientInfoId || undefined,\n );\n\n // Log AI control with selfie analysis results\n await logAiControlled(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n\n await logStatusModified(\n sessionId,\n {\n selfieAnalysisResult: isGenuine ? \"genuine\" : \"not_genuine\",\n isMatch: isMatch ? \"match\" : \"no_match\",\n confidenceLevel: faceComparison?.confidence_level || \"unknown\",\n },\n analysisResponse.data.clientInfoId || undefined,\n );\n }\n } catch (err) {\n console.error(\"Failed to log selfie capture in audit trail:\", err);\n // Non-blocking error - continue analysis\n }\n\n // Retourner la structure attendue par l'UI\n return {\n success: true,\n data: {\n ...unisseyData,\n is_genuine: isGenuine, // Basé sur confidence_level === \"high\"\n },\n };\n } else {\n console.error(\n \"❌ Unissey returned error status:\",\n unisseyResponse.status,\n unisseyResponse.message,\n );\n throw new Error(\n `Unissey analysis failed: ${\n unisseyResponse.message || \"Unknown Unissey error\"\n }`,\n );\n }\n }\n\n // Gestion des erreurs spécifiques API\n const errorMessage =\n response.data?.message || response.data || \"Unknown error\";\n console.error(\"❌ API call failed:\", errorMessage);\n throw new Error(`Face comparison analysis failed: ${errorMessage}`);\n } catch (error: any) {\n console.error(\"💥 Analysis error:\", error);\n\n // Améliorer le message d'erreur pour l'UI\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n } else if (error.message) {\n throw error; // Garder le message d'erreur original si déjà formaté\n } else {\n throw new Error(\n \"Face comparison analysis failed due to an unexpected error\",\n );\n }\n }\n}\n\nexport async function uploadConvertedIdCardImage(\n sessionId: string,\n file: File,\n): Promise<any> {\n if (!sessionId || !file) {\n throw new Error(\"Invalid parameters for uploading converted ID card image\");\n }\n\n // rename file to converted_id_card.png\n const renamedFile = new File([file], \"converted_id_card.png\", {\n type: file.type,\n });\n\n const formData = new FormData();\n formData.append(\"file\", renamedFile, renamedFile.name);\n\n try {\n console.log(\n `🚀 Uploading converted ID card image for session: ${sessionId}`,\n );\n const response = await apiService.post(\n `/session/sdk/${sessionId}/converted_id_card.png`,\n formData,\n {\n timeout: UPLOAD_TIMEOUT,\n },\n );\n console.log(\"✅ Upload response:\", response);\n return response.data;\n } catch (error) {\n console.error(\"❌ Upload error:\", error);\n throw new Error(\"Failed to upload converted ID card image\");\n }\n}\n\n/**\n * Analyzes a document video captured with Unissey DOC_VIDEO preset.\n * Sends the video file and thumbnail to the backend for document verification.\n *\n * @param sessionId - Unique identifier for the current session\n * @param nodeId - Identifier for the current node in the journey\n * @param videoData - Document video capture data containing media blob and metadata\n * @param thumbnail - Base64 thumbnail extracted from the video\n * @param documentTemplateId - Template ID for the document type being verified\n * @returns Analysis response from the backend\n */\nexport async function analyzeDocumentVideo(\n sessionId: string,\n nodeId: string,\n videoData: DocumentVideoCaptureBySide,\n previews: DocumentVideoPreviewBySide,\n documentTemplateId: string,\n options: {\n documentType?: string;\n requiresTwoSides?: boolean;\n enablePolling?: boolean;\n pollingOptions?: PollingOptions;\n } = {},\n): Promise<any> {\n if (!videoData.recto || !previews.recto) {\n throw new Error(\"Missing recto video or preview\");\n }\n\n const normalizedDocumentType = normalizeDocumentTypeKey(\n options.documentType ?? documentTemplateId ?? undefined,\n );\n const hyphenDocumentType = normalizedDocumentType.replace(/_/g, \"-\");\n const appendSide =\n typeof options.requiresTwoSides === \"boolean\"\n ? options.requiresTwoSides\n : Boolean(videoData.verso || previews.verso);\n\n const frontBaseName = appendSide\n ? `${normalizedDocumentType}_front`\n : normalizedDocumentType;\n const backBaseName = `${normalizedDocumentType}_back`;\n\n const previewFrontFileName = `${frontBaseName}.jpg`;\n const previewFrontFile = dataURLtoFile(previews.recto, previewFrontFileName);\n const previewBackFileName = `${backBaseName}.jpg`;\n const previewBackFile = previews.verso\n ? dataURLtoFile(previews.verso, previewBackFileName)\n : null;\n\n const formData = new FormData();\n\n formData.append(\n \"videoFront\",\n videoData.recto.media,\n \"document_video_recto.mp4\",\n );\n if (videoData.verso) {\n formData.append(\n \"videoBack\",\n videoData.verso.media,\n \"document_video_verso.mp4\",\n );\n }\n\n formData.append(\"previewFront\", previewFrontFile, previewFrontFileName);\n if (previewBackFile) {\n formData.append(\"previewBack\", previewBackFile, previewBackFileName);\n }\n\n const fileTypes: Record<string, string> = {};\n fileTypes[previewFrontFileName] = appendSide\n ? `${hyphenDocumentType}-front`\n : hyphenDocumentType;\n if (previewBackFile) {\n fileTypes[previewBackFileName] = `${hyphenDocumentType}-back`;\n }\n\n formData.append(\"fileTypes\", JSON.stringify(fileTypes));\n formData.append(\"sessionId\", sessionId);\n formData.append(\"nodeId\", nodeId);\n formData.append(\"documentTemplateId\", documentTemplateId);\n formData.append(\"documentType\", options.documentType || \"\");\n formData.append(\"requiresTwoSides\", String(appendSide));\n formData.append(\"save\", \"true\");\n\n const { enablePolling = true, pollingOptions = {} } = options;\n\n try {\n console.log(\"🚀 Sending document video to document-video API...\");\n const response = await apiService.post(\n `/session/sdk/${sessionId}/document-video`,\n formData,\n { timeout: ANALYSIS_TIMEOUT },\n );\n\n if (enablePolling) {\n try {\n const pollConfig: PollingOptions = {\n ...pollingOptions,\n defaultValue: {\n sessionId,\n status: \"processing\",\n progress: 50,\n currentStep: \"processing\",\n message: \"Document analysis in progress\",\n analysisId: null,\n startedAt: new Date().toISOString(),\n completedAt: null,\n error: null,\n },\n };\n const pollingResult = await pollAnalysisStatus(sessionId, pollConfig);\n return pollingResult;\n } catch (pollError) {\n console.warn(\n \"⚠️ Polling error (document-video may still be processing):\",\n pollError,\n );\n }\n }\n\n if (response?.success || response?.data?.success) {\n return response.data ?? response;\n }\n\n const errorMessage = response?.data?.message || \"Unknown error\";\n throw new Error(`Document video analysis failed: ${errorMessage}`);\n } catch (error: any) {\n stopPolling();\n if (error.response?.data?.message) {\n throw new Error(`Analysis failed: ${error.response.data.message}`);\n }\n if (error.message) {\n throw error;\n }\n throw new Error(\n \"Document video analysis failed due to an unexpected error\",\n );\n }\n}\n"],"names":["getMimeTypeFromDataURL","mimeTypeToExtension","__awaiter","getSessionMemoryUserInput","dataURLtoFile","apiService","logDocumentUploaded","logAiControlled","__assign","pollAnalysisStatus","stopPolling","logSelfieCaptured","logStatusModified"],"mappings":"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"}
@@ -267,5 +267,6 @@ exports.ApiService = ApiService;
267
267
  exports.apiService = apiService;
268
268
  exports.configureApiBaseURL = configureApiBaseURL;
269
269
  exports.createApiService = createApiService;
270
+ exports.getBaseURL = getBaseURL;
270
271
  exports.normalizeBaseURL = normalizeBaseURL;
271
272
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../../../src/services/api.ts"],"sourcesContent":["import axios, { AxiosError } from \"axios\";\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n AxiosRequestConfig,\n} from \"axios\";\nimport { API_BASE_URL } from \"../config/env\";\n\n// Types pour window global\ndeclare global {\n interface Window {\n VITE_API_BASE_URL?: string;\n }\n}\n\n// Helpers\nconst normalizeBaseURL = (url: string | undefined | null): string => {\n const DEFAULT_BASE_URL = \"https://dev2.datakeen.co/backend\";\n if (!url) {\n return DEFAULT_BASE_URL;\n }\n\n const trimmed = url.trim();\n if (!trimmed) {\n return DEFAULT_BASE_URL;\n }\n\n try {\n const parsed = new URL(trimmed);\n const cleanedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const hasBackendSegment = /\\/backend(\\/|$)/.test(cleanedPath);\n const normalizedPath = hasBackendSegment\n ? cleanedPath.replace(/\\/backend(\\/*.*)?$/, \"/backend\")\n : `${cleanedPath}/backend`;\n\n const finalPath = normalizedPath.startsWith(\"/\")\n ? normalizedPath\n : `/${normalizedPath}`;\n\n const normalized = `${parsed.origin}${finalPath}`.replace(/\\/+$/, \"\");\n return normalized;\n } catch {\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, \"\");\n if (/\\/backend(\\/|$)/.test(withoutTrailingSlash)) {\n return withoutTrailingSlash.replace(/\\/backend(\\/*.*)?$/, \"/backend\");\n }\n return `${withoutTrailingSlash}/backend`;\n }\n};\n\n// Configuration globale pour l'URL de base\nlet globalBaseURL: string | null = null;\n\n// Fonction pour définir l'URL de base globalement\nexport const configureApiBaseURL = (baseURL: string): void => {\n const normalizedBaseURL = normalizeBaseURL(baseURL);\n globalBaseURL = normalizedBaseURL;\n // Mettre à jour l'instance existante si elle existe\n if (apiService) {\n apiService.updateBaseURL(normalizedBaseURL);\n }\n};\n\n// Fonction pour récupérer l'URL de base dynamiquement\nconst getBaseURL = (): string => {\n // Priorité 1: URL configurée dynamiquement\n if (globalBaseURL) {\n return globalBaseURL;\n }\n\n // Priorité 2: Variable d'environnement du projet hôte (si disponible via window)\n if (typeof window !== \"undefined\" && window.VITE_API_BASE_URL) {\n return normalizeBaseURL(window.VITE_API_BASE_URL);\n }\n\n // Priorité 3: Variable d'environnement du SDK via wrapper\n if (API_BASE_URL) {\n return normalizeBaseURL(API_BASE_URL);\n }\n\n // Priorité 4: URL par défaut (dev2 pour développement)\n return normalizeBaseURL(\"https://dev2.datakeen.co/backend\");\n};\n\n// Types pour la configuration de l'API\nexport interface ApiConfig {\n baseURL: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Types pour les réponses\nexport interface ApiResponse<T = any> {\n data: T;\n message?: string;\n success: boolean;\n status: number;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\nexport class ApiService {\n private client: AxiosInstance;\n private config: ApiConfig;\n\n constructor(config: ApiConfig) {\n this.config = config;\n\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 30000,\n headers: {\n Accept: \"application/json\",\n ...config.headers,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Intercepteur de requête\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n return config;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n\n // Intercepteur de réponse pour gérer les erreurs\n this.client.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n }\n\n private handleError(error: AxiosError): ApiError {\n let apiError: ApiError = {\n message: \"Une erreur inattendue s'est produite\",\n status: 500,\n };\n\n if (error.response) {\n // Erreur de réponse du serveur\n const { status, data } = error.response;\n apiError = {\n message: (data as any)?.message || `Erreur ${status}`,\n status,\n code: (data as any)?.code,\n details: data,\n };\n } else if (error.code === \"ECONNABORTED\") {\n // Timeout\n apiError = {\n message: \"Délai d'attente dépassé\",\n code: \"TIMEOUT_ERROR\",\n };\n } else if (error.request) {\n // Erreur réseau - Log plus de détails pour debug\n console.error(\"❌ Network error details:\", {\n message: error.message,\n code: error.code,\n config: {\n url: error.config?.url,\n method: error.config?.method,\n baseURL: error.config?.baseURL,\n timeout: error.config?.timeout,\n },\n });\n \n // Vérifier si c'est une erreur CORS\n if (error.message.includes(\"Network Error\") || error.message.includes(\"CORS\")) {\n apiError = {\n message: \"Erreur CORS ou serveur inaccessible. Vérifiez que le serveur backend est démarré et autorise les requêtes depuis votre domaine.\",\n code: \"CORS_OR_NETWORK_ERROR\",\n };\n } else {\n apiError = {\n message: \"Erreur de connexion réseau\",\n code: \"NETWORK_ERROR\",\n };\n }\n }\n\n console.error(\"❌ API Error:\", apiError);\n return apiError;\n }\n\n // Plus de retryRequest, shouldRetry, ni delay : chaque appel Axios ne sera fait qu'une seule fois\n\n // Méthodes publiques pour les requêtes HTTP\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.get<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.post<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.put<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.patch<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.delete<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n // Méthodes utilitaires\n setDefaultHeader(key: string, value: string): void {\n this.client.defaults.headers.common[key] = value;\n }\n\n removeDefaultHeader(key: string): void {\n delete this.client.defaults.headers.common[key];\n }\n\n // Méthode pour créer une nouvelle instance avec une configuration différente\n createInstance(config: Partial<ApiConfig>): ApiService {\n return new ApiService({ ...this.config, ...config });\n }\n\n // Accès à l'instance Axios pour des cas spéciaux\n getRawClient(): AxiosInstance {\n return this.client;\n }\n\n // Méthode pour mettre à jour dynamiquement l'URL de base\n updateBaseURL(baseURL: string): void {\n this.config.baseURL = baseURL;\n this.client.defaults.baseURL = baseURL;\n }\n}\n\n// In test environment, mock axios to avoid real HTTP requests\nif (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.NODE_ENV === \"test\"\n) {\n // @ts-ignore\n global.axios = {\n create: () => ({\n get: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n post: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n put: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n patch: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n delete: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n defaults: { headers: { common: {} } },\n interceptors: {\n request: { use: jest.fn() },\n response: { use: jest.fn() },\n },\n }),\n };\n}\n\n// Factory pour créer une instance\nexport const createApiService = (config: ApiConfig): ApiService => {\n return new ApiService(config);\n};\n\n// Instance par défaut (à configurer selon vos besoins)\nexport const apiService = createApiService({\n baseURL: getBaseURL(),\n timeout: 30000,\n});\n\nexport { normalizeBaseURL };\n"],"names":["API_BASE_URL","__assign"],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sources":["../../../../src/services/api.ts"],"sourcesContent":["import axios, { AxiosError } from \"axios\";\nimport type {\n AxiosInstance,\n AxiosResponse,\n InternalAxiosRequestConfig,\n AxiosRequestConfig,\n} from \"axios\";\nimport { API_BASE_URL } from \"../config/env\";\n\n// Types pour window global\ndeclare global {\n interface Window {\n VITE_API_BASE_URL?: string;\n }\n}\n\n// Helpers\nconst normalizeBaseURL = (url: string | undefined | null): string => {\n const DEFAULT_BASE_URL = \"https://dev2.datakeen.co/backend\";\n if (!url) {\n return DEFAULT_BASE_URL;\n }\n\n const trimmed = url.trim();\n if (!trimmed) {\n return DEFAULT_BASE_URL;\n }\n\n try {\n const parsed = new URL(trimmed);\n const cleanedPath = parsed.pathname.replace(/\\/+$/, \"\");\n const hasBackendSegment = /\\/backend(\\/|$)/.test(cleanedPath);\n const normalizedPath = hasBackendSegment\n ? cleanedPath.replace(/\\/backend(\\/*.*)?$/, \"/backend\")\n : `${cleanedPath}/backend`;\n\n const finalPath = normalizedPath.startsWith(\"/\")\n ? normalizedPath\n : `/${normalizedPath}`;\n\n const normalized = `${parsed.origin}${finalPath}`.replace(/\\/+$/, \"\");\n return normalized;\n } catch {\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, \"\");\n if (/\\/backend(\\/|$)/.test(withoutTrailingSlash)) {\n return withoutTrailingSlash.replace(/\\/backend(\\/*.*)?$/, \"/backend\");\n }\n return `${withoutTrailingSlash}/backend`;\n }\n};\n\n// Configuration globale pour l'URL de base\nlet globalBaseURL: string | null = null;\n\n// Fonction pour définir l'URL de base globalement\nexport const configureApiBaseURL = (baseURL: string): void => {\n const normalizedBaseURL = normalizeBaseURL(baseURL);\n globalBaseURL = normalizedBaseURL;\n // Mettre à jour l'instance existante si elle existe\n if (apiService) {\n apiService.updateBaseURL(normalizedBaseURL);\n }\n};\n\n// Fonction pour récupérer l'URL de base dynamiquement\nexport const getBaseURL = (): string => {\n // Priorité 1: URL configurée dynamiquement\n if (globalBaseURL) {\n return globalBaseURL;\n }\n\n // Priorité 2: Variable d'environnement du projet hôte (si disponible via window)\n if (typeof window !== \"undefined\" && window.VITE_API_BASE_URL) {\n return normalizeBaseURL(window.VITE_API_BASE_URL);\n }\n\n // Priorité 3: Variable d'environnement du SDK via wrapper\n if (API_BASE_URL) {\n return normalizeBaseURL(API_BASE_URL);\n }\n\n // Priorité 4: URL par défaut (dev2 pour développement)\n return normalizeBaseURL(\"https://dev2.datakeen.co/backend\");\n};\n\n// Types pour la configuration de l'API\nexport interface ApiConfig {\n baseURL: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n headers?: Record<string, string>;\n}\n\n// Types pour les réponses\nexport interface ApiResponse<T = any> {\n data: T;\n message?: string;\n success: boolean;\n status: number;\n}\n\nexport interface ApiError {\n message: string;\n status?: number;\n code?: string;\n details?: any;\n}\n\nexport class ApiService {\n private client: AxiosInstance;\n private config: ApiConfig;\n\n constructor(config: ApiConfig) {\n this.config = config;\n\n this.client = axios.create({\n baseURL: config.baseURL,\n timeout: config.timeout || 30000,\n headers: {\n Accept: \"application/json\",\n ...config.headers,\n },\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors(): void {\n // Intercepteur de requête\n this.client.interceptors.request.use(\n (config: InternalAxiosRequestConfig) => {\n return config;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n\n // Intercepteur de réponse pour gérer les erreurs\n this.client.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n (error: AxiosError) => {\n return Promise.reject(this.handleError(error));\n }\n );\n }\n\n private handleError(error: AxiosError): ApiError {\n let apiError: ApiError = {\n message: \"Une erreur inattendue s'est produite\",\n status: 500,\n };\n\n if (error.response) {\n // Erreur de réponse du serveur\n const { status, data } = error.response;\n apiError = {\n message: (data as any)?.message || `Erreur ${status}`,\n status,\n code: (data as any)?.code,\n details: data,\n };\n } else if (error.code === \"ECONNABORTED\") {\n // Timeout\n apiError = {\n message: \"Délai d'attente dépassé\",\n code: \"TIMEOUT_ERROR\",\n };\n } else if (error.request) {\n // Erreur réseau - Log plus de détails pour debug\n console.error(\"❌ Network error details:\", {\n message: error.message,\n code: error.code,\n config: {\n url: error.config?.url,\n method: error.config?.method,\n baseURL: error.config?.baseURL,\n timeout: error.config?.timeout,\n },\n });\n \n // Vérifier si c'est une erreur CORS\n if (error.message.includes(\"Network Error\") || error.message.includes(\"CORS\")) {\n apiError = {\n message: \"Erreur CORS ou serveur inaccessible. Vérifiez que le serveur backend est démarré et autorise les requêtes depuis votre domaine.\",\n code: \"CORS_OR_NETWORK_ERROR\",\n };\n } else {\n apiError = {\n message: \"Erreur de connexion réseau\",\n code: \"NETWORK_ERROR\",\n };\n }\n }\n\n console.error(\"❌ API Error:\", apiError);\n return apiError;\n }\n\n // Plus de retryRequest, shouldRetry, ni delay : chaque appel Axios ne sera fait qu'une seule fois\n\n // Méthodes publiques pour les requêtes HTTP\n async get<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.get<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.post<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.put<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.patch<T>(url, data, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n async delete<T = any>(\n url: string,\n config?: AxiosRequestConfig\n ): Promise<ApiResponse<T>> {\n const response = await this.client.delete<T>(url, config);\n return {\n data: response.data,\n success: true,\n status: response.status,\n };\n }\n\n // Méthodes utilitaires\n setDefaultHeader(key: string, value: string): void {\n this.client.defaults.headers.common[key] = value;\n }\n\n removeDefaultHeader(key: string): void {\n delete this.client.defaults.headers.common[key];\n }\n\n // Méthode pour créer une nouvelle instance avec une configuration différente\n createInstance(config: Partial<ApiConfig>): ApiService {\n return new ApiService({ ...this.config, ...config });\n }\n\n // Accès à l'instance Axios pour des cas spéciaux\n getRawClient(): AxiosInstance {\n return this.client;\n }\n\n // Méthode pour mettre à jour dynamiquement l'URL de base\n updateBaseURL(baseURL: string): void {\n this.config.baseURL = baseURL;\n this.client.defaults.baseURL = baseURL;\n }\n}\n\n// In test environment, mock axios to avoid real HTTP requests\nif (\n typeof process !== \"undefined\" &&\n process.env &&\n process.env.NODE_ENV === \"test\"\n) {\n // @ts-ignore\n global.axios = {\n create: () => ({\n get: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n post: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n put: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n patch: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n delete: jest.fn(() =>\n Promise.resolve({ data: {}, status: 200, success: true })\n ),\n defaults: { headers: { common: {} } },\n interceptors: {\n request: { use: jest.fn() },\n response: { use: jest.fn() },\n },\n }),\n };\n}\n\n// Factory pour créer une instance\nexport const createApiService = (config: ApiConfig): ApiService => {\n return new ApiService(config);\n};\n\n// Instance par défaut (à configurer selon vos besoins)\nexport const apiService = createApiService({\n baseURL: getBaseURL(),\n timeout: 30000,\n});\n\nexport { normalizeBaseURL };\n"],"names":["API_BASE_URL","__assign"],"mappings":"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"}
@@ -20,11 +20,20 @@ exports.AuditTrailEventType = void 0;
20
20
  AuditTrailEventType["AI_CONTROLED"] = "AI_CONTROLED";
21
21
  AuditTrailEventType["SESSION_STARTED"] = "SESSION_STARTED";
22
22
  AuditTrailEventType["SESSION_ENDED"] = "SESSION_ENDED";
23
+ AuditTrailEventType["SESSION_ABANDONED"] = "SESSION_ABANDONED";
23
24
  AuditTrailEventType["DOCUMENT_UPLOADED"] = "DOCUMENT_UPLOADED";
24
25
  AuditTrailEventType["SELFIE_CAPTURED"] = "SELFIE_CAPTURED";
25
26
  AuditTrailEventType["FORM_SENDED_LINK"] = "FORM_SENDED_LINK";
26
27
  AuditTrailEventType["SIGNATURE_DOCUMENT_OPENED"] = "SIGNATURE_DOCUMENT_OPENED";
27
28
  AuditTrailEventType["DOCUMENT_SIGNED"] = "DOCUMENT_SIGNED";
29
+ AuditTrailEventType["FORM_VALIDATED"] = "FORM_VALIDATED";
30
+ AuditTrailEventType["DOCUMENT_TYPE_SELECTED"] = "DOCUMENT_TYPE_SELECTED";
31
+ AuditTrailEventType["CAPTURE_MODE_SELECTED"] = "CAPTURE_MODE_SELECTED";
32
+ AuditTrailEventType["PHOTO_CAPTURED"] = "PHOTO_CAPTURED";
33
+ AuditTrailEventType["PHOTOS_VALIDATED"] = "PHOTOS_VALIDATED";
34
+ AuditTrailEventType["DOCUMENT_LOADED"] = "DOCUMENT_LOADED";
35
+ AuditTrailEventType["DOCUMENTS_VALIDATED"] = "DOCUMENTS_VALIDATED";
36
+ AuditTrailEventType["VERIFICATION_COMPLETED"] = "VERIFICATION_COMPLETED";
28
37
  })(exports.AuditTrailEventType || (exports.AuditTrailEventType = {}));
29
38
  /**
30
39
  * Creates an audit trail entry and associates it with an analysis
@@ -188,11 +197,75 @@ var logDocumentSigned = function (analysisId, signatureInfo, clientInfoId) { ret
188
197
  })];
189
198
  });
190
199
  }); };
200
+ // ─── APP3-1763 — Nouveaux events de parcours ─────────────────────────────────
201
+ // Convention : sessionId est passé dans le champ analysisId (backend route via toSession:true).
202
+ // Tous les appels sont fire-and-forget — les callers ne doivent PAS await ces fonctions.
203
+ var logFormValidated = function (sessionId, userInputs, clientInfoId) {
204
+ createAuditTrailEntry({
205
+ eventType: exports.AuditTrailEventType.FORM_VALIDATED,
206
+ analysisId: sessionId,
207
+ userInputs: {},
208
+ clientInfoId: clientInfoId,
209
+ }).catch(function () { });
210
+ };
211
+ var logDocumentTypeSelected = function (sessionId, documentType, documentLabel, clientInfoId) {
212
+ createAuditTrailEntry({
213
+ eventType: exports.AuditTrailEventType.DOCUMENT_TYPE_SELECTED,
214
+ analysisId: sessionId,
215
+ metadata: { documentType: documentType, documentLabel: documentLabel !== null && documentLabel !== void 0 ? documentLabel : documentType },
216
+ clientInfoId: clientInfoId,
217
+ }).catch(function () { });
218
+ };
219
+ var logCaptureModeSelected = function (sessionId, captureMode, clientInfoId) {
220
+ createAuditTrailEntry({
221
+ eventType: exports.AuditTrailEventType.CAPTURE_MODE_SELECTED,
222
+ analysisId: sessionId,
223
+ metadata: { captureMode: captureMode },
224
+ clientInfoId: clientInfoId,
225
+ }).catch(function () { });
226
+ };
227
+ var logPhotoCaptured = function (sessionId, side, clientInfoId) {
228
+ createAuditTrailEntry({
229
+ eventType: exports.AuditTrailEventType.PHOTO_CAPTURED,
230
+ analysisId: sessionId,
231
+ metadata: { side: side },
232
+ clientInfoId: clientInfoId,
233
+ }).catch(function () { });
234
+ };
235
+ var logPhotosValidated = function (sessionId, clientInfoId) {
236
+ createAuditTrailEntry({
237
+ eventType: exports.AuditTrailEventType.PHOTOS_VALIDATED,
238
+ analysisId: sessionId,
239
+ clientInfoId: clientInfoId,
240
+ }).catch(function () { });
241
+ };
242
+ var logDocumentLoaded = function (sessionId, side, documentType, clientInfoId) {
243
+ createAuditTrailEntry({
244
+ eventType: exports.AuditTrailEventType.DOCUMENT_LOADED,
245
+ analysisId: sessionId,
246
+ metadata: tslib_es6.__assign({ side: side }, ({})),
247
+ clientInfoId: clientInfoId,
248
+ }).catch(function () { });
249
+ };
250
+ var logDocumentsValidated = function (sessionId, clientInfoId) {
251
+ createAuditTrailEntry({
252
+ eventType: exports.AuditTrailEventType.DOCUMENTS_VALIDATED,
253
+ analysisId: sessionId,
254
+ clientInfoId: clientInfoId,
255
+ }).catch(function () { });
256
+ };
191
257
 
192
258
  exports.createAuditTrailEntry = createAuditTrailEntry;
193
259
  exports.logAiControlled = logAiControlled;
260
+ exports.logCaptureModeSelected = logCaptureModeSelected;
261
+ exports.logDocumentLoaded = logDocumentLoaded;
194
262
  exports.logDocumentSigned = logDocumentSigned;
263
+ exports.logDocumentTypeSelected = logDocumentTypeSelected;
195
264
  exports.logDocumentUploaded = logDocumentUploaded;
265
+ exports.logDocumentsValidated = logDocumentsValidated;
266
+ exports.logFormValidated = logFormValidated;
267
+ exports.logPhotoCaptured = logPhotoCaptured;
268
+ exports.logPhotosValidated = logPhotosValidated;
196
269
  exports.logSelfieCaptured = logSelfieCaptured;
197
270
  exports.logSessionEnded = logSessionEnded;
198
271
  exports.logSessionStarted = logSessionStarted;
@@ -1 +1 @@
1
- {"version":3,"file":"auditTrailService.js","sources":["../../../../src/services/auditTrailService.ts"],"sourcesContent":["/**\n * Audit Trail Service\n *\n * Service for interacting with the Datakeen Audit Trail API.\n * Handles creating and retrieving audit trail entries.\n */\n\nimport { apiService } from \"./api\";\nimport { fetchSessionById } from \"./sessionService\";\n\n/**\n * Event types for audit trail entries.\n * These must match the backend AuditTrailEventType enum.\n */\nexport enum AuditTrailEventType {\n STATUS_MODIFIED = \"STATUS_MODIFIED\",\n INFORMATION_MODIFIED = \"INFORMATION_MODIFIED\",\n AI_CONTROLED = \"AI_CONTROLED\",\n SESSION_STARTED = \"SESSION_STARTED\",\n SESSION_ENDED = \"SESSION_ENDED\",\n DOCUMENT_UPLOADED = \"DOCUMENT_UPLOADED\",\n SELFIE_CAPTURED = \"SELFIE_CAPTURED\",\n FORM_SENDED_LINK = \"FORM_SENDED_LINK\",\n SIGNATURE_DOCUMENT_OPENED = \"SIGNATURE_DOCUMENT_OPENED\",\n DOCUMENT_SIGNED = \"DOCUMENT_SIGNED\",\n}\n\n/**\n * Interface for audit trail entry creation request data\n */\nexport interface CreateAuditTrailRequest {\n eventType: AuditTrailEventType;\n analysisId: string;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n clientInfoId?: string;\n userId?: string;\n}\n\n/**\n * Interface for audit trail entry response data\n */\nexport interface AuditTrailEntry {\n id: string;\n eventType: AuditTrailEventType;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n analysisId: string;\n clientInfoId?: string;\n userId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Creates an audit trail entry and associates it with an analysis\n *\n * @param auditTrailData - The audit trail data to create\n * @returns The created audit trail entry\n */\nexport const createAuditTrailEntry = async (\n auditTrailData: CreateAuditTrailRequest\n): Promise<AuditTrailEntry> => {\n try {\n const payload = {\n ...auditTrailData,\n toSession: true,\n };\n const response = await apiService.post(\n \"/session/audit-trail\",\n payload\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific analysis\n *\n * @param analysisId - The ID of the analysis\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsByAnalysisId = async (\n analysisId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/analysis/${analysisId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific session\n *\n * @param sessionId - The ID of the session\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsBySessionId = async (\n sessionId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/session/${sessionId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Creates an audit trail entry when a session is started\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionStarted = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_STARTED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session is ended\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionEnded = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_ENDED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is uploaded\n *\n * @param analysisId - The ID of the analysis\n * @param documentName - The name or details of the document\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentUploaded = async (\n analysisId: string,\n documentName: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_UPLOADED,\n analysisId,\n documentsName: documentName,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a selfie is captured\n *\n * @param analysisId - The ID of the analysis\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSelfieCaptured = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SELFIE_CAPTURED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when user information is modified\n *\n * @param analysisId - The ID of the analysis\n * @param userInputs - The user inputs that were modified\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logInformationModified = async (\n analysisId: string,\n userInputs: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.INFORMATION_MODIFIED,\n analysisId,\n userInputs,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session status is modified\n *\n * @param analysisId - The ID of the analysis\n * @param status - The new status value\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logStatusModified = async (\n analysisId: string,\n status: any,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.STATUS_MODIFIED,\n analysisId,\n userInputs: { status },\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when an AI control is performed\n *\n * @param analysisId - The ID of the analysis\n * @param aiResults - The results of the AI control\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logAiControlled = async (\n analysisId: string,\n aiResults: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.AI_CONTROLED,\n analysisId,\n userInputs: aiResults,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a form link is sent\n *\n * @param analysisId - The ID of the analysis\n * @param recipientInfo - Information about the link recipient\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logFormSendedLink = async (\n analysisId: string,\n recipientInfo: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_SENDED_LINK,\n analysisId,\n userInputs: recipientInfo,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a signature document is opened\n *\n * @param analysisId - The ID of the analysis\n * @param documentInfo - Information about the document being signed\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSignatureDocumentOpened = async (\n analysisId: string,\n documentInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SIGNATURE_DOCUMENT_OPENED,\n analysisId,\n userInputs: documentInfo || {},\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is signed\n *\n * @param analysisId - The ID of the analysis\n * @param signatureInfo - Information about the signature\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentSigned = async (\n analysisId: string,\n signatureInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_SIGNED,\n analysisId,\n userInputs: signatureInfo || {},\n clientInfoId,\n });\n};\n"],"names":["AuditTrailEventType","__awaiter","apiService"],"mappings":"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"}
1
+ {"version":3,"file":"auditTrailService.js","sources":["../../../../src/services/auditTrailService.ts"],"sourcesContent":["/**\n * Audit Trail Service\n *\n * Service for interacting with the Datakeen Audit Trail API.\n * Handles creating and retrieving audit trail entries.\n */\n\nimport { apiService } from \"./api\";\nimport { fetchSessionById } from \"./sessionService\";\n\n/**\n * Event types for audit trail entries.\n * These must match the backend AuditTrailEventType enum.\n */\nexport enum AuditTrailEventType {\n STATUS_MODIFIED = \"STATUS_MODIFIED\",\n INFORMATION_MODIFIED = \"INFORMATION_MODIFIED\",\n AI_CONTROLED = \"AI_CONTROLED\",\n SESSION_STARTED = \"SESSION_STARTED\",\n SESSION_ENDED = \"SESSION_ENDED\",\n SESSION_ABANDONED = \"SESSION_ABANDONED\",\n DOCUMENT_UPLOADED = \"DOCUMENT_UPLOADED\",\n SELFIE_CAPTURED = \"SELFIE_CAPTURED\",\n FORM_SENDED_LINK = \"FORM_SENDED_LINK\",\n SIGNATURE_DOCUMENT_OPENED = \"SIGNATURE_DOCUMENT_OPENED\",\n DOCUMENT_SIGNED = \"DOCUMENT_SIGNED\",\n FORM_VALIDATED = \"FORM_VALIDATED\",\n DOCUMENT_TYPE_SELECTED = \"DOCUMENT_TYPE_SELECTED\",\n CAPTURE_MODE_SELECTED = \"CAPTURE_MODE_SELECTED\",\n PHOTO_CAPTURED = \"PHOTO_CAPTURED\",\n PHOTOS_VALIDATED = \"PHOTOS_VALIDATED\",\n DOCUMENT_LOADED = \"DOCUMENT_LOADED\",\n DOCUMENTS_VALIDATED = \"DOCUMENTS_VALIDATED\",\n VERIFICATION_COMPLETED = \"VERIFICATION_COMPLETED\",\n}\n\n/**\n * Interface for audit trail entry creation request data\n */\nexport interface CreateAuditTrailRequest {\n eventType: AuditTrailEventType;\n analysisId: string;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n metadata?: Record<string, any>;\n clientInfoId?: string;\n userId?: string;\n}\n\n/**\n * Interface for audit trail entry response data\n */\nexport interface AuditTrailEntry {\n id: string;\n eventType: AuditTrailEventType;\n documentsName?: Record<string, any>;\n userInputs?: Record<string, any>;\n analysisId: string;\n clientInfoId?: string;\n userId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Creates an audit trail entry and associates it with an analysis\n *\n * @param auditTrailData - The audit trail data to create\n * @returns The created audit trail entry\n */\nexport const createAuditTrailEntry = async (\n auditTrailData: CreateAuditTrailRequest\n): Promise<AuditTrailEntry> => {\n try {\n const payload = {\n ...auditTrailData,\n toSession: true,\n };\n const response = await apiService.post(\n \"/session/audit-trail\",\n payload\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific analysis\n *\n * @param analysisId - The ID of the analysis\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsByAnalysisId = async (\n analysisId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/analysis/${analysisId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Fetches all audit trail entries for a specific session\n *\n * @param sessionId - The ID of the session\n * @returns Array of audit trail entries\n */\nexport const getAuditTrailsBySessionId = async (\n sessionId: string\n): Promise<AuditTrailEntry[]> => {\n try {\n const response = await apiService.get(\n `/session/audit-trail/session/${sessionId}`\n );\n return response.data;\n } catch (error) {\n throw error;\n }\n};\n\n/**\n * Creates an audit trail entry when a session is started\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionStarted = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_STARTED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session is ended\n *\n * @param analysisId - The ID of the analysis associated with the session\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSessionEnded = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SESSION_ENDED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is uploaded\n *\n * @param analysisId - The ID of the analysis\n * @param documentName - The name or details of the document\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentUploaded = async (\n analysisId: string,\n documentName: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_UPLOADED,\n analysisId,\n documentsName: documentName,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a selfie is captured\n *\n * @param analysisId - The ID of the analysis\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSelfieCaptured = async (\n analysisId: string,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SELFIE_CAPTURED,\n analysisId,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when user information is modified\n *\n * @param analysisId - The ID of the analysis\n * @param userInputs - The user inputs that were modified\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logInformationModified = async (\n analysisId: string,\n userInputs: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.INFORMATION_MODIFIED,\n analysisId,\n userInputs,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a session status is modified\n *\n * @param analysisId - The ID of the analysis\n * @param status - The new status value\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logStatusModified = async (\n analysisId: string,\n status: any,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.STATUS_MODIFIED,\n analysisId,\n userInputs: { status },\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when an AI control is performed\n *\n * @param analysisId - The ID of the analysis\n * @param aiResults - The results of the AI control\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logAiControlled = async (\n analysisId: string,\n aiResults: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.AI_CONTROLED,\n analysisId,\n userInputs: aiResults,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a form link is sent\n *\n * @param analysisId - The ID of the analysis\n * @param recipientInfo - Information about the link recipient\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logFormSendedLink = async (\n analysisId: string,\n recipientInfo: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_SENDED_LINK,\n analysisId,\n userInputs: recipientInfo,\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a signature document is opened\n *\n * @param analysisId - The ID of the analysis\n * @param documentInfo - Information about the document being signed\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logSignatureDocumentOpened = async (\n analysisId: string,\n documentInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.SIGNATURE_DOCUMENT_OPENED,\n analysisId,\n userInputs: documentInfo || {},\n clientInfoId,\n });\n};\n\n/**\n * Creates an audit trail entry when a document is signed\n *\n * @param analysisId - The ID of the analysis\n * @param signatureInfo - Information about the signature\n * @param clientInfoId - Optional client info ID\n * @returns The created audit trail entry\n */\nexport const logDocumentSigned = async (\n analysisId: string,\n signatureInfo?: Record<string, any>,\n clientInfoId?: string\n): Promise<AuditTrailEntry> => {\n return createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_SIGNED,\n analysisId,\n userInputs: signatureInfo || {},\n clientInfoId,\n });\n};\n\n// ─── APP3-1763 — Nouveaux events de parcours ─────────────────────────────────\n// Convention : sessionId est passé dans le champ analysisId (backend route via toSession:true).\n// Tous les appels sont fire-and-forget — les callers ne doivent PAS await ces fonctions.\n\nexport const logFormValidated = (\n sessionId: string,\n userInputs?: Record<string, any>,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.FORM_VALIDATED,\n analysisId: sessionId,\n userInputs: userInputs || {},\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentTypeSelected = (\n sessionId: string,\n documentType: string,\n documentLabel?: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_TYPE_SELECTED,\n analysisId: sessionId,\n metadata: { documentType, documentLabel: documentLabel ?? documentType },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logCaptureModeSelected = (\n sessionId: string,\n captureMode: \"picture\" | \"upload\",\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.CAPTURE_MODE_SELECTED,\n analysisId: sessionId,\n metadata: { captureMode },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logPhotoCaptured = (\n sessionId: string,\n side: \"recto\" | \"verso\",\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.PHOTO_CAPTURED,\n analysisId: sessionId,\n metadata: { side },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logPhotosValidated = (\n sessionId: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.PHOTOS_VALIDATED,\n analysisId: sessionId,\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentLoaded = (\n sessionId: string,\n side: \"recto\" | \"verso\",\n documentType?: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENT_LOADED,\n analysisId: sessionId,\n metadata: { side, ...(documentType ? { documentType } : {}) },\n clientInfoId,\n }).catch(() => {});\n};\n\nexport const logDocumentsValidated = (\n sessionId: string,\n clientInfoId?: string\n): void => {\n createAuditTrailEntry({\n eventType: AuditTrailEventType.DOCUMENTS_VALIDATED,\n analysisId: sessionId,\n clientInfoId,\n }).catch(() => {});\n};\n"],"names":["AuditTrailEventType","__awaiter","apiService"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":";;AA8DO,IAAM,2BAA2B,GAAsB;;;;"}
1
+ {"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number) => void;\n goBack: () => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n nfcEnabled?: boolean;\n nfcMode?: \"nfcOnly\" | \"nfcAndApi\";\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\";\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":";;AA8DO,IAAM,2BAA2B,GAAsB;;;;"}
@@ -277,7 +277,7 @@ var DocumentCollection = function (_a) {
277
277
  return (jsx(DocumentCollectionMethodSelection, { onMethodSelect: handleMethodSelect, onBack: handleBack, title: documentSelection === null || documentSelection === void 0 ? void 0 : documentSelection.title, description: documentSelection === null || documentSelection === void 0 ? void 0 : documentSelection.description }));
278
278
  case 3:
279
279
  if (selectedMethod === "download") {
280
- return (jsx(DocumentCollectionUpload, { selectedDocumentType: selectedDocumentType, allowedDocumentTypes: allowedDocumentTypes, onUpload: handleDocumentUpload, onBack: handleBack, documentSelection: documentSelection }));
280
+ return (jsx(DocumentCollectionUpload, { selectedDocumentType: selectedDocumentType, allowedDocumentTypes: allowedDocumentTypes, onUpload: handleDocumentUpload, onBack: handleBack, documentSelection: documentSelection, sessionId: sessionId }));
281
281
  }
282
282
  else {
283
283
  // Photo flow