datakeen-session-react 1.1.140-dev.75 → 1.1.140-dev.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/document-collection/DocumentCollection.js +20 -23
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/document-collection/DocumentCollectionUpload.js +9 -1
- package/dist/cjs/components/document-collection/DocumentCollectionUpload.js.map +1 -1
- package/dist/cjs/components/id-check/Photo.js +1 -2
- package/dist/cjs/components/id-check/Photo.js.map +1 -1
- package/dist/cjs/components/id-check/PhotoPreview.js +39 -0
- package/dist/cjs/components/id-check/PhotoPreview.js.map +1 -0
- package/dist/cjs/components/jdi/JDIDocumentUpload.js +1 -1
- package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +35 -32
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +6 -1
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +11 -0
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +11 -0
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/services/analysis.js +1 -5
- package/dist/cjs/services/analysis.js.map +1 -1
- package/dist/cjs/services/auditTrailService.js +73 -0
- package/dist/cjs/services/auditTrailService.js.map +1 -1
- package/dist/cjs/services/cameraService.js +54 -9
- package/dist/cjs/services/cameraService.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js +21 -24
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollectionUpload.js +9 -1
- package/dist/esm/components/document-collection/DocumentCollectionUpload.js.map +1 -1
- package/dist/esm/components/id-check/Photo.js +1 -2
- package/dist/esm/components/id-check/Photo.js.map +1 -1
- package/dist/esm/components/id-check/PhotoPreview.js +35 -0
- package/dist/esm/components/id-check/PhotoPreview.js.map +1 -0
- package/dist/esm/components/jdi/JDIDocumentUpload.js +1 -1
- package/dist/esm/components/jdi/JDIDocumentUpload.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +35 -32
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +6 -1
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/i18n/en.json.js +11 -0
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +11 -0
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/services/analysis.js +1 -5
- package/dist/esm/services/analysis.js.map +1 -1
- package/dist/esm/services/auditTrailService.js +67 -1
- package/dist/esm/services/auditTrailService.js.map +1 -1
- package/dist/esm/services/cameraService.js +54 -9
- package/dist/esm/services/cameraService.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Photo.js","sources":["../../../../../src/components/id-check/Photo.tsx"],"sourcesContent":["import { useRef, useState, useEffect, useCallback } from \"react\";\nimport type { CameraFacingMode } from \"../../types/camera\";\nimport {\n cameraService,\n type CaptureDocumentResult,\n} from \"../../services/cameraService\";\nimport {\n documentDetectionService,\n type DocumentDetectionResult,\n} from \"../../services/documentDetectionService\";\nimport CameraError from \"./CameraError\";\nimport CameraMask from \"./CameraMask\";\nimport OrientationToggle from \"./OrientationToggle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface PhotoProps {\n onCapture: (image: string) => void;\n automaticCapture?: boolean; // Controls whether automatic capture is enabled\n maskType?: \"id\" | \"document\";\n}\n\nconst Photo: React.FC<PhotoProps> = ({\n onCapture,\n automaticCapture = false,\n maskType = \"id\",\n}) => {\n const isMobile = useIsMobile(768);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n const [facingMode, setFacingMode] = useState<CameraFacingMode>(\"environment\");\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [isPortrait, setIsPortrait] = useState(\n window.matchMedia(\"(orientation: portrait)\").matches\n );\n const [isCountingDown, setIsCountingDown] = useState(false);\n const [countdown, setCountdown] = useState(0);\n const [documentDetected, setDocumentDetected] = useState(false);\n const [captureError, setCaptureError] = useState<string | null>(null);\n const { t } = useI18n();\n const [lastCaptureMeta, setLastCaptureMeta] =\n useState<CaptureDocumentResult | null>(null);\n const [maskRect, setMaskRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const countdownIntervalRef = useRef<number | null>(null);\n const detectionHandlerRef = useRef<{ stop: () => void } | null>(null);\n\n const CAPTURE_COUNTDOWN_SECONDS = 3;\n\n const clearCountdown = useCallback(() => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n setCountdown(0);\n }, []);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setIsPortrait(window.matchMedia(\"(orientation: portrait)\").matches);\n };\n\n const mediaQuery = window.matchMedia(\"(orientation: portrait)\");\n mediaQuery.addEventListener(\"change\", handleOrientationChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n const stopDetection = useCallback(() => {\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n documentDetectionService.stopDocumentDetection();\n }, []);\n\n const captureDocument = useCallback(async () => {\n if (!videoRef.current) {\n throw new Error(t(\"id_check.photo.errors.video_unavailable\", \"Le flux vidéo n'est pas disponible\"));\n }\n\n const video = videoRef.current;\n if (!video.videoWidth || !video.videoHeight) {\n throw new Error(\n t(\n \"id_check.photo.errors.video_dimensions_unavailable\",\n \"Dimensions vidéo indisponibles pour la capture\"\n )\n );\n }\n\n // Calculate crop area from mask if available\n let cropArea = null;\n if (maskRect) {\n const videoRect = video.getBoundingClientRect();\n\n // Calculate the actual displayed video dimensions accounting for object-fit: contain\n // Calculate the actual displayed video dimensions accounting for object-fit: cover\n const videoAspect = video.videoWidth / video.videoHeight;\n const displayAspect = videoRect.width / videoRect.height;\n\n let displayedWidth, displayedHeight, offsetX, offsetY;\n\n if (videoAspect > displayAspect) {\n // Video is wider than container - scaled to match height, sides cropped\n displayedHeight = videoRect.height;\n displayedWidth = videoRect.height * videoAspect;\n offsetY = 0;\n offsetX = (videoRect.width - displayedWidth) / 2;\n } else {\n // Video is taller than container - scaled to match width, top/bottom cropped\n displayedWidth = videoRect.width;\n displayedHeight = videoRect.width / videoAspect;\n offsetX = 0;\n offsetY = (videoRect.height - displayedHeight) / 2;\n }\n\n // Calculate the scale between actual displayed video and real video dimensions\n const scaleX = video.videoWidth / displayedWidth;\n const scaleY = video.videoHeight / displayedHeight;\n\n // Convert mask coordinates from screen space to video space\n // Account for video element offset and displayed video offset\n const cropX = (maskRect.left - videoRect.left - offsetX) * scaleX;\n const cropY = (maskRect.top - videoRect.top - offsetY) * scaleY;\n const cropWidth = maskRect.width * scaleX;\n const cropHeight = maskRect.height * scaleY;\n\n // Ensure crop area is within video bounds\n cropArea = {\n x: Math.max(0, Math.round(cropX)),\n y: Math.max(0, Math.round(cropY)),\n width: Math.min(video.videoWidth - Math.max(0, cropX), Math.round(cropWidth)),\n height: Math.min(video.videoHeight - Math.max(0, cropY), Math.round(cropHeight)),\n };\n\n console.debug(\"[Photo] Calculated crop area from mask\", {\n maskRect,\n videoRect: { left: videoRect.left, top: videoRect.top, width: videoRect.width, height: videoRect.height },\n videoDimensions: { width: video.videoWidth, height: video.videoHeight },\n displayedDimensions: { width: displayedWidth, height: displayedHeight },\n offset: { x: offsetX, y: offsetY },\n scale: { x: scaleX, y: scaleY },\n cropArea,\n });\n } else {\n console.debug(\"[Photo] No mask rect available, capturing full frame\");\n }\n\n setCaptureError(null);\n setIsDetecting(false);\n\n try {\n const result = await cameraService.captureDocument(video, cropArea, {\n facingMode,\n format: \"jpeg\",\n jpegQuality: 0.95,\n });\n\n setLastCaptureMeta(result);\n stopDetection();\n cameraService.stopCamera();\n setDocumentDetected(false);\n\n console.debug(\"Document captured\", {\n method: result.method,\n analysis: result.analysis,\n source: result.sourceDimensions,\n crop: result.cropDimensions,\n });\n\n onCapture(result.dataUrl);\n } catch (error) {\n console.error(\"Document capture failed\", error);\n setCaptureError(t(\"id_check.photo.capture_failed\", \"La capture a échoué. Veuillez réessayer.\"));\n setIsDetecting(true);\n throw error;\n }\n }, [facingMode, onCapture, stopDetection, maskRect, t]);\n\n const startCountdown = useCallback(() => {\n if (isCountingDown) return;\n\n setIsCountingDown(true);\n setCountdown(CAPTURE_COUNTDOWN_SECONDS);\n\n let timeLeft = CAPTURE_COUNTDOWN_SECONDS;\n countdownIntervalRef.current = window.setInterval(() => {\n timeLeft = Math.max(0, timeLeft - 0.1);\n setCountdown(parseFloat(timeLeft.toFixed(1)));\n\n if (timeLeft <= 0.1) {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n\n captureDocument().catch(() => {\n // Error is handled inside captureDocument, but keep the promise chain quiet\n });\n }\n }, 100);\n }, [captureDocument, isCountingDown]);\n\n const handleDetectionChange = useCallback(\n (result: DocumentDetectionResult) => {\n setDocumentDetected(result.hasDocument);\n\n if (!automaticCapture) {\n return;\n }\n\n if (result.hasDocument) {\n startCountdown();\n } else {\n clearCountdown();\n }\n },\n [automaticCapture, clearCountdown, startCountdown]\n );\n\n const cancelCaptureTimer = useCallback(() => {\n clearCountdown();\n setDocumentDetected(false);\n }, [clearCountdown]);\n\n useEffect(() => {\n let isCancelled = false;\n\n const initCamera = async () => {\n setCameraError(null);\n const result = await cameraService.startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n });\n\n if (isCancelled) return;\n\n if (result.success) {\n setLastCaptureMeta(null);\n if (automaticCapture) {\n setIsDetecting(true);\n }\n } else if (result.error) {\n setCameraError(result.error);\n setIsDetecting(false);\n }\n };\n\n initCamera();\n\n return () => {\n isCancelled = true;\n clearCountdown();\n stopDetection();\n cameraService.stopCamera();\n setIsDetecting(false);\n };\n }, [facingMode, clearCountdown, stopDetection, isPortrait]);\n\n useEffect(() => {\n if (!isDetecting || !videoRef.current) {\n return;\n }\n\n let cancelled = false;\n\n documentDetectionService\n .startDocumentDetection(videoRef.current, (result) => {\n if (!cancelled) {\n handleDetectionChange(result);\n }\n })\n .then((handler) => {\n if (!cancelled) {\n detectionHandlerRef.current = handler;\n }\n });\n\n return () => {\n cancelled = true;\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n };\n }, [handleDetectionChange, isDetecting]);\n\n const toggleCamera = () => {\n setFacingMode((prev) => (prev === \"environment\" ? \"user\" : \"environment\"));\n cancelCaptureTimer();\n };\n\n const handleRetry = () => {\n setCameraError(null);\n cancelCaptureTimer();\n setCaptureError(null);\n setIsDetecting(false);\n stopDetection();\n cameraService.stopCamera();\n\n cameraService\n .startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n })\n .then((result) => {\n if (result.success) {\n setIsDetecting(true);\n } else if (result.error) {\n setCameraError(result.error);\n }\n });\n };\n const handleManualCapture = () => {\n clearCountdown();\n captureDocument().catch(() => {\n // captureDocument already logs and sets error state\n });\n };\n\n return (\n <div\n className=\"flex flex-col\"\n style={{\n position: isMobile ? \"fixed\" : \"relative\",\n inset: isMobile ? 0 : \"auto\",\n zIndex: isMobile ? 50 : \"auto\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {/* Camera content area */}\n <div className=\"flex-1 relative overflow-hidden bg-black\">\n {cameraError ? (\n <div className=\"flex items-center justify-center h-full px-4 py-6\">\n <CameraError errorMessage={cameraError} onRetry={handleRetry} />\n </div>\n ) : (\n <>\n {/* Livestream of the camera*/}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover z-0 bg-black ${facingMode === \"user\" ? \"scale-x-[-1]\" : \"\"\n }`}\n />\n {/* Capture mode indicator */}\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 z-50\">\n <span className=\"text-white z-50 text-sm font-semibold drop-shadow-lg\">\n {automaticCapture ? (\n <span className=\"animate-pulse\">{t(\"id_check.photo.mode_autocapture\", \"Autocapture activée\")}</span>\n ) : (\n <span className=\"bg-orange-500 px-2 py-1 rounded hidden\">{t(\"id_check.photo.mode_manual\", \"Mode manuel\")}</span>\n )}\n </span>\n </div>\n {/* Mask */}\n <CameraMask\n isDetecting={isDetecting}\n isPortrait={isPortrait}\n facingMode={facingMode}\n isCountingDown={isCountingDown}\n countdown={countdown}\n maskType={maskType}\n onMaskRectChange={setMaskRect}\n />\n {/* Manual capture instructions */}\n <div className=\"absolute bottom-20 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"text-center px-4\">\n <div className=\"bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block\">\n {t(\"id_check.photo.position_document\", \"Positionnez le document\")}\n </div>\n </div>\n </div>\n {/* Button to change orientation */}\n <OrientationToggle onCameraToggle={toggleCamera} />\n </>\n )}\n </div>\n\n {/* Controls at the bottom */}\n <div className=\"relative z-20 bg-black bg-opacity-80 p-4\">\n <div className=\"flex flex-col items-center space-y-4\">\n {/* Manual capture button - always available */}\n <button\n onClick={handleManualCapture}\n className={`w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer`}\n >\n <div className=\"w-8 h-8 bg-white rounded-full\"></div>\n </button>\n\n {/* Status message */}\n <div className=\"text-white text-center text-sm\">\n <div className=\"flex items-center justify-center space-x-2\">\n <div\n className={`w-2 h-2 rounded-full ${automaticCapture\n ? \"bg-[#11E5C5] animate-pulse\"\n : \"bg-orange-500\"\n }`}\n ></div>\n <span>\n {automaticCapture\n ? t(\n \"id_check.photo.automatic_instruction\",\n \"Capture automatique active ou appuyez sur le bouton\"\n )\n : t(\n \"id_check.photo.manual_instruction\",\n \"Appuyez sur le bouton pour capturer\"\n )}\n </span>\n </div>\n {captureError && (\n <p className=\"text-red-400 text-xs mt-2 text-center\">\n {captureError}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Photo;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Photo.js","sources":["../../../../../src/components/id-check/Photo.tsx"],"sourcesContent":["import { useRef, useState, useEffect, useCallback } from \"react\";\nimport type { CameraFacingMode } from \"../../types/camera\";\nimport {\n cameraService,\n type CaptureDocumentResult,\n} from \"../../services/cameraService\";\nimport {\n documentDetectionService,\n type DocumentDetectionResult,\n} from \"../../services/documentDetectionService\";\nimport CameraError from \"./CameraError\";\nimport CameraMask from \"./CameraMask\";\nimport OrientationToggle from \"./OrientationToggle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface PhotoProps {\n onCapture: (image: string) => void;\n automaticCapture?: boolean; // Controls whether automatic capture is enabled\n maskType?: \"id\" | \"document\";\n}\n\nconst Photo: React.FC<PhotoProps> = ({\n onCapture,\n automaticCapture = false,\n maskType = \"id\",\n}) => {\n const isMobile = useIsMobile(768);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n const [facingMode, setFacingMode] = useState<CameraFacingMode>(\"environment\");\n const [cameraError, setCameraError] = useState<string | null>(null);\n const [isPortrait, setIsPortrait] = useState(\n window.matchMedia(\"(orientation: portrait)\").matches\n );\n const [isCountingDown, setIsCountingDown] = useState(false);\n const [countdown, setCountdown] = useState(0);\n const [documentDetected, setDocumentDetected] = useState(false);\n const [captureError, setCaptureError] = useState<string | null>(null);\n const { t } = useI18n();\n const [lastCaptureMeta, setLastCaptureMeta] =\n useState<CaptureDocumentResult | null>(null);\n const [maskRect, setMaskRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const countdownIntervalRef = useRef<number | null>(null);\n const detectionHandlerRef = useRef<{ stop: () => void } | null>(null);\n\n const CAPTURE_COUNTDOWN_SECONDS = 3;\n\n const clearCountdown = useCallback(() => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n setCountdown(0);\n }, []);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n setIsPortrait(window.matchMedia(\"(orientation: portrait)\").matches);\n };\n\n const mediaQuery = window.matchMedia(\"(orientation: portrait)\");\n mediaQuery.addEventListener(\"change\", handleOrientationChange);\n\n return () => {\n mediaQuery.removeEventListener(\"change\", handleOrientationChange);\n };\n }, []);\n\n const stopDetection = useCallback(() => {\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n documentDetectionService.stopDocumentDetection();\n }, []);\n\n const captureDocument = useCallback(async () => {\n if (!videoRef.current) {\n throw new Error(t(\"id_check.photo.errors.video_unavailable\", \"Le flux vidéo n'est pas disponible\"));\n }\n\n const video = videoRef.current;\n if (!video.videoWidth || !video.videoHeight) {\n throw new Error(\n t(\n \"id_check.photo.errors.video_dimensions_unavailable\",\n \"Dimensions vidéo indisponibles pour la capture\"\n )\n );\n }\n\n // Calculate crop area from mask if available\n let cropArea = null;\n if (maskRect) {\n const videoRect = video.getBoundingClientRect();\n\n // Calculate the actual displayed video dimensions accounting for object-fit: contain\n // Calculate the actual displayed video dimensions accounting for object-fit: cover\n const videoAspect = video.videoWidth / video.videoHeight;\n const displayAspect = videoRect.width / videoRect.height;\n\n let displayedWidth, displayedHeight, offsetX, offsetY;\n\n if (videoAspect > displayAspect) {\n // Video is wider than container - scaled to match height, sides cropped\n displayedHeight = videoRect.height;\n displayedWidth = videoRect.height * videoAspect;\n offsetY = 0;\n offsetX = (videoRect.width - displayedWidth) / 2;\n } else {\n // Video is taller than container - scaled to match width, top/bottom cropped\n displayedWidth = videoRect.width;\n displayedHeight = videoRect.width / videoAspect;\n offsetX = 0;\n offsetY = (videoRect.height - displayedHeight) / 2;\n }\n\n // Calculate the scale between actual displayed video and real video dimensions\n const scaleX = video.videoWidth / displayedWidth;\n const scaleY = video.videoHeight / displayedHeight;\n\n // Convert mask coordinates from screen space to video space\n // Account for video element offset and displayed video offset\n const cropX = (maskRect.left - videoRect.left - offsetX) * scaleX;\n const cropY = (maskRect.top - videoRect.top - offsetY) * scaleY;\n const cropWidth = maskRect.width * scaleX;\n const cropHeight = maskRect.height * scaleY;\n\n // Ensure crop area is within video bounds\n cropArea = {\n x: Math.max(0, Math.round(cropX)),\n y: Math.max(0, Math.round(cropY)),\n width: Math.min(video.videoWidth - Math.max(0, cropX), Math.round(cropWidth)),\n height: Math.min(video.videoHeight - Math.max(0, cropY), Math.round(cropHeight)),\n };\n\n console.debug(\"[Photo] Calculated crop area from mask\", {\n maskRect,\n videoRect: { left: videoRect.left, top: videoRect.top, width: videoRect.width, height: videoRect.height },\n videoDimensions: { width: video.videoWidth, height: video.videoHeight },\n displayedDimensions: { width: displayedWidth, height: displayedHeight },\n offset: { x: offsetX, y: offsetY },\n scale: { x: scaleX, y: scaleY },\n cropArea,\n });\n } else {\n console.debug(\"[Photo] No mask rect available, capturing full frame\");\n }\n\n setCaptureError(null);\n setIsDetecting(false);\n\n try {\n const result = await cameraService.captureDocument(video, cropArea, {\n facingMode,\n format: \"jpeg\",\n jpegQuality: 0.95,\n });\n\n setLastCaptureMeta(result);\n stopDetection();\n setDocumentDetected(false);\n\n console.debug(\"Document captured\", {\n method: result.method,\n analysis: result.analysis,\n source: result.sourceDimensions,\n crop: result.cropDimensions,\n });\n\n onCapture(result.dataUrl);\n } catch (error) {\n console.error(\"Document capture failed\", error);\n setCaptureError(t(\"id_check.photo.capture_failed\", \"La capture a échoué. Veuillez réessayer.\"));\n setIsDetecting(true);\n throw error;\n }\n }, [facingMode, onCapture, stopDetection, maskRect, t]);\n\n const startCountdown = useCallback(() => {\n if (isCountingDown) return;\n\n setIsCountingDown(true);\n setCountdown(CAPTURE_COUNTDOWN_SECONDS);\n\n let timeLeft = CAPTURE_COUNTDOWN_SECONDS;\n countdownIntervalRef.current = window.setInterval(() => {\n timeLeft = Math.max(0, timeLeft - 0.1);\n setCountdown(parseFloat(timeLeft.toFixed(1)));\n\n if (timeLeft <= 0.1) {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setIsCountingDown(false);\n\n captureDocument().catch(() => {\n // Error is handled inside captureDocument, but keep the promise chain quiet\n });\n }\n }, 100);\n }, [captureDocument, isCountingDown]);\n\n const handleDetectionChange = useCallback(\n (result: DocumentDetectionResult) => {\n setDocumentDetected(result.hasDocument);\n\n if (!automaticCapture) {\n return;\n }\n\n if (result.hasDocument) {\n startCountdown();\n } else {\n clearCountdown();\n }\n },\n [automaticCapture, clearCountdown, startCountdown]\n );\n\n const cancelCaptureTimer = useCallback(() => {\n clearCountdown();\n setDocumentDetected(false);\n }, [clearCountdown]);\n\n useEffect(() => {\n let isCancelled = false;\n\n const initCamera = async () => {\n setCameraError(null);\n const result = await cameraService.startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n });\n\n if (isCancelled) return;\n\n if (result.success) {\n setLastCaptureMeta(null);\n if (automaticCapture) {\n setIsDetecting(true);\n }\n } else if (result.error) {\n setCameraError(result.error);\n setIsDetecting(false);\n }\n };\n\n initCamera();\n\n return () => {\n isCancelled = true;\n clearCountdown();\n stopDetection();\n cameraService.stopCamera();\n setIsDetecting(false);\n };\n }, [facingMode, clearCountdown, stopDetection]);\n\n useEffect(() => {\n if (!isDetecting || !videoRef.current) {\n return;\n }\n\n let cancelled = false;\n\n documentDetectionService\n .startDocumentDetection(videoRef.current, (result) => {\n if (!cancelled) {\n handleDetectionChange(result);\n }\n })\n .then((handler) => {\n if (!cancelled) {\n detectionHandlerRef.current = handler;\n }\n });\n\n return () => {\n cancelled = true;\n if (detectionHandlerRef.current) {\n detectionHandlerRef.current.stop();\n detectionHandlerRef.current = null;\n }\n };\n }, [handleDetectionChange, isDetecting]);\n\n const toggleCamera = () => {\n setFacingMode((prev) => (prev === \"environment\" ? \"user\" : \"environment\"));\n cancelCaptureTimer();\n };\n\n const handleRetry = () => {\n setCameraError(null);\n cancelCaptureTimer();\n setCaptureError(null);\n setIsDetecting(false);\n stopDetection();\n cameraService.stopCamera();\n\n cameraService\n .startCamera(videoRef.current, {\n facingMode,\n idealResolution: { width: 4096, height: 3072 },\n preferImageCapture: true,\n })\n .then((result) => {\n if (result.success) {\n setIsDetecting(true);\n } else if (result.error) {\n setCameraError(result.error);\n }\n });\n };\n const handleManualCapture = () => {\n clearCountdown();\n captureDocument().catch(() => {\n // captureDocument already logs and sets error state\n });\n };\n\n return (\n <div\n className=\"flex flex-col\"\n style={{\n position: isMobile ? \"fixed\" : \"relative\",\n inset: isMobile ? 0 : \"auto\",\n zIndex: isMobile ? 50 : \"auto\",\n height: \"100%\",\n width: \"100%\",\n }}\n >\n {/* Camera content area */}\n <div className=\"flex-1 relative overflow-hidden bg-black\">\n {cameraError ? (\n <div className=\"flex items-center justify-center h-full px-4 py-6\">\n <CameraError errorMessage={cameraError} onRetry={handleRetry} />\n </div>\n ) : (\n <>\n {/* Livestream of the camera*/}\n <video\n ref={videoRef}\n autoPlay\n playsInline\n muted\n className={`absolute inset-0 w-full h-full object-cover z-0 bg-black ${facingMode === \"user\" ? \"scale-x-[-1]\" : \"\"\n }`}\n />\n {/* Capture mode indicator */}\n <div className=\"absolute top-4 left-1/2 transform -translate-x-1/2 z-50\">\n <span className=\"text-white z-50 text-sm font-semibold drop-shadow-lg\">\n {automaticCapture ? (\n <span className=\"animate-pulse\">{t(\"id_check.photo.mode_autocapture\", \"Autocapture activée\")}</span>\n ) : (\n <span className=\"bg-orange-500 px-2 py-1 rounded hidden\">{t(\"id_check.photo.mode_manual\", \"Mode manuel\")}</span>\n )}\n </span>\n </div>\n {/* Mask */}\n <CameraMask\n isDetecting={isDetecting}\n isPortrait={isPortrait}\n facingMode={facingMode}\n isCountingDown={isCountingDown}\n countdown={countdown}\n maskType={maskType}\n onMaskRectChange={setMaskRect}\n />\n {/* Manual capture instructions */}\n <div className=\"absolute bottom-20 left-0 right-0 z-20 pointer-events-none\">\n <div className=\"text-center px-4\">\n <div className=\"bg-black bg-opacity-60 text-white text-sm px-4 py-2 rounded-lg inline-block\">\n {t(\"id_check.photo.position_document\", \"Positionnez le document\")}\n </div>\n </div>\n </div>\n {/* Button to change orientation */}\n <OrientationToggle onCameraToggle={toggleCamera} />\n </>\n )}\n </div>\n\n {/* Controls at the bottom */}\n <div className=\"relative z-20 bg-black bg-opacity-80 p-4\">\n <div className=\"flex flex-col items-center space-y-4\">\n {/* Manual capture button - always available */}\n <button\n onClick={handleManualCapture}\n className={`w-16 h-16 rounded-full border-4 border-white flex items-center justify-center transition-all bg-transparent hover:bg-white hover:bg-opacity-20 cursor-pointer`}\n >\n <div className=\"w-8 h-8 bg-white rounded-full\"></div>\n </button>\n\n {/* Status message */}\n <div className=\"text-white text-center text-sm\">\n <div className=\"flex items-center justify-center space-x-2\">\n <div\n className={`w-2 h-2 rounded-full ${automaticCapture\n ? \"bg-[#11E5C5] animate-pulse\"\n : \"bg-orange-500\"\n }`}\n ></div>\n <span>\n {automaticCapture\n ? t(\n \"id_check.photo.automatic_instruction\",\n \"Capture automatique active ou appuyez sur le bouton\"\n )\n : t(\n \"id_check.photo.manual_instruction\",\n \"Appuyez sur le bouton pour capturer\"\n )}\n </span>\n </div>\n {captureError && (\n <p className=\"text-red-400 text-xs mt-2 text-center\">\n {captureError}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Photo;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Button from '../ui/Button.js';
|
|
3
|
+
import PageActions from '../ui/PageActions.js';
|
|
4
|
+
import Title from '../ui/Title.js';
|
|
5
|
+
import Subtitle from '../ui/Subtitle.js';
|
|
6
|
+
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
7
|
+
import { useI18n } from '../../hooks/useI18n.js';
|
|
8
|
+
|
|
9
|
+
var PhotoPreview = function (_a) {
|
|
10
|
+
var imageUrl = _a.imageUrl, side = _a.side, _b = _a.isSingleSided, isSingleSided = _b === void 0 ? false : _b, onValidate = _a.onValidate, onRetake = _a.onRetake;
|
|
11
|
+
var t = useI18n().t;
|
|
12
|
+
var isRecto = side === "recto";
|
|
13
|
+
var title = isRecto
|
|
14
|
+
? isSingleSided
|
|
15
|
+
? t("id_check.photo_preview.title_single", "Vérifiez votre photo")
|
|
16
|
+
: t("id_check.photo_preview.title_recto", "Vérifiez le recto")
|
|
17
|
+
: t("id_check.photo_preview.title_verso", "Vérifiez le verso");
|
|
18
|
+
var subtitle = isRecto
|
|
19
|
+
? isSingleSided
|
|
20
|
+
? t("id_check.photo_preview.subtitle_single", "Votre document est-il net et lisible ?")
|
|
21
|
+
: t("id_check.photo_preview.subtitle_recto", "Le recto est-il net et lisible ?")
|
|
22
|
+
: t("id_check.photo_preview.subtitle_verso", "Le verso est-il net et lisible ?");
|
|
23
|
+
var validateLabel = isRecto && !isSingleSided
|
|
24
|
+
? t("id_check.photo_preview.validate_recto", "Valider et photographier le verso")
|
|
25
|
+
: t("id_check.photo_preview.validate", "Valider");
|
|
26
|
+
var sideLabel = isSingleSided
|
|
27
|
+
? t("id_check.confirmation.single_sided", "Document")
|
|
28
|
+
: isRecto
|
|
29
|
+
? t("id_check.confirmation.recto", "Recto")
|
|
30
|
+
: t("id_check.confirmation.verso", "Verso");
|
|
31
|
+
return (jsx(MobilePageLayout, { footer: jsx(PageActions, { primary: jsx(Button, { onClick: onValidate, children: validateLabel }), secondary: jsx(Button, { variant: "secondary", onClick: onRetake, children: t("id_check.photo_preview.retake", "Reprendre la photo") }) }), children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed", children: subtitle })] }), jsxs("div", { className: "w-full", children: [jsx("div", { className: "mb-2", children: jsx("span", { className: "inline-block bg-gray-100 text-gray-700 px-3 py-1 rounded-full text-xs font-medium", children: sideLabel }) }), jsx("div", { className: "relative rounded-lg overflow-hidden border-2 border-gray-200 bg-gray-50", children: jsx("img", { src: imageUrl, alt: sideLabel, className: "w-full h-56 md:h-64 object-contain bg-white" }) })] })] }) }) }));
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { PhotoPreview as default };
|
|
35
|
+
//# sourceMappingURL=PhotoPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhotoPreview.js","sources":["../../../../../src/components/id-check/PhotoPreview.tsx"],"sourcesContent":["import React from \"react\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface PhotoPreviewProps {\n imageUrl: string;\n side: \"recto\" | \"verso\";\n isSingleSided?: boolean;\n onValidate: () => void;\n onRetake: () => void;\n}\n\nconst PhotoPreview: React.FC<PhotoPreviewProps> = ({\n imageUrl,\n side,\n isSingleSided = false,\n onValidate,\n onRetake,\n}) => {\n const { t } = useI18n();\n\n const isRecto = side === \"recto\";\n\n const title = isRecto\n ? isSingleSided\n ? t(\"id_check.photo_preview.title_single\", \"Vérifiez votre photo\")\n : t(\"id_check.photo_preview.title_recto\", \"Vérifiez le recto\")\n : t(\"id_check.photo_preview.title_verso\", \"Vérifiez le verso\");\n\n const subtitle = isRecto\n ? isSingleSided\n ? t(\"id_check.photo_preview.subtitle_single\", \"Votre document est-il net et lisible ?\")\n : t(\"id_check.photo_preview.subtitle_recto\", \"Le recto est-il net et lisible ?\")\n : t(\"id_check.photo_preview.subtitle_verso\", \"Le verso est-il net et lisible ?\");\n\n const validateLabel = isRecto && !isSingleSided\n ? t(\"id_check.photo_preview.validate_recto\", \"Valider et photographier le verso\")\n : t(\"id_check.photo_preview.validate\", \"Valider\");\n\n const sideLabel = isSingleSided\n ? t(\"id_check.confirmation.single_sided\", \"Document\")\n : isRecto\n ? t(\"id_check.confirmation.recto\", \"Recto\")\n : t(\"id_check.confirmation.verso\", \"Verso\");\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={onValidate}>{validateLabel}</Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onRetake}>\n {t(\"id_check.photo_preview.retake\", \"Reprendre la photo\")}\n </Button>\n }\n />\n }\n >\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">{title}</Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"w-full\">\n <div className=\"mb-2\">\n <span className=\"inline-block bg-gray-100 text-gray-700 px-3 py-1 rounded-full text-xs font-medium\">\n {sideLabel}\n </span>\n </div>\n <div className=\"relative rounded-lg overflow-hidden border-2 border-gray-200 bg-gray-50\">\n <img\n src={imageUrl}\n alt={sideLabel}\n className=\"w-full h-56 md:h-64 object-contain bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default PhotoPreview;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;AAgBA,IAAM,YAAY,GAAgC,UAAC,EAMlD,EAAA;AALC,IAAA,IAAA,QAAQ,cAAA,EACR,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,qBAAqB,EAArB,aAAa,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,KAAA,EACrB,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,QAAQ,GAAA,EAAA,CAAA,QAAA;AAEA,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;AAET,IAAA,IAAM,OAAO,GAAG,IAAI,KAAK,OAAO;IAEhC,IAAM,KAAK,GAAG;AACZ,UAAE;AACA,cAAE,CAAC,CAAC,qCAAqC,EAAE,sBAAsB;AACjE,cAAE,CAAC,CAAC,oCAAoC,EAAE,mBAAmB;AAC/D,UAAE,CAAC,CAAC,oCAAoC,EAAE,mBAAmB,CAAC;IAEhE,IAAM,QAAQ,GAAG;AACf,UAAE;AACA,cAAE,CAAC,CAAC,wCAAwC,EAAE,wCAAwC;AACtF,cAAE,CAAC,CAAC,uCAAuC,EAAE,kCAAkC;AACjF,UAAE,CAAC,CAAC,uCAAuC,EAAE,kCAAkC,CAAC;AAElF,IAAA,IAAM,aAAa,GAAG,OAAO,IAAI,CAAC;AAChC,UAAE,CAAC,CAAC,uCAAuC,EAAE,mCAAmC;AAChF,UAAE,CAAC,CAAC,iCAAiC,EAAE,SAAS,CAAC;IAEnD,IAAM,SAAS,GAAG;AAChB,UAAE,CAAC,CAAC,oCAAoC,EAAE,UAAU;AACpD,UAAE;AACA,cAAE,CAAC,CAAC,6BAA6B,EAAE,OAAO;AAC1C,cAAE,CAAC,CAAC,6BAA6B,EAAE,OAAO,CAAC;IAE/C,QACEA,GAAA,CAAC,gBAAgB,EAAA,EACf,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EACLA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,UAAU,EAAA,QAAA,EAAG,aAAa,EAAA,CAAU,EAEvD,SAAS,EACPA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,QAAQ,EAAA,QAAA,EAC1C,CAAC,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,EAAA,CAClD,EAAA,CAEX,EAAA,QAAA,EAGJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAE,KAAK,EAAA,CAAS,EAClEA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACxD,QAAQ,EAAA,CACA,CAAA,EAAA,CACP,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,QAAQ,EAAA,QAAA,EAAA,CACrBD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EACnBA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,mFAAmF,EAAA,QAAA,EAChG,SAAS,EAAA,CACL,EAAA,CACH,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yEAAyE,EAAA,QAAA,EACtFA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,SAAS,EACd,SAAS,EAAC,6CAA6C,EAAA,CACvD,EAAA,CACE,CAAA,EAAA,CACF,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
|
|
@@ -11,7 +11,7 @@ import { requiresTwoSides } from '../../utils/documentLabels.js';
|
|
|
11
11
|
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
12
12
|
|
|
13
13
|
var JDIDocumentUpload = function (_a) {
|
|
14
|
-
var documentType = _a.documentType, onUpload = _a.onUpload, onBack = _a.onBack, documentTypeId = _a.documentTypeId, documentLabel = _a.documentLabel, _b = _a.initialFront, initialFront = _b === void 0 ? null : _b, _c = _a.initialBack, initialBack = _c === void 0 ? null : _c;
|
|
14
|
+
var documentType = _a.documentType, onUpload = _a.onUpload, onBack = _a.onBack, documentTypeId = _a.documentTypeId, documentLabel = _a.documentLabel, _b = _a.initialFront, initialFront = _b === void 0 ? null : _b, _c = _a.initialBack, initialBack = _c === void 0 ? null : _c; _a.sessionId;
|
|
15
15
|
var t = useI18n().t;
|
|
16
16
|
// Helper functions for conditional text
|
|
17
17
|
var getDropZoneText = function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDIDocumentUpload.js","sources":["../../../../../src/components/jdi/JDIDocumentUpload.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\n\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Card } from \"../ui/Card\";\nimport PDFPreview from \"../ui/PDFPreview\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n convertFileToSupportedFormat,\n fileToBase64,\n isPDF,\n isValidFileType,\n isValidFileSize,\n isValidBase64Data,\n} from \"../../utils/fileConverter\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface JDIDocumentUploadProps {\n documentType: string;\n onUpload: (files: onUploadFiles) => void;\n onBack: () => void;\n documentTypeId?: string; // Pour identifier des types spécifiques comme jdd ou income-proof\n documentLabel?: string; // Le label lisible du document sélectionné (ex: \"Carte nationale d'identité\")\n initialFront?: string | null; // Base64 du recto déjà déposé (ex: après erreur 2.5)\n initialBack?: string | null; // Base64 du verso déjà déposé (ex: après erreur 2.5)\n}\n\nconst JDIDocumentUpload = ({\n documentType,\n onUpload,\n onBack,\n documentTypeId,\n documentLabel,\n initialFront = null,\n initialBack = null,\n}: JDIDocumentUploadProps) => {\n const { t } = useI18n();\n\n // Helper functions for conditional text\n const getDropZoneText = () => {\n return t(\"jdi.document_upload.drop_zone\", {\n document: t(\"documentTypes.\" + documentType),\n });\n };\n\n const getUploadInstruction = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_upload.upload_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_upload.upload_income_proof\");\n default:\n return t(\"jdi.document_upload.upload_identity\", {\n document: t(\"documentTypes.\" + documentType),\n });\n }\n };\n\n const getValidateButtonText = () => {\n if (isUploading) {\n return t(\"jdi.document_upload.uploading\");\n }\n return documentTypeId === \"jdd\" || documentTypeId === \"income-proof\"\n ? t(\"jdi.document_upload.validate_single\")\n : t(\"jdi.document_upload.validate_multiple\");\n };\n // Ajout de logs pour le débogage\n useEffect(() => {\n // Vérifier si le document type est valide\n if (!documentType) {\n console.error(\"JDIDocumentUpload: documentType is missing or invalid\", {\n documentType,\n documentTypeId,\n });\n }\n }, [documentType, documentTypeId, documentLabel]);\n\n // Store File objects instead of base64 strings\n // initialFront/initialBack permettent de pré-remplir en cas de retry (ex: erreur 2.5)\n const [frontFile, setFrontFile] = useState<File | null>(null);\n const [backFile, setBackFile] = useState<File | null>(null);\n const [frontPreview, setFrontPreview] = useState<string | null>(initialFront ?? null);\n const [backPreview, setBackPreview] = useState<string | null>(initialBack ?? null);\n // Indique que le recto/verso vient d'un dépôt précédent (pas un File local)\n const [isFrontFromInitial, setIsFrontFromInitial] = useState<boolean>(!!initialFront);\n const [isBackFromInitial, setIsBackFromInitial] = useState<boolean>(!!initialBack);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<string>(\"\");\n const [isDragging, setIsDragging] = useState(false);\n\n const frontInputRef = useRef<HTMLInputElement>(null);\n const multipleInputRef = useRef<HTMLInputElement>(null);\n const dropZoneRef = useRef<HTMLDivElement>(null);\n const twoSidesRequired = requiresTwoSides(documentType);\n\n // Nouvelle fonction pour gérer la sélection multiple de fichiers\n const handleMultipleFileChange = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n // Vérifier le nombre de fichiers - maximum 2 fichiers\n if (files.length > 2) {\n setError(t(\"jdi.document_upload.errors.max_files\"));\n return;\n } else if (files.length === 0) {\n setError(t(\"jdi.document_upload.errors.min_files\"));\n return;\n }\n\n setError(\"\");\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n\n // Traiter chaque fichier\n for (let index = 0; index < files.length; index++) {\n let currentFile = files[index];\n\n try {\n currentFile = await convertFileToSupportedFormat(currentFile);\n } catch (conversionError) {\n console.error(\n \"handleMultipleFileChange: HEIC conversion failed\",\n conversionError,\n );\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n // Valider le type de fichier\n if (!isValidFileType(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.invalid_file_type_indexed\", {\n index: index + 1,\n }),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n // Valider la taille du fichier\n if (!isValidFileSize(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.file_too_large_indexed\", {\n index: index + 1,\n }),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n if (index === 0) {\n // Premier fichier = recto\n setFrontFile(currentFile);\n } else if (index === 1 && twoSidesRequired) {\n // Deuxième fichier = verso (seulement si nécessaire)\n setBackFile(currentFile);\n }\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n\n if (index === 0) {\n setFrontPreview(result);\n } else if (index === 1 && twoSidesRequired) {\n setBackPreview(result);\n }\n };\n reader.readAsDataURL(currentFile);\n }\n };\n\n const handleFileChange = async (\n event: React.ChangeEvent<HTMLInputElement>,\n side: \"front\" | \"back\",\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n let processedFile = file;\n try {\n processedFile = await convertFileToSupportedFormat(file);\n } catch (conversionError) {\n console.error(\n \"handleFileChange: HEIC conversion failed\",\n conversionError,\n );\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n event.target.value = \"\";\n if (side === \"front\" && frontInputRef.current) {\n frontInputRef.current.value = \"\";\n }\n return;\n }\n\n // Validate file type\n if (!isValidFileType(processedFile)) {\n setError(t(\"jdi.document_upload.errors.invalid_file_type\"));\n event.target.value = \"\";\n return;\n }\n\n // Validate file size (max 10MB)\n if (!isValidFileSize(processedFile)) {\n setError(t(\"jdi.document_upload.errors.file_too_large\"));\n event.target.value = \"\";\n return;\n }\n\n setError(\"\");\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n\n if (side === \"front\") {\n setFrontFile(processedFile);\n setFrontPreview(result);\n setIsFrontFromInitial(false);\n } else {\n setBackFile(processedFile);\n setBackPreview(result);\n setIsBackFromInitial(false);\n }\n };\n reader.readAsDataURL(processedFile);\n };\n\n const handleUpload = async () => {\n // Clear previous errors\n setError(\"\");\n\n // Validation : recto obligatoire (soit un File local, soit une valeur initiale)\n if (!frontFile && !isFrontFromInitial) {\n const errorKey =\n documentTypeId === \"jdd\"\n ? \"jdi.document_upload.errors.add_photo_jdd\"\n : documentTypeId === \"income-proof\"\n ? \"jdi.document_upload.errors.add_photo_income_proof\"\n : \"jdi.document_upload.errors.add_photo_identity\";\n\n setError(t(errorKey));\n return;\n }\n\n // Note: For two-sided documents, the back side is no longer mandatory\n // The user can choose to upload only the front side\n\n setIsUploading(true);\n\n try {\n // Recto : soit conversion d'un File, soit réutilisation de la base64 initiale\n let frontBase64: string;\n if (frontFile) {\n frontBase64 = await fileToBase64(frontFile);\n if (!isValidBase64Data(frontBase64)) {\n setError(t(\"jdi.document_upload.errors.front_corrupted\"));\n setIsUploading(false);\n return;\n }\n } else {\n // isFrontFromInitial === true : on réutilise la valeur initiale\n frontBase64 = initialFront!;\n }\n\n let backBase64: string | null = null;\n if (twoSidesRequired) {\n if (backFile) {\n backBase64 = await fileToBase64(backFile);\n if (!isValidBase64Data(backBase64)) {\n setError(t(\"jdi.document_upload.errors.back_corrupted\"));\n setIsUploading(false);\n return;\n }\n } else if (isBackFromInitial) {\n // On réutilise le verso initial\n backBase64 = initialBack!;\n }\n }\n\n const files = {\n front: frontBase64,\n back: twoSidesRequired ? backBase64 : null,\n };\n\n onUpload(files);\n } catch (err) {\n console.error(\"JDIDocumentUpload: Upload error:\", err);\n setError(t(\"jdi.document_upload.errors.upload_error\"));\n setIsUploading(false);\n }\n };\n\n const removeImage = (side: \"front\" | \"back\") => {\n if (side === \"front\") {\n setFrontFile(null);\n setFrontPreview(null);\n setIsFrontFromInitial(false);\n if (frontInputRef.current) frontInputRef.current.value = \"\";\n } else {\n setBackFile(null);\n setBackPreview(null);\n setIsBackFromInitial(false);\n }\n setError(\"\");\n };\n\n const removeAllImages = () => {\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n setIsFrontFromInitial(false);\n setIsBackFromInitial(false);\n if (frontInputRef.current) frontInputRef.current.value = \"\";\n if (multipleInputRef.current) multipleInputRef.current.value = \"\";\n setError(\"\");\n };\n\n // Drag and Drop handlers\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Only set isDragging to false if we're leaving the drop zone entirely\n if (\n dropZoneRef.current &&\n !dropZoneRef.current.contains(e.relatedTarget as Node)\n ) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = e.dataTransfer.files;\n if (!droppedFiles || droppedFiles.length === 0) return;\n\n // Vérifier le nombre de fichiers\n if (droppedFiles.length > 2) {\n setError(t(\"jdi.document_upload.errors.max_files\"));\n return;\n }\n\n // Détermine si on est en mode \"ajout au verso\" :\n // - 1 seul fichier déposé\n // - document recto/verso requis\n // - recto déjà présent via un dépôt utilisateur (pas uniquement via initialFront)\n // - verso pas encore présent\n const hasFrontFromUser = !!(frontFile || (!isFrontFromInitial && frontPreview));\n const hasBack = !!(backFile || isBackFromInitial || backPreview);\n const isAddingVerso =\n droppedFiles.length === 1 && twoSidesRequired && hasFrontFromUser && !hasBack;\n\n // Si on n'est pas en mode ajout verso, on repart de zéro\n if (!isAddingVerso) {\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n setIsFrontFromInitial(false);\n setIsBackFromInitial(false);\n }\n\n setError(\"\");\n\n // Traiter chaque fichier\n for (let index = 0; index < droppedFiles.length; index++) {\n let currentFile = droppedFiles[index];\n\n try {\n currentFile = await convertFileToSupportedFormat(currentFile);\n } catch (conversionError) {\n console.error(\"handleDrop: HEIC conversion failed\", conversionError);\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n return;\n }\n\n // Valider le type de fichier\n if (!isValidFileType(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.invalid_file_type_indexed\", {\n index: index + 1,\n }),\n );\n return;\n }\n\n // Valider la taille du fichier\n if (!isValidFileSize(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.file_too_large_indexed\", {\n index: index + 1,\n }),\n );\n return;\n }\n\n // En mode ajout verso : le fichier unique devient le verso\n // Sinon : index 0 = recto, index 1 = verso\n const isVersoSlot = isAddingVerso || (index === 1 && twoSidesRequired);\n\n if (!isVersoSlot) {\n setFrontFile(currentFile);\n } else if (twoSidesRequired) {\n setBackFile(currentFile);\n }\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (ev) => {\n const result = ev.target?.result as string;\n if (!isVersoSlot) {\n setFrontPreview(result);\n } else if (twoSidesRequired) {\n setBackPreview(result);\n }\n };\n reader.readAsDataURL(currentFile);\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleUpload}\n disabled={(!frontFile && !isFrontFromInitial) || isUploading}\n >\n {getValidateButtonText()}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack} disabled={isUploading}>\n {t(\"jdi.document_upload.back\")}\n </Button>\n }\n />\n }\n >\n {/* Main content */}\n <div className=\"flex-1 flex items-start justify-center md:items-center p-4\">\n <div className=\"w-full max-w-lg\">\n {/* Header */}\n <div className=\"text-center mb-8\">\n <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-2\">\n {getDropZoneText()}\n </h1>\n <p className=\"text-gray-600\">{getUploadInstruction()}</p>\n </div>\n\n {/* Upload Card */}\n <Card\n ref={dropZoneRef}\n className={`border-2 border-dashed ${\n isDragging\n ? \"border-teal-500 bg-teal-100/50\"\n : \"border-teal-300 bg-teal-50/30\"\n } p-8 mb-6 transition-colors`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"text-center space-y-6\">\n {!frontPreview ? (\n <>\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {t(\"documentTypes.\" + documentType)}\n </h3>\n\n <div className=\"flex justify-center w-full\">\n <Button\n onClick={() => frontInputRef.current?.click()}\n className=\"border border-teal-300 text-teal-600 bg-transparent hover:bg-teal-50 px-4 py-2 rounded-lg font-medium text-sm mx-auto flex items-center\"\n disabled={isUploading}\n >\n <span>{t(\"jdi.document_upload.add_file\")}</span>\n </Button>\n </div>\n\n <p className=\"text-sm text-gray-500 italic\">\n {t(\n \"jdi.document_upload.drag_drop_hint\",\n \"ou glissez-déposez vos fichiers ici\",\n )}\n </p>\n\n <div className=\"text-sm text-gray-600 space-y-1\">\n <p>{t(\"jdi.document_upload.accepted_formats\")}</p>\n <p>\n {twoSidesRequired\n ? frontPreview\n ? t(\"jdi.document_upload.add_back_side\")\n : t(\"jdi.document_upload.multiple_files_info\")\n : t(\"jdi.document_upload.single_file_info\")}\n </p>\n </div>\n </>\n ) : (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {twoSidesRequired && frontPreview && backPreview\n ? t(\"jdi.document_upload.documents_added\")\n : t(\"jdi.document_upload.document_added\")}\n </h3>\n\n {/* Preview du document recto */}\n <div className=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div className=\"mb-3\">\n <p className=\"text-sm font-medium text-gray-900 mb-1\">\n {twoSidesRequired && backPreview\n ? t(\"jdi.document_upload.front_side\")\n : t(\"documentTypes.\" + documentType)}\n </p>\n <p className=\"text-xs text-gray-500\">\n {isPDF(frontFile)\n ? t(\"jdi.document_upload.pdf_preview\")\n : t(\"jdi.document_upload.image_preview\")}\n </p>\n </div>\n {isPDF(frontFile) ? (\n <PDFPreview src={frontPreview} className=\"mb-3\" />\n ) : (\n <img\n src={frontPreview || \"/placeholder.svg\"}\n alt=\"Document\"\n className=\"w-full h-48 object-contain bg-gray-50 rounded-lg border mb-3\"\n />\n )}\n <div className=\"flex justify-end gap-2\">\n {twoSidesRequired && frontPreview && backPreview ? (\n <button\n onClick={removeAllImages}\n className=\"text-red-500 hover:text-red-700 p-1 text-sm\"\n disabled={isUploading}\n >\n {t(\"jdi.document_upload.restart\")}\n </button>\n ) : (\n <>\n <button\n onClick={() => frontInputRef.current?.click()}\n className=\"text-teal-600 hover:text-teal-700 p-1 text-sm\"\n disabled={isUploading}\n title=\"Changer le document\"\n >\n {t(\"jdi.document_upload.change\")}\n </button>\n <button\n onClick={() => removeImage(\"front\")}\n className=\"text-red-500 hover:text-red-700 p-1\"\n disabled={isUploading}\n title=\"Supprimer le document\"\n >\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Preview du document verso (si présent) */}\n {twoSidesRequired && backPreview && (\n <div className=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div className=\"mb-3\">\n <p className=\"text-sm font-medium text-gray-900 mb-1\">\n {t(\"jdi.document_upload.back_side\")}\n </p>\n <p className=\"text-xs text-gray-500\">\n {isPDF(frontFile)\n ? t(\"jdi.document_upload.pdf_preview\")\n : t(\"jdi.document_upload.image_preview\")}\n </p>\n </div>\n {isPDF(backFile) ? (\n <PDFPreview src={backPreview || \"\"} className=\"mb-3\" />\n ) : (\n <img\n src={backPreview || \"\"}\n alt=\"Verso\"\n className=\"w-full h-48 object-contain bg-gray-50 rounded-lg border mb-3\"\n />\n )}\n </div>\n )}\n\n {/* Bouton pour ajouter le verso si c'est un document recto/verso et qu'on n'a pas encore le verso */}\n {twoSidesRequired && !backPreview && (\n <div className=\"flex justify-center mt-4\">\n <Button\n onClick={() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*,.pdf\";\n input.onchange = (e) =>\n handleFileChange(e as any, \"back\");\n input.click();\n }}\n className=\"border border-teal-300 text-teal-600 bg-transparent hover:bg-teal-50 px-4 py-2 rounded-lg font-medium text-sm flex items-center\"\n disabled={isUploading}\n >\n <span>{t(\"jdi.document_upload.add_back\")}</span>\n </Button>\n </div>\n )}\n\n <div className=\"text-sm text-gray-600\">\n <p>\n {twoSidesRequired && backPreview\n ? t(\"jdi.document_upload.documents_ready\")\n : t(\"jdi.document_upload.document_ready\")}\n </p>\n </div>\n </div>\n )}\n </div>\n </Card>\n\n {/* Input pour un seul fichier */}\n <input\n ref={frontInputRef}\n type=\"file\"\n accept=\"image/*,.pdf\"\n onChange={(e) => handleFileChange(e, \"front\")}\n className=\"hidden\"\n />\n\n {/* Input pour plusieurs fichiers (recto/verso) */}\n <input\n ref={multipleInputRef}\n type=\"file\"\n accept=\"image/*,.pdf\"\n multiple={twoSidesRequired}\n onChange={handleMultipleFileChange}\n className=\"hidden\"\n />\n\n {/* Error message */}\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4 mb-6\">\n <p className=\"text-sm text-red-600 flex items-center\">\n <span className=\"mr-2\">⚠</span>\n {error}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentUpload;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDIDocumentUpload.js","sources":["../../../../../src/components/jdi/JDIDocumentUpload.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from \"react\";\n\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Card } from \"../ui/Card\";\nimport PDFPreview from \"../ui/PDFPreview\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n convertFileToSupportedFormat,\n fileToBase64,\n isPDF,\n isValidFileType,\n isValidFileSize,\n isValidBase64Data,\n} from \"../../utils/fileConverter\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport {\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\n\ninterface JDIDocumentUploadProps {\n documentType: string;\n onUpload: (files: onUploadFiles) => void;\n onBack: () => void;\n documentTypeId?: string; // Pour identifier des types spécifiques comme jdd ou income-proof\n documentLabel?: string; // Le label lisible du document sélectionné (ex: \"Carte nationale d'identité\")\n initialFront?: string | null; // Base64 du recto déjà déposé (ex: après erreur 2.5)\n initialBack?: string | null; // Base64 du verso déjà déposé (ex: après erreur 2.5)\n sessionId?: string;\n}\n\nconst JDIDocumentUpload = ({\n documentType,\n onUpload,\n onBack,\n documentTypeId,\n documentLabel,\n initialFront = null,\n initialBack = null,\n sessionId,\n}: JDIDocumentUploadProps) => {\n const { t } = useI18n();\n\n // Helper functions for conditional text\n const getDropZoneText = () => {\n return t(\"jdi.document_upload.drop_zone\", {\n document: t(\"documentTypes.\" + documentType),\n });\n };\n\n const getUploadInstruction = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_upload.upload_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_upload.upload_income_proof\");\n default:\n return t(\"jdi.document_upload.upload_identity\", {\n document: t(\"documentTypes.\" + documentType),\n });\n }\n };\n\n const getValidateButtonText = () => {\n if (isUploading) {\n return t(\"jdi.document_upload.uploading\");\n }\n return documentTypeId === \"jdd\" || documentTypeId === \"income-proof\"\n ? t(\"jdi.document_upload.validate_single\")\n : t(\"jdi.document_upload.validate_multiple\");\n };\n // Ajout de logs pour le débogage\n useEffect(() => {\n // Vérifier si le document type est valide\n if (!documentType) {\n console.error(\"JDIDocumentUpload: documentType is missing or invalid\", {\n documentType,\n documentTypeId,\n });\n }\n }, [documentType, documentTypeId, documentLabel]);\n\n // Store File objects instead of base64 strings\n // initialFront/initialBack permettent de pré-remplir en cas de retry (ex: erreur 2.5)\n const [frontFile, setFrontFile] = useState<File | null>(null);\n const [backFile, setBackFile] = useState<File | null>(null);\n const [frontPreview, setFrontPreview] = useState<string | null>(initialFront ?? null);\n const [backPreview, setBackPreview] = useState<string | null>(initialBack ?? null);\n // Indique que le recto/verso vient d'un dépôt précédent (pas un File local)\n const [isFrontFromInitial, setIsFrontFromInitial] = useState<boolean>(!!initialFront);\n const [isBackFromInitial, setIsBackFromInitial] = useState<boolean>(!!initialBack);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<string>(\"\");\n const [isDragging, setIsDragging] = useState(false);\n\n const frontInputRef = useRef<HTMLInputElement>(null);\n const multipleInputRef = useRef<HTMLInputElement>(null);\n const dropZoneRef = useRef<HTMLDivElement>(null);\n const twoSidesRequired = requiresTwoSides(documentType);\n\n // Nouvelle fonction pour gérer la sélection multiple de fichiers\n const handleMultipleFileChange = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n // Vérifier le nombre de fichiers - maximum 2 fichiers\n if (files.length > 2) {\n setError(t(\"jdi.document_upload.errors.max_files\"));\n return;\n } else if (files.length === 0) {\n setError(t(\"jdi.document_upload.errors.min_files\"));\n return;\n }\n\n setError(\"\");\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n\n // Traiter chaque fichier\n for (let index = 0; index < files.length; index++) {\n let currentFile = files[index];\n\n try {\n currentFile = await convertFileToSupportedFormat(currentFile);\n } catch (conversionError) {\n console.error(\n \"handleMultipleFileChange: HEIC conversion failed\",\n conversionError,\n );\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n // Valider le type de fichier\n if (!isValidFileType(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.invalid_file_type_indexed\", {\n index: index + 1,\n }),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n // Valider la taille du fichier\n if (!isValidFileSize(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.file_too_large_indexed\", {\n index: index + 1,\n }),\n );\n event.target.value = \"\";\n if (multipleInputRef.current) {\n multipleInputRef.current.value = \"\";\n }\n return;\n }\n\n if (index === 0) {\n // Premier fichier = recto\n setFrontFile(currentFile);\n } else if (index === 1 && twoSidesRequired) {\n // Deuxième fichier = verso (seulement si nécessaire)\n setBackFile(currentFile);\n }\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n\n if (index === 0) {\n setFrontPreview(result);\n } else if (index === 1 && twoSidesRequired) {\n setBackPreview(result);\n }\n };\n reader.readAsDataURL(currentFile);\n }\n };\n\n const handleFileChange = async (\n event: React.ChangeEvent<HTMLInputElement>,\n side: \"front\" | \"back\",\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n let processedFile = file;\n try {\n processedFile = await convertFileToSupportedFormat(file);\n } catch (conversionError) {\n console.error(\n \"handleFileChange: HEIC conversion failed\",\n conversionError,\n );\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n event.target.value = \"\";\n if (side === \"front\" && frontInputRef.current) {\n frontInputRef.current.value = \"\";\n }\n return;\n }\n\n // Validate file type\n if (!isValidFileType(processedFile)) {\n setError(t(\"jdi.document_upload.errors.invalid_file_type\"));\n event.target.value = \"\";\n return;\n }\n\n // Validate file size (max 10MB)\n if (!isValidFileSize(processedFile)) {\n setError(t(\"jdi.document_upload.errors.file_too_large\"));\n event.target.value = \"\";\n return;\n }\n\n setError(\"\");\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n\n if (side === \"front\") {\n setFrontFile(processedFile);\n setFrontPreview(result);\n setIsFrontFromInitial(false);\n } else {\n setBackFile(processedFile);\n setBackPreview(result);\n setIsBackFromInitial(false);\n }\n };\n reader.readAsDataURL(processedFile);\n };\n\n const handleUpload = async () => {\n // Clear previous errors\n setError(\"\");\n\n // Validation : recto obligatoire (soit un File local, soit une valeur initiale)\n if (!frontFile && !isFrontFromInitial) {\n const errorKey =\n documentTypeId === \"jdd\"\n ? \"jdi.document_upload.errors.add_photo_jdd\"\n : documentTypeId === \"income-proof\"\n ? \"jdi.document_upload.errors.add_photo_income_proof\"\n : \"jdi.document_upload.errors.add_photo_identity\";\n\n setError(t(errorKey));\n return;\n }\n\n // Note: For two-sided documents, the back side is no longer mandatory\n // The user can choose to upload only the front side\n\n setIsUploading(true);\n\n try {\n // Recto : soit conversion d'un File, soit réutilisation de la base64 initiale\n let frontBase64: string;\n if (frontFile) {\n frontBase64 = await fileToBase64(frontFile);\n if (!isValidBase64Data(frontBase64)) {\n setError(t(\"jdi.document_upload.errors.front_corrupted\"));\n setIsUploading(false);\n return;\n }\n } else {\n // isFrontFromInitial === true : on réutilise la valeur initiale\n frontBase64 = initialFront!;\n }\n\n let backBase64: string | null = null;\n if (twoSidesRequired) {\n if (backFile) {\n backBase64 = await fileToBase64(backFile);\n if (!isValidBase64Data(backBase64)) {\n setError(t(\"jdi.document_upload.errors.back_corrupted\"));\n setIsUploading(false);\n return;\n }\n } else if (isBackFromInitial) {\n // On réutilise le verso initial\n backBase64 = initialBack!;\n }\n }\n\n const files = {\n front: frontBase64,\n back: twoSidesRequired ? backBase64 : null,\n };\n\n onUpload(files);\n } catch (err) {\n console.error(\"JDIDocumentUpload: Upload error:\", err);\n setError(t(\"jdi.document_upload.errors.upload_error\"));\n setIsUploading(false);\n }\n };\n\n const removeImage = (side: \"front\" | \"back\") => {\n if (side === \"front\") {\n setFrontFile(null);\n setFrontPreview(null);\n setIsFrontFromInitial(false);\n if (frontInputRef.current) frontInputRef.current.value = \"\";\n } else {\n setBackFile(null);\n setBackPreview(null);\n setIsBackFromInitial(false);\n }\n setError(\"\");\n };\n\n const removeAllImages = () => {\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n setIsFrontFromInitial(false);\n setIsBackFromInitial(false);\n if (frontInputRef.current) frontInputRef.current.value = \"\";\n if (multipleInputRef.current) multipleInputRef.current.value = \"\";\n setError(\"\");\n };\n\n // Drag and Drop handlers\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Only set isDragging to false if we're leaving the drop zone entirely\n if (\n dropZoneRef.current &&\n !dropZoneRef.current.contains(e.relatedTarget as Node)\n ) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(false);\n\n const droppedFiles = e.dataTransfer.files;\n if (!droppedFiles || droppedFiles.length === 0) return;\n\n // Vérifier le nombre de fichiers\n if (droppedFiles.length > 2) {\n setError(t(\"jdi.document_upload.errors.max_files\"));\n return;\n }\n\n // Détermine si on est en mode \"ajout au verso\" :\n // - 1 seul fichier déposé\n // - document recto/verso requis\n // - recto déjà présent via un dépôt utilisateur (pas uniquement via initialFront)\n // - verso pas encore présent\n const hasFrontFromUser = !!(frontFile || (!isFrontFromInitial && frontPreview));\n const hasBack = !!(backFile || isBackFromInitial || backPreview);\n const isAddingVerso =\n droppedFiles.length === 1 && twoSidesRequired && hasFrontFromUser && !hasBack;\n\n // Si on n'est pas en mode ajout verso, on repart de zéro\n if (!isAddingVerso) {\n setFrontFile(null);\n setBackFile(null);\n setFrontPreview(null);\n setBackPreview(null);\n setIsFrontFromInitial(false);\n setIsBackFromInitial(false);\n }\n\n setError(\"\");\n\n // Traiter chaque fichier\n for (let index = 0; index < droppedFiles.length; index++) {\n let currentFile = droppedFiles[index];\n\n try {\n currentFile = await convertFileToSupportedFormat(currentFile);\n } catch (conversionError) {\n console.error(\"handleDrop: HEIC conversion failed\", conversionError);\n setError(\n conversionError instanceof Error\n ? conversionError.message\n : t(\"jdi.document_upload.errors.heic_unsupported\"),\n );\n return;\n }\n\n // Valider le type de fichier\n if (!isValidFileType(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.invalid_file_type_indexed\", {\n index: index + 1,\n }),\n );\n return;\n }\n\n // Valider la taille du fichier\n if (!isValidFileSize(currentFile)) {\n setError(\n t(\"jdi.document_upload.errors.file_too_large_indexed\", {\n index: index + 1,\n }),\n );\n return;\n }\n\n // En mode ajout verso : le fichier unique devient le verso\n // Sinon : index 0 = recto, index 1 = verso\n const isVersoSlot = isAddingVerso || (index === 1 && twoSidesRequired);\n\n if (!isVersoSlot) {\n setFrontFile(currentFile);\n } else if (twoSidesRequired) {\n setBackFile(currentFile);\n }\n\n // Store File object and create preview\n const reader = new FileReader();\n reader.onload = (ev) => {\n const result = ev.target?.result as string;\n if (!isVersoSlot) {\n setFrontPreview(result);\n } else if (twoSidesRequired) {\n setBackPreview(result);\n }\n };\n reader.readAsDataURL(currentFile);\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleUpload}\n disabled={(!frontFile && !isFrontFromInitial) || isUploading}\n >\n {getValidateButtonText()}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack} disabled={isUploading}>\n {t(\"jdi.document_upload.back\")}\n </Button>\n }\n />\n }\n >\n {/* Main content */}\n <div className=\"flex-1 flex items-start justify-center md:items-center p-4\">\n <div className=\"w-full max-w-lg\">\n {/* Header */}\n <div className=\"text-center mb-8\">\n <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-2\">\n {getDropZoneText()}\n </h1>\n <p className=\"text-gray-600\">{getUploadInstruction()}</p>\n </div>\n\n {/* Upload Card */}\n <Card\n ref={dropZoneRef}\n className={`border-2 border-dashed ${\n isDragging\n ? \"border-teal-500 bg-teal-100/50\"\n : \"border-teal-300 bg-teal-50/30\"\n } p-8 mb-6 transition-colors`}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <div className=\"text-center space-y-6\">\n {!frontPreview ? (\n <>\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">\n {t(\"documentTypes.\" + documentType)}\n </h3>\n\n <div className=\"flex justify-center w-full\">\n <Button\n onClick={() => frontInputRef.current?.click()}\n className=\"border border-teal-300 text-teal-600 bg-transparent hover:bg-teal-50 px-4 py-2 rounded-lg font-medium text-sm mx-auto flex items-center\"\n disabled={isUploading}\n >\n <span>{t(\"jdi.document_upload.add_file\")}</span>\n </Button>\n </div>\n\n <p className=\"text-sm text-gray-500 italic\">\n {t(\n \"jdi.document_upload.drag_drop_hint\",\n \"ou glissez-déposez vos fichiers ici\",\n )}\n </p>\n\n <div className=\"text-sm text-gray-600 space-y-1\">\n <p>{t(\"jdi.document_upload.accepted_formats\")}</p>\n <p>\n {twoSidesRequired\n ? frontPreview\n ? t(\"jdi.document_upload.add_back_side\")\n : t(\"jdi.document_upload.multiple_files_info\")\n : t(\"jdi.document_upload.single_file_info\")}\n </p>\n </div>\n </>\n ) : (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {twoSidesRequired && frontPreview && backPreview\n ? t(\"jdi.document_upload.documents_added\")\n : t(\"jdi.document_upload.document_added\")}\n </h3>\n\n {/* Preview du document recto */}\n <div className=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div className=\"mb-3\">\n <p className=\"text-sm font-medium text-gray-900 mb-1\">\n {twoSidesRequired && backPreview\n ? t(\"jdi.document_upload.front_side\")\n : t(\"documentTypes.\" + documentType)}\n </p>\n <p className=\"text-xs text-gray-500\">\n {isPDF(frontFile)\n ? t(\"jdi.document_upload.pdf_preview\")\n : t(\"jdi.document_upload.image_preview\")}\n </p>\n </div>\n {isPDF(frontFile) ? (\n <PDFPreview src={frontPreview} className=\"mb-3\" />\n ) : (\n <img\n src={frontPreview || \"/placeholder.svg\"}\n alt=\"Document\"\n className=\"w-full h-48 object-contain bg-gray-50 rounded-lg border mb-3\"\n />\n )}\n <div className=\"flex justify-end gap-2\">\n {twoSidesRequired && frontPreview && backPreview ? (\n <button\n onClick={removeAllImages}\n className=\"text-red-500 hover:text-red-700 p-1 text-sm\"\n disabled={isUploading}\n >\n {t(\"jdi.document_upload.restart\")}\n </button>\n ) : (\n <>\n <button\n onClick={() => frontInputRef.current?.click()}\n className=\"text-teal-600 hover:text-teal-700 p-1 text-sm\"\n disabled={isUploading}\n title=\"Changer le document\"\n >\n {t(\"jdi.document_upload.change\")}\n </button>\n <button\n onClick={() => removeImage(\"front\")}\n className=\"text-red-500 hover:text-red-700 p-1\"\n disabled={isUploading}\n title=\"Supprimer le document\"\n >\n <svg\n className=\"h-5 w-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Preview du document verso (si présent) */}\n {twoSidesRequired && backPreview && (\n <div className=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div className=\"mb-3\">\n <p className=\"text-sm font-medium text-gray-900 mb-1\">\n {t(\"jdi.document_upload.back_side\")}\n </p>\n <p className=\"text-xs text-gray-500\">\n {isPDF(frontFile)\n ? t(\"jdi.document_upload.pdf_preview\")\n : t(\"jdi.document_upload.image_preview\")}\n </p>\n </div>\n {isPDF(backFile) ? (\n <PDFPreview src={backPreview || \"\"} className=\"mb-3\" />\n ) : (\n <img\n src={backPreview || \"\"}\n alt=\"Verso\"\n className=\"w-full h-48 object-contain bg-gray-50 rounded-lg border mb-3\"\n />\n )}\n </div>\n )}\n\n {/* Bouton pour ajouter le verso si c'est un document recto/verso et qu'on n'a pas encore le verso */}\n {twoSidesRequired && !backPreview && (\n <div className=\"flex justify-center mt-4\">\n <Button\n onClick={() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*,.pdf\";\n input.onchange = (e) =>\n handleFileChange(e as any, \"back\");\n input.click();\n }}\n className=\"border border-teal-300 text-teal-600 bg-transparent hover:bg-teal-50 px-4 py-2 rounded-lg font-medium text-sm flex items-center\"\n disabled={isUploading}\n >\n <span>{t(\"jdi.document_upload.add_back\")}</span>\n </Button>\n </div>\n )}\n\n <div className=\"text-sm text-gray-600\">\n <p>\n {twoSidesRequired && backPreview\n ? t(\"jdi.document_upload.documents_ready\")\n : t(\"jdi.document_upload.document_ready\")}\n </p>\n </div>\n </div>\n )}\n </div>\n </Card>\n\n {/* Input pour un seul fichier */}\n <input\n ref={frontInputRef}\n type=\"file\"\n accept=\"image/*,.pdf\"\n onChange={(e) => handleFileChange(e, \"front\")}\n className=\"hidden\"\n />\n\n {/* Input pour plusieurs fichiers (recto/verso) */}\n <input\n ref={multipleInputRef}\n type=\"file\"\n accept=\"image/*,.pdf\"\n multiple={twoSidesRequired}\n onChange={handleMultipleFileChange}\n className=\"hidden\"\n />\n\n {/* Error message */}\n {error && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4 mb-6\">\n <p className=\"text-sm text-red-600 flex items-center\">\n <span className=\"mr-2\">⚠</span>\n {error}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentUpload;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;AAkCA,IAAM,iBAAiB,GAAG,UAAC,EASF,EAAA;AARvB,IAAA,IAAA,YAAY,GAAA,EAAA,CAAA,YAAA,CAAA,CACZ,QAAQ,GAAA,EAAA,CAAA,QAAA,CAAA,CACR,MAAM,GAAA,EAAA,CAAA,MAAA,CAAA,CACN,cAAc,GAAA,EAAA,CAAA,cAAA,CAAA,CACd,aAAa,GAAA,EAAA,CAAA,aAAA,CAAA,CACb,EAAA,GAAA,EAAA,CAAA,YAAmB,CAAA,CAAnB,YAAY,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,CAAA,CACnB,EAAA,GAAA,EAAA,CAAA,WAAkB,CAAA,CAAlB,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,CAAA,CACT,EAAA,CAAA;AAED,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;;AAGT,IAAA,IAAM,eAAe,GAAG,YAAA;QACtB,OAAO,CAAC,CAAC,+BAA+B,EAAE;AACxC,YAAA,QAAQ,EAAE,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC;AAC7C,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,IAAM,oBAAoB,GAAG,YAAA;QAC3B,QAAQ,cAAc;AACpB,YAAA,KAAK,KAAK;AACR,gBAAA,OAAO,CAAC,CAAC,gCAAgC,CAAC;AAC5C,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,CAAC,CAAC,yCAAyC,CAAC;AACrD,YAAA;gBACE,OAAO,CAAC,CAAC,qCAAqC,EAAE;AAC9C,oBAAA,QAAQ,EAAE,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC;AAC7C,iBAAA,CAAC;;AAER,IAAA,CAAC;AAED,IAAA,IAAM,qBAAqB,GAAG,YAAA;QAC5B,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,CAAC,CAAC,+BAA+B,CAAC;QAC3C;AACA,QAAA,OAAO,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK;AACpD,cAAE,CAAC,CAAC,qCAAqC;AACzC,cAAE,CAAC,CAAC,uCAAuC,CAAC;AAChD,IAAA,CAAC;;AAED,IAAA,SAAS,CAAC,YAAA;;QAER,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,CAAC,KAAK,CAAC,uDAAuD,EAAE;AACrE,gBAAA,YAAY,EAAA,YAAA;AACZ,gBAAA,cAAc,EAAA,cAAA;AACf,aAAA,CAAC;QACJ;IACF,CAAC,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;;;IAI3C,IAAA,EAAA,GAA4B,QAAQ,CAAc,IAAI,CAAC,EAAtD,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,GAAA,EAAA,CAAA,CAAA,CAA+B;IACvD,IAAA,EAAA,GAA0B,QAAQ,CAAc,IAAI,CAAC,EAApD,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,WAAW,GAAA,EAAA,CAAA,CAAA,CAA+B;AACrD,IAAA,IAAA,KAAkC,QAAQ,CAAgB,YAAY,KAAA,IAAA,IAAZ,YAAY,KAAA,MAAA,GAAZ,YAAY,GAAI,IAAI,CAAC,EAA9E,YAAY,QAAA,EAAE,eAAe,QAAiD;AAC/E,IAAA,IAAA,KAAgC,QAAQ,CAAgB,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAX,WAAW,GAAI,IAAI,CAAC,EAA3E,WAAW,QAAA,EAAE,cAAc,QAAgD;;AAE5E,IAAA,IAAA,EAAA,GAA8C,QAAQ,CAAU,CAAC,CAAC,YAAY,CAAC,EAA9E,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,qBAAqB,QAAqC;AAC/E,IAAA,IAAA,EAAA,GAA4C,QAAQ,CAAU,CAAC,CAAC,WAAW,CAAC,EAA3E,iBAAiB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,oBAAoB,QAAoC;IAC5E,IAAA,EAAA,GAAgC,QAAQ,CAAC,KAAK,CAAC,EAA9C,WAAW,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,cAAc,GAAA,EAAA,CAAA,CAAA,CAAmB;IAC/C,IAAA,EAAA,GAAoB,QAAQ,CAAS,EAAE,CAAC,EAAvC,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAwB;IACxC,IAAA,EAAA,GAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAAmB;AAEnD,IAAA,IAAM,aAAa,GAAG,MAAM,CAAmB,IAAI,CAAC;AACpD,IAAA,IAAM,gBAAgB,GAAG,MAAM,CAAmB,IAAI,CAAC;AACvD,IAAA,IAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC;AAChD,IAAA,IAAM,gBAAgB,GAAG,gBAAgB,CAAC,YAAY,CAAC;;IAGvD,IAAM,wBAAwB,GAAG,UAC/B,KAA0C,EAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;AAEpC,oBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;AAChC,oBAAA,IAAI,CAAC,KAAK;wBAAE,OAAA,CAAA,CAAA,YAAA;;AAGZ,oBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,wBAAA,QAAQ,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;wBACnD,OAAA,CAAA,CAAA,YAAA;oBACF;AAAO,yBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7B,wBAAA,QAAQ,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;wBACnD,OAAA,CAAA,CAAA,YAAA;oBACF;oBAEA,QAAQ,CAAC,EAAE,CAAC;oBACZ,YAAY,CAAC,IAAI,CAAC;oBAClB,WAAW,CAAC,IAAI,CAAC;oBACjB,eAAe,CAAC,IAAI,CAAC;oBACrB,cAAc,CAAC,IAAI,CAAC;wCAGX,KAAK,EAAA;;;;;AACR,oCAAA,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;;;;AAGd,oCAAA,OAAA,CAAA,CAAA,YAAM,4BAA4B,CAAC,WAAW,CAAC,CAAA;;oCAA7D,WAAW,GAAG,SAA+C;;;;AAE7D,oCAAA,OAAO,CAAC,KAAK,CACX,kDAAkD,EAClD,iBAAe,CAChB;oCACD,QAAQ,CACN,iBAAe,YAAY;0CACvB,iBAAe,CAAC;AAClB,0CAAE,CAAC,CAAC,6CAA6C,CAAC,CACrD;AACD,oCAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AACvB,oCAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AAC5B,wCAAA,gBAAgB,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;oCACrC;;;;AAKF,oCAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE;AACjC,wCAAA,QAAQ,CACN,CAAC,CAAC,sDAAsD,EAAE;4CACxD,KAAK,EAAE,KAAK,GAAG,CAAC;AACjB,yCAAA,CAAC,CACH;AACD,wCAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AACvB,wCAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AAC5B,4CAAA,gBAAgB,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;wCACrC;;oCAEF;;AAGA,oCAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE;AACjC,wCAAA,QAAQ,CACN,CAAC,CAAC,mDAAmD,EAAE;4CACrD,KAAK,EAAE,KAAK,GAAG,CAAC;AACjB,yCAAA,CAAC,CACH;AACD,wCAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;AACvB,wCAAA,IAAI,gBAAgB,CAAC,OAAO,EAAE;AAC5B,4CAAA,gBAAgB,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;wCACrC;;oCAEF;AAEA,oCAAA,IAAI,KAAK,KAAK,CAAC,EAAE;;wCAEf,YAAY,CAAC,WAAW,CAAC;oCAC3B;AAAO,yCAAA,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,EAAE;;wCAE1C,WAAW,CAAC,WAAW,CAAC;oCAC1B;AAGM,oCAAA,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,oCAAA,MAAM,CAAC,MAAM,GAAG,UAAC,CAAC,EAAA;;wCAChB,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAgB;AAEzC,wCAAA,IAAI,KAAK,KAAK,CAAC,EAAE;4CACf,eAAe,CAAC,MAAM,CAAC;wCACzB;AAAO,6CAAA,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,EAAE;4CAC1C,cAAc,CAAC,MAAM,CAAC;wCACxB;AACF,oCAAA,CAAC;AACD,oCAAA,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;;;;;AArE1B,oBAAA,KAAK,GAAG,CAAC;;;AAAE,oBAAA,IAAA,EAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA,EAAA,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;kDAA/B,KAAK,CAAA,CAAA;;;;;;;AAA4B,oBAAA,KAAK,EAAE;;;;;SAuElD;AAED,IAAA,IAAM,gBAAgB,GAAG,UACvB,KAA0C,EAC1C,IAAsB,EAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;oBAEhB,IAAI,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,MAAM,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,CAAC,CAAC;AACpC,oBAAA,IAAI,CAAC,IAAI;wBAAE,OAAA,CAAA,CAAA,YAAA;oBAEP,aAAa,GAAG,IAAI;;;;AAEN,oBAAA,OAAA,CAAA,CAAA,YAAM,4BAA4B,CAAC,IAAI,CAAC,CAAA;;oBAAxD,aAAa,GAAG,SAAwC;;;;AAExD,oBAAA,OAAO,CAAC,KAAK,CACX,0CAA0C,EAC1C,iBAAe,CAChB;oBACD,QAAQ,CACN,iBAAe,YAAY;0BACvB,iBAAe,CAAC;AAClB,0BAAE,CAAC,CAAC,6CAA6C,CAAC,CACrD;AACD,oBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;oBACvB,IAAI,IAAI,KAAK,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE;AAC7C,wBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;oBAClC;oBACA,OAAA,CAAA,CAAA,YAAA;;;AAIF,oBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE;AACnC,wBAAA,QAAQ,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC;AAC3D,wBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;wBACvB,OAAA,CAAA,CAAA,YAAA;oBACF;;AAGA,oBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE;AACnC,wBAAA,QAAQ,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;AACxD,wBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;wBACvB,OAAA,CAAA,CAAA,YAAA;oBACF;oBAEA,QAAQ,CAAC,EAAE,CAAC;AAGN,oBAAA,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,oBAAA,MAAM,CAAC,MAAM,GAAG,UAAC,CAAC,EAAA;;wBAChB,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAgB;AAEzC,wBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;4BACpB,YAAY,CAAC,aAAa,CAAC;4BAC3B,eAAe,CAAC,MAAM,CAAC;4BACvB,qBAAqB,CAAC,KAAK,CAAC;wBAC9B;6BAAO;4BACL,WAAW,CAAC,aAAa,CAAC;4BAC1B,cAAc,CAAC,MAAM,CAAC;4BACtB,oBAAoB,CAAC,KAAK,CAAC;wBAC7B;AACF,oBAAA,CAAC;AACD,oBAAA,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC;;;;SACpC;AAED,IAAA,IAAM,YAAY,GAAG,YAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;oBAEnB,QAAQ,CAAC,EAAE,CAAC;;AAGZ,oBAAA,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,EAAE;wBAC/B,QAAQ,GACZ,cAAc,KAAK;AACjB,8BAAE;8BACA,cAAc,KAAK;AACnB,kCAAE;kCACA,+CAA+C;AAEvD,wBAAA,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBACrB,OAAA,CAAA,CAAA,YAAA;oBACF;;;oBAKA,cAAc,CAAC,IAAI,CAAC;;;;AAId,oBAAA,WAAW,SAAQ;AACnB,oBAAA,IAAA,CAAA,SAAS,EAAT,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACY,oBAAA,OAAA,CAAA,CAAA,YAAM,YAAY,CAAC,SAAS,CAAC,CAAA;;oBAA3C,WAAW,GAAG,SAA6B;AAC3C,oBAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE;AACnC,wBAAA,QAAQ,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC;wBACzD,cAAc,CAAC,KAAK,CAAC;wBACrB,OAAA,CAAA,CAAA,YAAA;oBACF;;;;oBAGA,WAAW,GAAG,YAAa;;;oBAGzB,UAAU,GAAkB,IAAI;AAChC,oBAAA,IAAA,CAAA,gBAAgB,EAAhB,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACE,oBAAA,IAAA,CAAA,QAAQ,EAAR,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACW,oBAAA,OAAA,CAAA,CAAA,YAAM,YAAY,CAAC,QAAQ,CAAC,CAAA;;oBAAzC,UAAU,GAAG,SAA4B;AACzC,oBAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE;AAClC,wBAAA,QAAQ,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;wBACxD,cAAc,CAAC,KAAK,CAAC;wBACrB,OAAA,CAAA,CAAA,YAAA;oBACF;;;oBACK,IAAI,iBAAiB,EAAE;;wBAE5B,UAAU,GAAG,WAAY;oBAC3B;;;AAGI,oBAAA,KAAK,GAAG;AACZ,wBAAA,KAAK,EAAE,WAAW;wBAClB,IAAI,EAAE,gBAAgB,GAAG,UAAU,GAAG,IAAI;qBAC3C;oBAED,QAAQ,CAAC,KAAK,CAAC;;;;AAEf,oBAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAG,CAAC;AACtD,oBAAA,QAAQ,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC;oBACtD,cAAc,CAAC,KAAK,CAAC;;;;;SAExB;IAED,IAAM,WAAW,GAAG,UAAC,IAAsB,EAAA;AACzC,QAAsB;YACpB,YAAY,CAAC,IAAI,CAAC;YAClB,eAAe,CAAC,IAAI,CAAC;YACrB,qBAAqB,CAAC,KAAK,CAAC;YAC5B,IAAI,aAAa,CAAC,OAAO;AAAE,gBAAA,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;QAC7D;QAKA,QAAQ,CAAC,EAAE,CAAC;AACd,IAAA,CAAC;AAED,IAAA,IAAM,eAAe,GAAG,YAAA;QACtB,YAAY,CAAC,IAAI,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC;QACjB,eAAe,CAAC,IAAI,CAAC;QACrB,cAAc,CAAC,IAAI,CAAC;QACpB,qBAAqB,CAAC,KAAK,CAAC;QAC5B,oBAAoB,CAAC,KAAK,CAAC;QAC3B,IAAI,aAAa,CAAC,OAAO;AAAE,YAAA,aAAa,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;QAC3D,IAAI,gBAAgB,CAAC,OAAO;AAAE,YAAA,gBAAgB,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;QACjE,QAAQ,CAAC,EAAE,CAAC;AACd,IAAA,CAAC;;IAGD,IAAM,eAAe,GAAG,UAAC,CAAkC,EAAA;QACzD,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;QACnB,aAAa,CAAC,IAAI,CAAC;AACrB,IAAA,CAAC;IAED,IAAM,eAAe,GAAG,UAAC,CAAkC,EAAA;QACzD,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;;QAGnB,IACE,WAAW,CAAC,OAAO;YACnB,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAqB,CAAC,EACtD;YACA,aAAa,CAAC,KAAK,CAAC;QACtB;AACF,IAAA,CAAC;IAED,IAAM,cAAc,GAAG,UAAC,CAAkC,EAAA;QACxD,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;AACrB,IAAA,CAAC;IAED,IAAM,UAAU,GAAG,UAAO,CAAkC,EAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;oBAC1D,CAAC,CAAC,cAAc,EAAE;oBAClB,CAAC,CAAC,eAAe,EAAE;oBACnB,aAAa,CAAC,KAAK,CAAC;AAEd,oBAAA,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK;AACzC,oBAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAA,CAAA,CAAA,YAAA;;AAGhD,oBAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,wBAAA,QAAQ,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;wBACnD,OAAA,CAAA,CAAA,YAAA;oBACF;AAOM,oBAAA,gBAAgB,GAAG,CAAC,EAAE,SAAS,KAAK,CAAC,kBAAkB,IAAI,YAAY,CAAC,CAAC;oBACzE,OAAO,GAAG,CAAC,EAAE,QAAQ,IAAI,iBAAiB,IAAI,WAAW,CAAC;AAC1D,oBAAA,aAAa,GACjB,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,IAAI,gBAAgB,IAAI,CAAC,OAAO;;oBAG/E,IAAI,CAAC,aAAa,EAAE;wBAClB,YAAY,CAAC,IAAI,CAAC;wBAClB,WAAW,CAAC,IAAI,CAAC;wBACjB,eAAe,CAAC,IAAI,CAAC;wBACrB,cAAc,CAAC,IAAI,CAAC;wBACpB,qBAAqB,CAAC,KAAK,CAAC;wBAC5B,oBAAoB,CAAC,KAAK,CAAC;oBAC7B;oBAEA,QAAQ,CAAC,EAAE,CAAC;wCAGH,KAAK,EAAA;;;;;AACR,oCAAA,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;;;;AAGrB,oCAAA,OAAA,CAAA,CAAA,YAAM,4BAA4B,CAAC,WAAW,CAAC,CAAA;;oCAA7D,WAAW,GAAG,SAA+C;;;;AAE7D,oCAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,iBAAe,CAAC;oCACpE,QAAQ,CACN,iBAAe,YAAY;0CACvB,iBAAe,CAAC;AAClB,0CAAE,CAAC,CAAC,6CAA6C,CAAC,CACrD;;;;AAKH,oCAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE;AACjC,wCAAA,QAAQ,CACN,CAAC,CAAC,sDAAsD,EAAE;4CACxD,KAAK,EAAE,KAAK,GAAG,CAAC;AACjB,yCAAA,CAAC,CACH;;oCAEH;;AAGA,oCAAA,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE;AACjC,wCAAA,QAAQ,CACN,CAAC,CAAC,mDAAmD,EAAE;4CACrD,KAAK,EAAE,KAAK,GAAG,CAAC;AACjB,yCAAA,CAAC,CACH;;oCAEH;oCAIM,WAAW,GAAG,aAAa,KAAK,KAAK,KAAK,CAAC,IAAI,gBAAgB,CAAC;oCAEtE,IAAI,CAAC,WAAW,EAAE;wCAChB,YAAY,CAAC,WAAW,CAAC;oCAC3B;yCAAO,IAAI,gBAAgB,EAAE;wCAC3B,WAAW,CAAC,WAAW,CAAC;oCAC1B;AAGM,oCAAA,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,oCAAA,MAAM,CAAC,MAAM,GAAG,UAAC,EAAE,EAAA;;wCACjB,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,EAAE,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAgB;wCAC1C,IAAI,CAAC,WAAW,EAAE;4CAChB,eAAe,CAAC,MAAM,CAAC;wCACzB;6CAAO,IAAI,gBAAgB,EAAE;4CAC3B,cAAc,CAAC,MAAM,CAAC;wCACxB;AACF,oCAAA,CAAC;AACD,oCAAA,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;;;;;AAvD1B,oBAAA,KAAK,GAAG,CAAC;;;AAAE,oBAAA,IAAA,EAAA,KAAK,GAAG,YAAY,CAAC,MAAM,CAAA,EAAA,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;kDAAtC,KAAK,CAAA,CAAA;;;;;;;AAAmC,oBAAA,KAAK,EAAE;;;;;SAyDzD;IAED,QACEA,IAAC,gBAAgB,EAAA,EACf,gBAAgB,EAAC,QAAQ,EACzB,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EACLA,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,kBAAkB,KAAK,WAAW,EAAA,QAAA,EAE3D,qBAAqB,EAAE,EAAA,CACjB,EAEX,SAAS,EACPA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAA,QAAA,EAC/D,CAAC,CAAC,0BAA0B,CAAC,GACvB,EAAA,CAEX,EAAA,QAAA,EAIJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4DAA4D,YACzEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAE9BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,CAC/BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAC9D,eAAe,EAAE,EAAA,CACf,EACLA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,eAAe,EAAA,QAAA,EAAE,oBAAoB,EAAE,EAAA,CAAK,IACrD,EAGNA,GAAA,CAAC,IAAI,EAAA,EACH,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,yBAAA,CAAA,MAAA,CACT;AACE,8BAAE;8BACA,+BAA+B,EAAA,6BAAA,CACR,EAC7B,WAAW,EAAE,eAAe,EAC5B,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,UAAU,YAElBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACnC,CAAC,YAAY,IACZC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACEF,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,0CAA0C,EAAA,QAAA,EACrD,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC,EAAA,CAChC,EAELA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EACzCA,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,sBAAM,OAAA,CAAA,EAAA,GAAA,aAAa,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,EAAE,CAAA,CAAA,CAAA,EAC7C,SAAS,EAAC,yIAAyI,EACnJ,QAAQ,EAAE,WAAW,EAAA,QAAA,EAErBA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,8BAA8B,CAAC,EAAA,CAAQ,EAAA,CACzC,EAAA,CACL,EAENA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,8BAA8B,EAAA,QAAA,EACxC,CAAC,CACA,oCAAoC,EACpC,qCAAqC,CACtC,EAAA,CACC,EAEJC,cAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAC9CD,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,CAAC,CAAC,sCAAsC,CAAC,EAAA,CAAK,EAClDA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EACG;AACC,sDAAE;AACA,0DAAE,CAAC,CAAC,mCAAmC;AACvC,0DAAE,CAAC,CAAC,yCAAyC;sDAC7C,CAAC,CAAC,sCAAsC,CAAC,EAAA,CAC3C,CAAA,EAAA,CACA,CAAA,EAAA,CACL,KAEHC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAChD,gBAAgB,IAAI,YAAY,IAAI;AACnC,8CAAE,CAAC,CAAC,qCAAqC;8CACvC,CAAC,CAAC,oCAAoC,CAAC,GACxC,EAGLC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gDAAgD,EAAA,QAAA,EAAA,CAC7DA,cAAK,SAAS,EAAC,MAAM,EAAA,QAAA,EAAA,CACnBD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAClD,gBAAgB,IAAI;AACnB,8DAAE,CAAC,CAAC,gCAAgC;AACpC,8DAAE,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC,EAAA,CACpC,EACJA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,YACjC,KAAK,CAAC,SAAS;AACd,8DAAE,CAAC,CAAC,iCAAiC;8DACnC,CAAC,CAAC,mCAAmC,CAAC,GACxC,CAAA,EAAA,CACA,EACL,KAAK,CAAC,SAAS,CAAC,IACfA,GAAA,CAAC,UAAU,EAAA,EAAC,GAAG,EAAE,YAAY,EAAE,SAAS,EAAC,MAAM,GAAG,KAElDA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,IAAI,kBAAkB,EACvC,GAAG,EAAC,UAAU,EACd,SAAS,EAAC,8DAA8D,EAAA,CACxE,CACH,EACDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wBAAwB,EAAA,QAAA,EACpC,gBAAgB,IAAI,YAAY,IAAI,WAAW,IAC9CA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,6CAA6C,EACvD,QAAQ,EAAE,WAAW,YAEpB,CAAC,CAAC,6BAA6B,CAAC,EAAA,CAC1B,KAETC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACEF,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,YAAA,EAAA,IAAA,EAAA,CAAA,CAAM,OAAA,CAAA,EAAA,GAAA,aAAa,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,CAAA,CAAA,EAC7C,SAAS,EAAC,+CAA+C,EACzD,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAC,qBAAqB,EAAA,QAAA,EAE1B,CAAC,CAAC,4BAA4B,CAAC,GACzB,EACTA,GAAA,CAAA,QAAA,EAAA,EACE,OAAO,EAAE,YAAA,EAAM,OAAA,WAAW,CAAQ,CAAC,CAAA,CAApB,CAAoB,EACnC,SAAS,EAAC,qCAAqC,EAC/C,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAC,uBAAuB,EAAA,QAAA,EAE7BA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,SAAS,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,4BAA4B,EAAA,QAAA,EAElCA,GAAA,CAAA,MAAA,EAAA,EACE,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,8HAA8H,EAAA,CAChI,GACE,EAAA,CACC,CAAA,EAAA,CACR,CACJ,EAAA,CACG,CAAA,EAAA,CACF,EAGL,gBAAgB,IAAI,WAAW,KAC9BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gDAAgD,EAAA,QAAA,EAAA,CAC7DA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,MAAM,aACnBD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAClD,CAAC,CAAC,+BAA+B,CAAC,EAAA,CACjC,EACJA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACjC,KAAK,CAAC,SAAS;AACd,8DAAE,CAAC,CAAC,iCAAiC;AACrC,8DAAE,CAAC,CAAC,mCAAmC,CAAC,EAAA,CACxC,CAAA,EAAA,CACA,EACL,KAAK,CAAC,QAAQ,CAAC,IACdA,GAAA,CAAC,UAAU,EAAA,EAAC,GAAG,EAAE,WAAW,IAAI,EAAE,EAAE,SAAS,EAAC,MAAM,EAAA,CAAG,KAEvDA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,WAAW,IAAI,EAAE,EACtB,GAAG,EAAC,OAAO,EACX,SAAS,EAAC,8DAA8D,EAAA,CACxE,CACH,CAAA,EAAA,CACG,CACP,EAGA,gBAAgB,IAAI,CAAC,WAAW,KAC/BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0BAA0B,EAAA,QAAA,EACvCA,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAE,YAAA;gDACP,IAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,gDAAA,KAAK,CAAC,IAAI,GAAG,MAAM;AACnB,gDAAA,KAAK,CAAC,MAAM,GAAG,cAAc;AAC7B,gDAAA,KAAK,CAAC,QAAQ,GAAG,UAAC,CAAC,EAAA;AACjB,oDAAA,OAAA,gBAAgB,CAAC,CAAQ,EAAE,MAAM,CAAC;AAAlC,gDAAA,CAAkC;gDACpC,KAAK,CAAC,KAAK,EAAE;4CACf,CAAC,EACD,SAAS,EAAC,iIAAiI,EAC3I,QAAQ,EAAE,WAAW,EAAA,QAAA,EAErBA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,8BAA8B,CAAC,EAAA,CAAQ,EAAA,CACzC,EAAA,CACL,CACP,EAEDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACpCA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EACG,gBAAgB,IAAI;AACnB,kDAAE,CAAC,CAAC,qCAAqC;kDACvC,CAAC,CAAC,oCAAoC,CAAC,EAAA,CACzC,EAAA,CACA,IACF,CACP,EAAA,CACG,GACD,EAGPA,GAAA,CAAA,OAAA,EAAA,EACE,GAAG,EAAE,aAAa,EAClB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,QAAQ,EAAE,UAAC,CAAC,IAAK,OAAA,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,CAA5B,CAA4B,EAC7C,SAAS,EAAC,QAAQ,EAAA,CAClB,EAGFA,GAAA,CAAA,OAAA,EAAA,EACE,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,wBAAwB,EAClC,SAAS,EAAC,QAAQ,EAAA,CAClB,EAGD,KAAK,KACJA,aAAK,SAAS,EAAC,qDAAqD,EAAA,QAAA,EAClEC,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CACnDD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,MAAM,EAAA,QAAA,EAAA,QAAA,EAAA,CAAS,EAC9B,KAAK,CAAA,EAAA,CACJ,EAAA,CACA,CACP,CAAA,EAAA,CACG,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
|
|
@@ -16,6 +16,7 @@ import DocumentVideoCapture from '../document-video/DocumentVideoCapture.js';
|
|
|
16
16
|
import { Camera, Upload } from 'lucide-react';
|
|
17
17
|
import { useDocumentContext } from '../../context/DocumentContext.js';
|
|
18
18
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
19
|
+
import { logCaptureModeSelected, logPhotosValidated, logPhotoCaptured, logDocumentLoaded, logDocumentsValidated, logDocumentTypeSelected } from '../../services/auditTrailService.js';
|
|
19
20
|
import ButtonDesktop from '../ui/ButtonDesktop.js';
|
|
20
21
|
import Title from '../ui/Title.js';
|
|
21
22
|
import Subtitle from '../ui/Subtitle.js';
|
|
@@ -277,6 +278,7 @@ var DocumentCheck = function (_a) {
|
|
|
277
278
|
var _a;
|
|
278
279
|
return (__assign(__assign({}, prev), (_a = {}, _a[side] = processedDataUrl_1, _a)));
|
|
279
280
|
});
|
|
281
|
+
logPhotoCaptured(sessionId, side);
|
|
280
282
|
if (side === "recto") {
|
|
281
283
|
isSingleSided = (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "passport" ||
|
|
282
284
|
(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "pinkDriverLicense";
|
|
@@ -294,6 +296,7 @@ var DocumentCheck = function (_a) {
|
|
|
294
296
|
var _a;
|
|
295
297
|
return (__assign(__assign({}, prev), (_a = {}, _a[side] = imageData, _a)));
|
|
296
298
|
});
|
|
299
|
+
logPhotoCaptured(sessionId, side);
|
|
297
300
|
if (side === "recto") {
|
|
298
301
|
isSingleSided = (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "passport" ||
|
|
299
302
|
(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "pinkDriverLicense";
|
|
@@ -309,6 +312,7 @@ var DocumentCheck = function (_a) {
|
|
|
309
312
|
}); };
|
|
310
313
|
var handlePhotoConfirmation = function () {
|
|
311
314
|
if (capturedImages.recto) {
|
|
315
|
+
logPhotosValidated(sessionId);
|
|
312
316
|
setFileUploaded({
|
|
313
317
|
front: capturedImages.recto,
|
|
314
318
|
back: capturedImages.verso || null,
|
|
@@ -330,6 +334,8 @@ var DocumentCheck = function (_a) {
|
|
|
330
334
|
handleProcessingComplete(success, undefined, analysisData);
|
|
331
335
|
};
|
|
332
336
|
var handleDocumentTypeSelect = function (documentId) {
|
|
337
|
+
var documentLabel = t("documentTypes.".concat(documentId), documentId);
|
|
338
|
+
logDocumentTypeSelected(sessionId, documentId, documentLabel);
|
|
333
339
|
var documentTemplateID = loadingTemplates
|
|
334
340
|
? undefined
|
|
335
341
|
: getDocumentTemplateId({
|
|
@@ -357,6 +363,11 @@ var DocumentCheck = function (_a) {
|
|
|
357
363
|
setDocStep(3);
|
|
358
364
|
};
|
|
359
365
|
var handleDocumentUpload = function (files) {
|
|
366
|
+
logDocumentLoaded(sessionId, "recto");
|
|
367
|
+
if (files.back) {
|
|
368
|
+
logDocumentLoaded(sessionId, "verso");
|
|
369
|
+
}
|
|
370
|
+
logDocumentsValidated(sessionId);
|
|
360
371
|
setFileUploaded(files);
|
|
361
372
|
// Check if retry limit is reached before processing
|
|
362
373
|
if (!isRetryAllowed() && retryCount > 0) {
|
|
@@ -491,40 +502,17 @@ var DocumentCheck = function (_a) {
|
|
|
491
502
|
return (jsxs("div", { className: "flex flex-col items-center justify-center h-full p-4 text-center", children: [jsx("div", { className: "text-red-500 text-4xl mb-4", children: "\u26A0\uFE0F" }), jsx("h2", { className: "text-xl font-bold text-red-600 mb-2", children: t("document_check.selection_error.title", "Erreur de sélection") }), jsx("p", { className: "text-gray-600 mb-4", children: t("document_check.selection_error.description", "Aucun type de document sélectionné. Veuillez revenir à l'étape précédente.") }), jsx(ButtonDesktop, { className: "px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors", type: "back", onClick: function () { return setDocStep(2); }, children: t("document_check.selection_error.back", "Retour à la sélection") })] }));
|
|
492
503
|
}
|
|
493
504
|
if (isPictureAllowed && isDownloadAllowed && !selectedMethod) {
|
|
494
|
-
return (jsx(MobilePageLayout, { footer: jsx("div", { className: "w-full max-w-md mx-auto", children: jsx(ButtonDesktop, { type: "back", onClick: handleBack, className: "w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2", children: t("buttons.back", "Retour") }) }), children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: t("document_check.method_selection.title", "Choisissez une méthode") }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed", children: t("document_check.method_selection.subtitle", "Comment souhaitez-vous ajouter votre document ?") })] }), jsxs("div", { className: "grid gap-4", children: [jsxs("button", { onClick: function () {
|
|
505
|
+
return (jsx(MobilePageLayout, { footer: jsx("div", { className: "w-full max-w-md mx-auto", children: jsx(ButtonDesktop, { type: "back", onClick: handleBack, className: "w-full text-[#3C3C40] text-center font-poppins text-sm font-medium hover:underline py-2", children: t("buttons.back", "Retour") }) }), children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: t("document_check.method_selection.title", "Choisissez une méthode") }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed", children: t("document_check.method_selection.subtitle", "Comment souhaitez-vous ajouter votre document ?") })] }), jsxs("div", { className: "grid gap-4", children: [jsxs("button", { onClick: function () { setSelectedMethod("picture"); logCaptureModeSelected(sessionId, "picture"); }, className: "flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group", children: [jsx("div", { className: "w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4", children: jsx(Camera, { size: 24 }) }), jsxs("div", { children: [jsx("p", { className: "font-semibold text-gray-900", children: t("document_check.method_selection.picture_title", "Prendre une photo") }), jsx("p", { className: "text-sm text-gray-500", children: t("document_check.method_selection.picture_desc", "Utilisez l'appareil photo de votre appareil") })] })] }), jsxs("button", { onClick: function () { setSelectedMethod("download"); logCaptureModeSelected(sessionId, "upload"); }, className: "flex items-center p-4 bg-white border-2 border-gray-100 rounded-xl hover:border-teal-500 transition-colors text-left group", children: [jsx("div", { className: "w-12 h-12 bg-teal-50 rounded-lg flex items-center justify-center text-teal-600 group-hover:bg-teal-100 transition-colors mr-4", children: jsx(Upload, { size: 24 }) }), jsxs("div", { children: [jsx("p", { className: "font-semibold text-gray-900", children: t("document_check.method_selection.download_title", "Téléverser un fichier") }), jsx("p", { className: "text-sm text-gray-500", children: t("document_check.method_selection.download_desc", "Sélectionnez un fichier sur votre appareil") })] })] })] })] }) }) }));
|
|
495
506
|
}
|
|
496
507
|
var activeMethod = selectedMethod ||
|
|
497
508
|
(isPictureAllowed && isMobileCapture ? "picture" : "download");
|
|
498
509
|
if (activeMethod === "picture" && isPictureAllowed) {
|
|
499
|
-
var
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
case "recto":
|
|
506
|
-
return (jsx(Photo, { onCapture: function (imageData) {
|
|
507
|
-
return handlePhotoCapture(imageData, "recto");
|
|
508
|
-
} }));
|
|
509
|
-
case "before-verso":
|
|
510
|
-
return (jsx(BeforeVersoPhoto, { setStep: function () { return setCurrentPhotoStep("verso"); } }));
|
|
511
|
-
case "verso":
|
|
512
|
-
return (jsx(Photo, { onCapture: function (imageData) {
|
|
513
|
-
return handlePhotoCapture(imageData, "verso");
|
|
514
|
-
} }));
|
|
515
|
-
case "confirmation":
|
|
516
|
-
return (jsx(PhotoConfirmation, { imageUrl: capturedImages.recto || "", versoImageUrl: capturedImages.verso, requiresTwoSides: !!capturedImages.verso, onConfirm: onConfirm, onRetry: function () { return setCurrentPhotoStep("before-recto"); }, onRetryAfterProcessing: function () {
|
|
517
|
-
return setCurrentPhotoStep("before-recto");
|
|
518
|
-
}, fileUploaded: fileUploaded, isSingleSided: isSingleSided }));
|
|
519
|
-
default:
|
|
520
|
-
setCurrentPhotoStep("before-recto");
|
|
521
|
-
return (jsx(BeforePhoto, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
522
|
-
}
|
|
523
|
-
};
|
|
524
|
-
if (node.withVideo) {
|
|
525
|
-
if (videoFlowPhase === "photo") {
|
|
526
|
-
return renderPhotoCaptureFlow(handlePhotoConfirmedForVideo);
|
|
527
|
-
}
|
|
510
|
+
var isSingleSided = (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "passport" ||
|
|
511
|
+
(selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) === "pinkDriverLicense";
|
|
512
|
+
var onConfirm = node.withVideo
|
|
513
|
+
? handlePhotoConfirmedForVideo
|
|
514
|
+
: handlePhotoConfirmation;
|
|
515
|
+
if (node.withVideo && videoFlowPhase === "video") {
|
|
528
516
|
return (jsx(DocumentVideoCapture, { selectedDocumentType: selectedDocumentType, onComplete: handleDocumentVideoComplete, onBack: function () {
|
|
529
517
|
setVideoFlowPhase("photo");
|
|
530
518
|
setCurrentPhotoStep("confirmation");
|
|
@@ -533,7 +521,22 @@ var DocumentCheck = function (_a) {
|
|
|
533
521
|
verso: capturedImages.verso,
|
|
534
522
|
} }));
|
|
535
523
|
}
|
|
536
|
-
|
|
524
|
+
if (currentPhotoStep === "before-recto") {
|
|
525
|
+
return (jsx(BeforePhoto, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
526
|
+
}
|
|
527
|
+
if (currentPhotoStep === "recto") {
|
|
528
|
+
return (jsx(Photo, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "recto"); } }));
|
|
529
|
+
}
|
|
530
|
+
if (currentPhotoStep === "before-verso") {
|
|
531
|
+
return (jsx(BeforeVersoPhoto, { setStep: function () { return setCurrentPhotoStep("verso"); } }));
|
|
532
|
+
}
|
|
533
|
+
if (currentPhotoStep === "verso") {
|
|
534
|
+
return (jsx(Photo, { onCapture: function (imageData) { return handlePhotoCapture(imageData, "verso"); } }));
|
|
535
|
+
}
|
|
536
|
+
if (currentPhotoStep === "confirmation") {
|
|
537
|
+
return (jsx(PhotoConfirmation, { imageUrl: capturedImages.recto || "", versoImageUrl: capturedImages.verso, requiresTwoSides: !!capturedImages.verso, onConfirm: onConfirm, onRetry: function () { return setCurrentPhotoStep("before-recto"); }, onRetryAfterProcessing: function () { return setCurrentPhotoStep("before-recto"); }, fileUploaded: fileUploaded, isSingleSided: isSingleSided }));
|
|
538
|
+
}
|
|
539
|
+
return (jsx(BeforePhoto, { setStep: function () { return setCurrentPhotoStep("recto"); }, isSingleSided: isSingleSided, onBack: function () { return setDocStep(2); } }));
|
|
537
540
|
}
|
|
538
541
|
else {
|
|
539
542
|
return (jsx(JDIDocumentUpload, { documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || documentTypeId, documentTypeId: documentTypeId, documentLabel: selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.label, onUpload: handleDocumentUpload, onBack: function () {
|
|
@@ -543,7 +546,7 @@ var DocumentCheck = function (_a) {
|
|
|
543
546
|
else {
|
|
544
547
|
setDocStep(2);
|
|
545
548
|
}
|
|
546
|
-
}, initialFront: errorCode === "2.5" ? fileUploaded === null || fileUploaded === void 0 ? void 0 : fileUploaded.front : null, initialBack: errorCode === "2.5" ? fileUploaded === null || fileUploaded === void 0 ? void 0 : fileUploaded.back : null }));
|
|
549
|
+
}, initialFront: errorCode === "2.5" ? fileUploaded === null || fileUploaded === void 0 ? void 0 : fileUploaded.front : null, initialBack: errorCode === "2.5" ? fileUploaded === null || fileUploaded === void 0 ? void 0 : fileUploaded.back : null, sessionId: sessionId }));
|
|
547
550
|
}
|
|
548
551
|
case 4:
|
|
549
552
|
return (jsx(JDIProcessing, { documentType: (selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.id) || documentTypeId, onProcessingComplete: handleProcessingComplete, fileUploaded: fileUploaded, documentTypeId: documentTypeId, retryCount: retryCount, documentTemplateId: selectedDocumentType === null || selectedDocumentType === void 0 ? void 0 : selectedDocumentType.documentTemplateId, nodeId: node.id }));
|