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":"cameraService.js","sources":["../../../../src/services/cameraService.ts"],"sourcesContent":["import type { CameraFacingMode } from \"../types/camera\";\nimport { professionalImageQuality } from \"./professionalImageQuality\";\nimport type { QualityAnalysis } from \"./professionalImageQuality\";\n\n// Permit to enable development mode to test without a camera\nconst DEV_MODE = false; // import.meta.env.DEV;\n// Default image path for development mode\nconst DEFAULT_TEST_IMAGE = \"/mock-id-card.jpeg\";\n\ntype CaptureMethod = \"imageCapture\" | \"canvas\" | \"mock\";\n\nexport interface CameraStartOptions {\n facingMode?: CameraFacingMode;\n idealResolution?: {\n width?: number;\n height?: number;\n };\n deviceId?: string;\n advancedConstraints?: MediaTrackConstraints[];\n preferImageCapture?: boolean;\n}\n\nexport interface CameraStartResult {\n success: boolean;\n error?: string;\n settings?: MediaTrackSettings;\n captureMethod?: CaptureMethod;\n}\n\nexport interface DocumentCropArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface CaptureDocumentOptions {\n facingMode?: CameraFacingMode;\n format?: \"png\" | \"jpeg\";\n jpegQuality?: number;\n preferImageCapture?: boolean;\n}\n\nexport interface CaptureDocumentResult {\n dataUrl: string;\n method: CaptureMethod;\n analysis?: QualityAnalysis;\n sourceDimensions?: { width: number; height: number };\n cropDimensions?: { width: number; height: number };\n}\n\nconst DEFAULT_RESOLUTION = {\n width: 4096,\n height: 3072,\n};\n\nconst QUALITY_REQUIREMENTS = {\n minArea: 3500 * 2200,\n targetArea: 4800 * 3200,\n minLongSide: 3200,\n};\n\nconst supportsImageCapture = (): boolean =>\n typeof window !== \"undefined\" && \"ImageCapture\" in window;\n\ninterface CanvasSource {\n source: CanvasImageSource;\n width: number;\n height: number;\n cleanup?: () => void;\n}\n\nexport class CameraService {\n private stream: MediaStream | null = null;\n private videoTrack: MediaStreamTrack | null = null;\n private imageCapture: ImageCapture | null = null;\n private devMode: boolean = DEV_MODE;\n private mockImagePath: string = DEFAULT_TEST_IMAGE;\n private captureMethod: CaptureMethod = \"canvas\";\n private lastTrackSettings: MediaTrackSettings | null = null;\n\n private async startMockCamera(\n videoElement: HTMLVideoElement | null\n ): Promise<CameraStartResult> {\n try {\n if (!videoElement) {\n return { success: false, error: \"Élément vidéo non disponible\" };\n }\n\n const img = new Image();\n img.src = this.mockImagePath;\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () =>\n reject(\n new Error(`Impossible de charger l'image: ${this.mockImagePath}`)\n );\n });\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return { success: false, error: \"Contexte du canvas non disponible\" };\n }\n\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n const stream: MediaStream = canvas.captureStream(30);\n this.stream = stream;\n this.captureMethod = \"mock\";\n videoElement.srcObject = stream;\n\n return { success: true, captureMethod: \"mock\" };\n } catch (err) {\n console.error(\"Erreur lors de la création du flux vidéo mock:\", err);\n return {\n success: false,\n error: `Erreur lors de la création du flux vidéo mock: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n }\n }\n\n async startCamera(\n videoElement: HTMLVideoElement | null,\n options: CameraStartOptions = {}\n ): Promise<CameraStartResult> {\n if (this.devMode) {\n return this.startMockCamera(videoElement);\n }\n\n if (!videoElement) {\n return { success: false, error: \"Élément vidéo non disponible\" };\n }\n\n if (!navigator?.mediaDevices?.getUserMedia) {\n return {\n success: false,\n error: \"La capture vidéo n'est pas supportée sur cet appareil.\",\n };\n }\n\n const facingMode = options.facingMode ?? \"environment\";\n const preferImageCapture = options.preferImageCapture ?? true;\n const desiredWidth = options.idealResolution?.width ?? DEFAULT_RESOLUTION.width;\n const desiredHeight = options.idealResolution?.height ?? DEFAULT_RESOLUTION.height;\n\n try {\n // Step 1: Probe the camera to discover its maximum supported resolution\n const maxResolution = await this.getMaxCameraResolution(facingMode, options.deviceId);\n\n // Use the lesser of the desired and the device maximum\n const targetWidth = maxResolution\n ? Math.min(desiredWidth, maxResolution.width)\n : desiredWidth;\n const targetHeight = maxResolution\n ? Math.min(desiredHeight, maxResolution.height)\n : desiredHeight;\n\n console.debug(\"[CameraService] Resolution negotiation\", {\n desired: { width: desiredWidth, height: desiredHeight },\n deviceMax: maxResolution ?? \"unknown\",\n target: { width: targetWidth, height: targetHeight },\n });\n\n const videoConstraints: MediaTrackConstraints = {\n facingMode,\n width: { ideal: targetWidth },\n height: { ideal: targetHeight },\n };\n\n if (options.deviceId) {\n videoConstraints.deviceId = { exact: options.deviceId };\n }\n\n if (options.advancedConstraints?.length) {\n videoConstraints.advanced = options.advancedConstraints;\n }\n\n // Step 2: Open the stream with adapted constraints\n const stream = await navigator.mediaDevices.getUserMedia({\n video: videoConstraints,\n });\n\n this.stream = stream;\n this.videoTrack = stream.getVideoTracks()[0] ?? null;\n this.lastTrackSettings = this.videoTrack?.getSettings() ?? null;\n\n console.debug(\"[CameraService] Actual stream settings\", this.lastTrackSettings);\n\n if (supportsImageCapture() && this.videoTrack && preferImageCapture) {\n try {\n this.imageCapture = new ImageCapture(this.videoTrack);\n this.captureMethod = \"imageCapture\";\n } catch (error) {\n console.warn(\n \"ImageCapture API indisponible, fallback sur capture canvas\",\n error\n );\n this.imageCapture = null;\n this.captureMethod = \"canvas\";\n }\n } else {\n this.imageCapture = null;\n this.captureMethod = \"canvas\";\n }\n\n videoElement.srcObject = stream;\n\n await this.waitForVideoReady(videoElement);\n\n return {\n success: true,\n settings: this.lastTrackSettings ?? undefined,\n captureMethod: this.captureMethod,\n };\n } catch (err) {\n console.error(\"Erreur lors de l'accès à la caméra:\", err);\n\n let errorMessage =\n \"Une erreur inconnue s'est produite lors de l'accès à la caméra.\";\n\n if (err instanceof DOMException) {\n if (err.name === \"NotFoundError\") {\n errorMessage = \"Aucune caméra n'a été détectée sur votre appareil.\";\n } else if (err.name === \"NotAllowedError\") {\n errorMessage =\n \"L'accès à la caméra a été refusé. Veuillez autoriser l'accès dans les paramètres de votre navigateur.\";\n } else {\n errorMessage = `Impossible d'accéder à la caméra: ${err.message}`;\n }\n }\n\n return { success: false, error: errorMessage };\n }\n }\n\n async captureDocument(\n videoElement: HTMLVideoElement | null,\n cropArea?: DocumentCropArea | null,\n options: CaptureDocumentOptions = {}\n ): Promise<CaptureDocumentResult> {\n if (!videoElement) {\n throw new Error(\"Élément vidéo requis pour capturer le document\");\n }\n\n if (!videoElement.videoWidth || !videoElement.videoHeight) {\n throw new Error(\n \"La vidéo n'est pas prête. Impossible de déterminer les dimensions.\"\n );\n }\n\n const format = options.format ?? \"jpeg\";\n const jpegQuality = options.jpegQuality ?? 0.95;\n const facingMode = options.facingMode ?? \"environment\";\n const preferImageCapture = options.preferImageCapture ?? true;\n\n const effectiveCropArea: DocumentCropArea = cropArea ?? {\n x: 0,\n y: 0,\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n };\n\n console.debug(\"[CameraService] captureDocument request\", {\n format,\n jpegQuality,\n facingMode,\n preferImageCapture,\n cropArea: effectiveCropArea,\n videoDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n });\n\n if (this.imageCapture && preferImageCapture) {\n try {\n const result = await this.captureWithImageCapture(\n videoElement,\n effectiveCropArea,\n {\n format,\n jpegQuality,\n facingMode,\n }\n );\n\n if (result) {\n console.debug(\"[CameraService] captureDocument via ImageCapture\", {\n cropArea: effectiveCropArea,\n result,\n });\n return result;\n }\n } catch (error) {\n console.warn(\n \"Capture haute résolution impossible, fallback sur capture vidéo\",\n error\n );\n }\n }\n\n const fallback = professionalImageQuality.autoEnhanceImage(\n videoElement,\n effectiveCropArea,\n {\n outputFormat: format,\n jpegQuality,\n flipHorizontal: facingMode === \"user\",\n ...QUALITY_REQUIREMENTS,\n }\n );\n\n console.debug(\"[CameraService] captureDocument via video fallback\", {\n cropArea: effectiveCropArea,\n analysis: fallback.analysis,\n method: this.captureMethod,\n sourceDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n });\n\n return {\n dataUrl: fallback.dataUrl,\n analysis: fallback.analysis,\n method: this.captureMethod,\n sourceDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n cropDimensions: {\n width: effectiveCropArea.width,\n height: effectiveCropArea.height,\n },\n };\n }\n\n captureFrame(\n videoElement: HTMLVideoElement | null,\n canvasElement: HTMLCanvasElement | null\n ): string | null {\n if (!videoElement || !canvasElement || !videoElement.videoWidth) {\n return null;\n }\n\n const ctx = canvasElement.getContext(\"2d\");\n if (!ctx) return null;\n\n canvasElement.width = videoElement.videoWidth;\n canvasElement.height = videoElement.videoHeight;\n\n ctx.drawImage(\n videoElement,\n 0,\n 0,\n canvasElement.width,\n canvasElement.height\n );\n\n return canvasElement.toDataURL(\"image/jpeg\");\n }\n\n stopCamera() {\n if (this.stream) {\n this.stream.getTracks().forEach((track) => track.stop());\n this.stream = null;\n }\n\n this.videoTrack = null;\n this.imageCapture = null;\n this.lastTrackSettings = null;\n this.captureMethod = this.devMode ? \"mock\" : \"canvas\";\n }\n\n setDevMode(enabled: boolean): void {\n this.devMode = enabled;\n }\n\n setMockImage(imagePath: string): void {\n this.mockImagePath = imagePath;\n }\n\n isDevModeEnabled(): boolean {\n return this.devMode;\n }\n\n getCurrentCaptureMethod(): CaptureMethod {\n return this.captureMethod;\n }\n\n /**\n * Probes the camera to discover its maximum supported resolution.\n * Opens a temporary low-res stream, reads getCapabilities(), then closes it.\n * Returns null if capabilities cannot be determined (the caller should fallback to defaults).\n */\n private async getMaxCameraResolution(\n facingMode: string,\n deviceId?: string\n ): Promise<{ width: number; height: number } | null> {\n try {\n const constraints: MediaTrackConstraints = { facingMode };\n if (deviceId) {\n constraints.deviceId = { exact: deviceId };\n }\n\n const probeStream = await navigator.mediaDevices.getUserMedia({\n video: constraints,\n });\n\n const track = probeStream.getVideoTracks()[0];\n if (!track) {\n probeStream.getTracks().forEach((t) => t.stop());\n return null;\n }\n\n let maxWidth: number | undefined;\n let maxHeight: number | undefined;\n\n // getCapabilities() is supported on Chrome/Edge/Android but not all browsers\n if (typeof track.getCapabilities === \"function\") {\n const capabilities = track.getCapabilities();\n maxWidth = (capabilities as Record<string, any>).width?.max;\n maxHeight = (capabilities as Record<string, any>).height?.max;\n }\n\n // Stop the probe stream immediately\n probeStream.getTracks().forEach((t) => t.stop());\n\n if (maxWidth && maxHeight) {\n console.debug(\"[CameraService] Device max resolution\", {\n width: maxWidth,\n height: maxHeight,\n });\n return { width: maxWidth, height: maxHeight };\n }\n\n return null;\n } catch (error) {\n console.warn(\"[CameraService] Could not probe camera capabilities\", error);\n return null;\n }\n }\n\n private async waitForVideoReady(video: HTMLVideoElement): Promise<void> {\n // Explicitly call play() — required on some Android devices even with autoplay attribute\n try {\n await video.play();\n } catch (playError) {\n console.warn(\"[CameraService] video.play() failed, relying on autoplay\", playError);\n }\n\n if (\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.videoWidth > 0\n ) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const TIMEOUT_MS = 5000;\n\n const onReady = () => {\n clearTimeout(timeout);\n video.removeEventListener(\"loadeddata\", onReady);\n video.removeEventListener(\"playing\", onReady);\n resolve();\n };\n\n // Listen for both events — whichever fires first\n video.addEventListener(\"loadeddata\", onReady, { once: true });\n video.addEventListener(\"playing\", onReady, { once: true });\n\n // Safety timeout to avoid hanging indefinitely\n const timeout = setTimeout(() => {\n video.removeEventListener(\"loadeddata\", onReady);\n video.removeEventListener(\"playing\", onReady);\n console.warn(\"[CameraService] waitForVideoReady timed out after\", TIMEOUT_MS, \"ms\");\n resolve();\n }, TIMEOUT_MS);\n });\n }\n\n private async captureWithImageCapture(\n videoElement: HTMLVideoElement,\n cropArea: DocumentCropArea,\n options: Required<Pick<CaptureDocumentOptions, \"format\" | \"jpegQuality\">> & {\n facingMode: CameraFacingMode;\n }\n ): Promise<CaptureDocumentResult | null> {\n if (!this.imageCapture) {\n return null;\n }\n\n // Use the actual stream resolution for takePhoto to ensure consistency\n const photoSettings: PhotoSettings = {};\n if (this.lastTrackSettings?.width && this.lastTrackSettings?.height) {\n photoSettings.imageWidth = this.lastTrackSettings.width;\n photoSettings.imageHeight = this.lastTrackSettings.height;\n console.debug(\"[CameraService] takePhoto with explicit resolution\", photoSettings);\n }\n\n const blob = await this.imageCapture.takePhoto(photoSettings);\n const { source, width, height, cleanup } = await this.loadCanvasSourceFromBlob(\n blob\n );\n\n try {\n const ratioX = width / videoElement.videoWidth;\n const ratioY = height / videoElement.videoHeight;\n\n if (!isFinite(ratioX) || !isFinite(ratioY)) {\n throw new Error(\"Ratios de capture invalides\");\n }\n\n const scaled = this.scaleCropArea(cropArea, ratioX, ratioY, width, height);\n\n const analysis = professionalImageQuality.analyzeQuality(\n scaled.width,\n scaled.height,\n QUALITY_REQUIREMENTS\n );\n\n const outputWidth = Math.max(\n 1,\n Math.round(scaled.width * analysis.recommendedScale)\n );\n const outputHeight = Math.max(\n 1,\n Math.round(scaled.height * analysis.recommendedScale)\n );\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Impossible de créer le contexte de rendu\");\n }\n\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n if (options.facingMode === \"user\") {\n ctx.translate(outputWidth, 0);\n ctx.scale(-1, 1);\n }\n\n ctx.drawImage(\n source,\n scaled.x,\n scaled.y,\n scaled.width,\n scaled.height,\n 0,\n 0,\n outputWidth,\n outputHeight\n );\n\n const dataUrl =\n options.format === \"jpeg\"\n ? canvas.toDataURL(\"image/jpeg\", options.jpegQuality)\n : canvas.toDataURL(\"image/png\");\n\n console.debug(\"[CameraService] ImageCapture crop applied\", {\n originalDimensions: { width, height },\n crop: scaled,\n output: { width: outputWidth, height: outputHeight },\n analysis,\n });\n\n return {\n dataUrl,\n analysis,\n method: \"imageCapture\",\n sourceDimensions: { width, height },\n cropDimensions: {\n width: scaled.width,\n height: scaled.height,\n },\n };\n } finally {\n if (source instanceof ImageBitmap && typeof source.close === \"function\") {\n source.close();\n }\n\n cleanup?.();\n }\n }\n\n private async loadCanvasSourceFromBlob(blob: Blob): Promise<CanvasSource> {\n if (typeof createImageBitmap === \"function\") {\n try {\n const bitmap = await createImageBitmap(blob, {\n imageOrientation: \"from-image\",\n } as ImageBitmapOptions);\n\n return {\n source: bitmap,\n width: bitmap.width,\n height: bitmap.height,\n cleanup: () => {\n if (typeof bitmap.close === \"function\") {\n bitmap.close();\n }\n },\n };\n } catch (error) {\n console.warn(\"createImageBitmap a échoué, fallback sur HTMLImageElement\", error);\n }\n }\n\n const objectUrl = URL.createObjectURL(blob);\n\n const image = await new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (event) => reject(event);\n img.src = objectUrl;\n });\n\n return {\n source: image,\n width: image.naturalWidth,\n height: image.naturalHeight,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n }\n\n private scaleCropArea(\n cropArea: DocumentCropArea,\n ratioX: number,\n ratioY: number,\n maxWidth: number,\n maxHeight: number\n ): { x: number; y: number; width: number; height: number } {\n const scaledX = Math.max(0, Math.round(cropArea.x * ratioX));\n const scaledY = Math.max(0, Math.round(cropArea.y * ratioY));\n const scaledWidth = Math.min(\n maxWidth - scaledX,\n Math.round(cropArea.width * ratioX)\n );\n const scaledHeight = Math.min(\n maxHeight - scaledY,\n Math.round(cropArea.height * ratioY)\n );\n\n if (scaledWidth <= 0 || scaledHeight <= 0) {\n throw new Error(\"Zone de capture invalide après scaling\");\n }\n\n return {\n x: scaledX,\n y: scaledY,\n width: scaledWidth,\n height: scaledHeight,\n };\n }\n}\n\nexport const cameraService = new CameraService();\n"],"names":["__awaiter","professionalImageQuality","__assign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cameraService.js","sources":["../../../../src/services/cameraService.ts"],"sourcesContent":["import type { CameraFacingMode } from \"../types/camera\";\nimport { professionalImageQuality } from \"./professionalImageQuality\";\nimport type { QualityAnalysis } from \"./professionalImageQuality\";\n\n// Permit to enable development mode to test without a camera\nconst DEV_MODE = false; // import.meta.env.DEV;\n// Default image path for development mode\nconst DEFAULT_TEST_IMAGE = \"/mock-id-card.jpeg\";\n\ntype CaptureMethod = \"imageCapture\" | \"canvas\" | \"mock\";\n\nexport interface CameraStartOptions {\n facingMode?: CameraFacingMode;\n idealResolution?: {\n width?: number;\n height?: number;\n };\n deviceId?: string;\n advancedConstraints?: MediaTrackConstraints[];\n preferImageCapture?: boolean;\n}\n\nexport interface CameraStartResult {\n success: boolean;\n error?: string;\n settings?: MediaTrackSettings;\n captureMethod?: CaptureMethod;\n}\n\nexport interface DocumentCropArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface CaptureDocumentOptions {\n facingMode?: CameraFacingMode;\n format?: \"png\" | \"jpeg\";\n jpegQuality?: number;\n preferImageCapture?: boolean;\n}\n\nexport interface CaptureDocumentResult {\n dataUrl: string;\n method: CaptureMethod;\n analysis?: QualityAnalysis;\n sourceDimensions?: { width: number; height: number };\n cropDimensions?: { width: number; height: number };\n}\n\nconst DEFAULT_RESOLUTION = {\n width: 4096,\n height: 3072,\n};\n\nconst QUALITY_REQUIREMENTS = {\n minArea: 3500 * 2200,\n targetArea: 4800 * 3200,\n minLongSide: 3200,\n};\n\nconst supportsImageCapture = (): boolean =>\n typeof window !== \"undefined\" && \"ImageCapture\" in window;\n\ninterface CanvasSource {\n source: CanvasImageSource;\n width: number;\n height: number;\n cleanup?: () => void;\n}\n\nexport class CameraService {\n private stream: MediaStream | null = null;\n private videoTrack: MediaStreamTrack | null = null;\n private imageCapture: ImageCapture | null = null;\n private devMode: boolean = DEV_MODE;\n private mockImagePath: string = DEFAULT_TEST_IMAGE;\n private captureMethod: CaptureMethod = \"canvas\";\n private lastTrackSettings: MediaTrackSettings | null = null;\n private startingPromise: Promise<CameraStartResult> | null = null;\n\n private async startMockCamera(\n videoElement: HTMLVideoElement | null\n ): Promise<CameraStartResult> {\n try {\n if (!videoElement) {\n return { success: false, error: \"Élément vidéo non disponible\" };\n }\n\n const img = new Image();\n img.src = this.mockImagePath;\n\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () =>\n reject(\n new Error(`Impossible de charger l'image: ${this.mockImagePath}`)\n );\n });\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = img.width;\n canvas.height = img.height;\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return { success: false, error: \"Contexte du canvas non disponible\" };\n }\n\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n\n const stream: MediaStream = canvas.captureStream(30);\n this.stream = stream;\n this.captureMethod = \"mock\";\n videoElement.srcObject = stream;\n\n return { success: true, captureMethod: \"mock\" };\n } catch (err) {\n console.error(\"Erreur lors de la création du flux vidéo mock:\", err);\n return {\n success: false,\n error: `Erreur lors de la création du flux vidéo mock: ${\n err instanceof Error ? err.message : String(err)\n }`,\n };\n }\n }\n\n async startCamera(\n videoElement: HTMLVideoElement | null,\n options: CameraStartOptions = {}\n ): Promise<CameraStartResult> {\n if (this.devMode) {\n return this.startMockCamera(videoElement);\n }\n\n if (!videoElement) {\n return { success: false, error: \"Élément vidéo non disponible\" };\n }\n\n if (!navigator?.mediaDevices?.getUserMedia) {\n return {\n success: false,\n error: \"La capture vidéo n'est pas supportée sur cet appareil.\",\n };\n }\n\n // Si un startCamera est déjà en cours, attendre qu'il se termine plutôt que d'en lancer un second\n if (this.startingPromise) {\n return this.startingPromise;\n }\n\n this.startingPromise = this._doStartCamera(videoElement!, options);\n try {\n return await this.startingPromise;\n } finally {\n this.startingPromise = null;\n }\n }\n\n private async _doStartCamera(\n videoElement: HTMLVideoElement,\n options: CameraStartOptions\n ): Promise<CameraStartResult> {\n const facingMode = options.facingMode ?? \"environment\";\n const preferImageCapture = options.preferImageCapture ?? true;\n const desiredWidth = options.idealResolution?.width ?? DEFAULT_RESOLUTION.width;\n const desiredHeight = options.idealResolution?.height ?? DEFAULT_RESOLUTION.height;\n\n try {\n // Close any existing stream before opening a new one\n if (this.stream) {\n this.stream.getTracks().forEach((t) => t.stop());\n this.stream = null;\n this.videoTrack = null;\n this.imageCapture = null;\n }\n\n // Step 1: Probe the camera to discover its maximum supported resolution\n const maxResolution = await this.getMaxCameraResolution(facingMode, options.deviceId);\n\n // Use the lesser of the desired and the device maximum\n const targetWidth = maxResolution\n ? Math.min(desiredWidth, maxResolution.width)\n : desiredWidth;\n const targetHeight = maxResolution\n ? Math.min(desiredHeight, maxResolution.height)\n : desiredHeight;\n\n console.debug(\"[CameraService] Resolution negotiation\", {\n desired: { width: desiredWidth, height: desiredHeight },\n deviceMax: maxResolution ?? \"unknown\",\n target: { width: targetWidth, height: targetHeight },\n });\n\n const videoConstraints: MediaTrackConstraints = {\n facingMode,\n width: { ideal: targetWidth },\n height: { ideal: targetHeight },\n };\n\n if (options.deviceId) {\n videoConstraints.deviceId = { exact: options.deviceId };\n }\n\n if (options.advancedConstraints?.length) {\n videoConstraints.advanced = options.advancedConstraints;\n }\n\n // Step 2: Open the stream with adapted constraints\n const stream = await navigator.mediaDevices.getUserMedia({\n video: videoConstraints,\n });\n\n this.stream = stream;\n this.videoTrack = stream.getVideoTracks()[0] ?? null;\n this.lastTrackSettings = this.videoTrack?.getSettings() ?? null;\n\n // Step 3: Apply continuous autofocus via applyConstraints after stream is open.\n // Done separately so a rejection (unsupported constraint) never kills the stream.\n if (this.videoTrack) {\n try {\n await this.videoTrack.applyConstraints({\n advanced: [{ focusMode: \"continuous\" } as MediaTrackConstraints],\n });\n } catch {\n // Device doesn't support focusMode — stream stays open, autofocus just won't activate\n }\n }\n\n if (supportsImageCapture() && this.videoTrack && preferImageCapture) {\n try {\n this.imageCapture = new ImageCapture(this.videoTrack);\n this.captureMethod = \"imageCapture\";\n } catch (error) {\n console.warn(\n \"ImageCapture API indisponible, fallback sur capture canvas\",\n error\n );\n this.imageCapture = null;\n this.captureMethod = \"canvas\";\n }\n } else {\n this.imageCapture = null;\n this.captureMethod = \"canvas\";\n }\n\n videoElement.srcObject = stream;\n\n await this.waitForVideoReady(videoElement);\n\n return {\n success: true,\n settings: this.lastTrackSettings ?? undefined,\n captureMethod: this.captureMethod,\n };\n } catch (err) {\n console.error(\"Erreur lors de l'accès à la caméra:\", err);\n\n let errorMessage =\n \"Une erreur inconnue s'est produite lors de l'accès à la caméra.\";\n\n if (err instanceof DOMException) {\n if (err.name === \"NotFoundError\") {\n errorMessage = \"Aucune caméra n'a été détectée sur votre appareil.\";\n } else if (err.name === \"NotAllowedError\") {\n errorMessage =\n \"L'accès à la caméra a été refusé. Veuillez autoriser l'accès dans les paramètres de votre navigateur.\";\n } else {\n errorMessage = `Impossible d'accéder à la caméra: ${err.message}`;\n }\n }\n\n return { success: false, error: errorMessage };\n }\n }\n\n async captureDocument(\n videoElement: HTMLVideoElement | null,\n cropArea?: DocumentCropArea | null,\n options: CaptureDocumentOptions = {}\n ): Promise<CaptureDocumentResult> {\n if (!videoElement) {\n throw new Error(\"Élément vidéo requis pour capturer le document\");\n }\n\n if (!videoElement.videoWidth || !videoElement.videoHeight) {\n throw new Error(\n \"La vidéo n'est pas prête. Impossible de déterminer les dimensions.\"\n );\n }\n\n const format = options.format ?? \"jpeg\";\n const jpegQuality = options.jpegQuality ?? 0.95;\n const facingMode = options.facingMode ?? \"environment\";\n const preferImageCapture = options.preferImageCapture ?? true;\n\n const effectiveCropArea: DocumentCropArea = cropArea ?? {\n x: 0,\n y: 0,\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n };\n\n console.debug(\"[CameraService] captureDocument request\", {\n format,\n jpegQuality,\n facingMode,\n preferImageCapture,\n cropArea: effectiveCropArea,\n videoDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n });\n\n if (this.imageCapture && preferImageCapture) {\n try {\n const result = await this.captureWithImageCapture(\n videoElement,\n effectiveCropArea,\n {\n format,\n jpegQuality,\n facingMode,\n }\n );\n\n if (result) {\n console.debug(\"[CameraService] captureDocument via ImageCapture\", {\n cropArea: effectiveCropArea,\n result,\n });\n return result;\n }\n } catch (error) {\n console.warn(\n \"Capture haute résolution impossible, fallback sur capture vidéo\",\n error\n );\n }\n }\n\n const fallback = professionalImageQuality.autoEnhanceImage(\n videoElement,\n effectiveCropArea,\n {\n outputFormat: format,\n jpegQuality,\n flipHorizontal: facingMode === \"user\",\n ...QUALITY_REQUIREMENTS,\n }\n );\n\n console.debug(\"[CameraService] captureDocument via video fallback\", {\n cropArea: effectiveCropArea,\n analysis: fallback.analysis,\n method: this.captureMethod,\n sourceDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n });\n\n return {\n dataUrl: fallback.dataUrl,\n analysis: fallback.analysis,\n method: this.captureMethod,\n sourceDimensions: {\n width: videoElement.videoWidth,\n height: videoElement.videoHeight,\n },\n cropDimensions: {\n width: effectiveCropArea.width,\n height: effectiveCropArea.height,\n },\n };\n }\n\n captureFrame(\n videoElement: HTMLVideoElement | null,\n canvasElement: HTMLCanvasElement | null\n ): string | null {\n if (!videoElement || !canvasElement || !videoElement.videoWidth) {\n return null;\n }\n\n const ctx = canvasElement.getContext(\"2d\");\n if (!ctx) return null;\n\n canvasElement.width = videoElement.videoWidth;\n canvasElement.height = videoElement.videoHeight;\n\n ctx.drawImage(\n videoElement,\n 0,\n 0,\n canvasElement.width,\n canvasElement.height\n );\n\n return canvasElement.toDataURL(\"image/jpeg\");\n }\n\n stopCamera() {\n if (this.stream) {\n this.stream.getTracks().forEach((track) => track.stop());\n this.stream = null;\n }\n\n this.videoTrack = null;\n this.imageCapture = null;\n this.lastTrackSettings = null;\n this.captureMethod = this.devMode ? \"mock\" : \"canvas\";\n }\n\n setDevMode(enabled: boolean): void {\n this.devMode = enabled;\n }\n\n setMockImage(imagePath: string): void {\n this.mockImagePath = imagePath;\n }\n\n isDevModeEnabled(): boolean {\n return this.devMode;\n }\n\n getCurrentCaptureMethod(): CaptureMethod {\n return this.captureMethod;\n }\n\n /**\n * Probes the camera to discover its maximum supported resolution.\n * Opens a temporary low-res stream, reads getCapabilities(), then closes it.\n * Returns null if capabilities cannot be determined (the caller should fallback to defaults).\n */\n private async getMaxCameraResolution(\n facingMode: string,\n deviceId?: string\n ): Promise<{ width: number; height: number } | null> {\n try {\n const constraints: MediaTrackConstraints = { facingMode };\n if (deviceId) {\n constraints.deviceId = { exact: deviceId };\n }\n\n const probeStream = await navigator.mediaDevices.getUserMedia({\n video: constraints,\n });\n\n const track = probeStream.getVideoTracks()[0];\n if (!track) {\n probeStream.getTracks().forEach((t) => t.stop());\n return null;\n }\n\n let maxWidth: number | undefined;\n let maxHeight: number | undefined;\n\n // getCapabilities() is supported on Chrome/Edge/Android but not all browsers\n if (typeof track.getCapabilities === \"function\") {\n const capabilities = track.getCapabilities();\n maxWidth = (capabilities as Record<string, any>).width?.max;\n maxHeight = (capabilities as Record<string, any>).height?.max;\n }\n\n // Stop the probe stream immediately\n probeStream.getTracks().forEach((t) => t.stop());\n\n if (maxWidth && maxHeight) {\n console.debug(\"[CameraService] Device max resolution\", {\n width: maxWidth,\n height: maxHeight,\n });\n return { width: maxWidth, height: maxHeight };\n }\n\n return null;\n } catch (error) {\n console.warn(\"[CameraService] Could not probe camera capabilities\", error);\n return null;\n }\n }\n\n private async waitForVideoReady(video: HTMLVideoElement): Promise<void> {\n // Explicitly call play() — required on some Android devices even with autoplay attribute\n try {\n await video.play();\n } catch (playError) {\n console.warn(\"[CameraService] video.play() failed, relying on autoplay\", playError);\n }\n\n if (\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.videoWidth > 0\n ) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const TIMEOUT_MS = 5000;\n\n const onReady = () => {\n clearTimeout(timeout);\n video.removeEventListener(\"loadeddata\", onReady);\n video.removeEventListener(\"playing\", onReady);\n resolve();\n };\n\n // Listen for both events — whichever fires first\n video.addEventListener(\"loadeddata\", onReady, { once: true });\n video.addEventListener(\"playing\", onReady, { once: true });\n\n // Safety timeout to avoid hanging indefinitely\n const timeout = setTimeout(() => {\n video.removeEventListener(\"loadeddata\", onReady);\n video.removeEventListener(\"playing\", onReady);\n console.warn(\"[CameraService] waitForVideoReady timed out after\", TIMEOUT_MS, \"ms\");\n resolve();\n }, TIMEOUT_MS);\n });\n }\n\n private async captureWithImageCapture(\n videoElement: HTMLVideoElement,\n cropArea: DocumentCropArea,\n options: Required<Pick<CaptureDocumentOptions, \"format\" | \"jpegQuality\">> & {\n facingMode: CameraFacingMode;\n }\n ): Promise<CaptureDocumentResult | null> {\n if (!this.imageCapture) {\n return null;\n }\n\n // Use the actual stream resolution for takePhoto to ensure consistency\n const photoSettings: PhotoSettings = {};\n if (this.lastTrackSettings?.width && this.lastTrackSettings?.height) {\n photoSettings.imageWidth = this.lastTrackSettings.width;\n photoSettings.imageHeight = this.lastTrackSettings.height;\n console.debug(\"[CameraService] takePhoto with explicit resolution\", photoSettings);\n }\n\n const blob = await this.imageCapture.takePhoto(photoSettings);\n const { source, width, height, cleanup } = await this.loadCanvasSourceFromBlob(\n blob\n );\n\n try {\n const ratioX = width / videoElement.videoWidth;\n const ratioY = height / videoElement.videoHeight;\n\n if (!isFinite(ratioX) || !isFinite(ratioY)) {\n throw new Error(\"Ratios de capture invalides\");\n }\n\n const scaled = this.scaleCropArea(cropArea, ratioX, ratioY, width, height);\n\n const analysis = professionalImageQuality.analyzeQuality(\n scaled.width,\n scaled.height,\n QUALITY_REQUIREMENTS\n );\n\n const outputWidth = Math.max(\n 1,\n Math.round(scaled.width * analysis.recommendedScale)\n );\n const outputHeight = Math.max(\n 1,\n Math.round(scaled.height * analysis.recommendedScale)\n );\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = outputWidth;\n canvas.height = outputHeight;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Impossible de créer le contexte de rendu\");\n }\n\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n if (options.facingMode === \"user\") {\n ctx.translate(outputWidth, 0);\n ctx.scale(-1, 1);\n }\n\n ctx.drawImage(\n source,\n scaled.x,\n scaled.y,\n scaled.width,\n scaled.height,\n 0,\n 0,\n outputWidth,\n outputHeight\n );\n\n const dataUrl =\n options.format === \"jpeg\"\n ? canvas.toDataURL(\"image/jpeg\", options.jpegQuality)\n : canvas.toDataURL(\"image/png\");\n\n console.debug(\"[CameraService] ImageCapture crop applied\", {\n originalDimensions: { width, height },\n crop: scaled,\n output: { width: outputWidth, height: outputHeight },\n analysis,\n });\n\n return {\n dataUrl,\n analysis,\n method: \"imageCapture\",\n sourceDimensions: { width, height },\n cropDimensions: {\n width: scaled.width,\n height: scaled.height,\n },\n };\n } finally {\n if (source instanceof ImageBitmap && typeof source.close === \"function\") {\n source.close();\n }\n\n cleanup?.();\n }\n }\n\n private async loadCanvasSourceFromBlob(blob: Blob): Promise<CanvasSource> {\n if (typeof createImageBitmap === \"function\") {\n try {\n const bitmap = await createImageBitmap(blob, {\n imageOrientation: \"from-image\",\n } as ImageBitmapOptions);\n\n return {\n source: bitmap,\n width: bitmap.width,\n height: bitmap.height,\n cleanup: () => {\n if (typeof bitmap.close === \"function\") {\n bitmap.close();\n }\n },\n };\n } catch (error) {\n console.warn(\"createImageBitmap a échoué, fallback sur HTMLImageElement\", error);\n }\n }\n\n const objectUrl = URL.createObjectURL(blob);\n\n const image = await new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (event) => reject(event);\n img.src = objectUrl;\n });\n\n return {\n source: image,\n width: image.naturalWidth,\n height: image.naturalHeight,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n }\n\n private scaleCropArea(\n cropArea: DocumentCropArea,\n ratioX: number,\n ratioY: number,\n maxWidth: number,\n maxHeight: number\n ): { x: number; y: number; width: number; height: number } {\n const scaledX = Math.max(0, Math.round(cropArea.x * ratioX));\n const scaledY = Math.max(0, Math.round(cropArea.y * ratioY));\n const scaledWidth = Math.min(\n maxWidth - scaledX,\n Math.round(cropArea.width * ratioX)\n );\n const scaledHeight = Math.min(\n maxHeight - scaledY,\n Math.round(cropArea.height * ratioY)\n );\n\n if (scaledWidth <= 0 || scaledHeight <= 0) {\n throw new Error(\"Zone de capture invalide après scaling\");\n }\n\n return {\n x: scaledX,\n y: scaledY,\n width: scaledWidth,\n height: scaledHeight,\n };\n }\n}\n\nexport const cameraService = new CameraService();\n"],"names":["__awaiter","professionalImageQuality","__assign"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __awaiter, __generator
|
|
1
|
+
import { __assign, __awaiter, __generator } from '../../node_modules/tslib/tslib.es6.js';
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import DocumentCollectionIntroduction from './DocumentCollectionIntroduction.js';
|
|
@@ -11,6 +11,7 @@ import DocumentSuccess from './DocumentSuccess.js';
|
|
|
11
11
|
import BeforePhoto from '../id-check/BeforePhoto.js';
|
|
12
12
|
import BeforeVersoPhoto from '../id-check/BeforeVersoPhoto.js';
|
|
13
13
|
import Photo from '../id-check/Photo.js';
|
|
14
|
+
import PhotoPreview from '../id-check/PhotoPreview.js';
|
|
14
15
|
import PhotoConfirmation from '../id-check/PhotoConfirmation.js';
|
|
15
16
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
16
17
|
import ButtonDesktop from '../ui/ButtonDesktop.js';
|
|
@@ -106,7 +107,7 @@ var DocumentCollection = function (_a) {
|
|
|
106
107
|
setCurrentStep(3); // Go to action (Upload screen or Photo flow)
|
|
107
108
|
};
|
|
108
109
|
var handlePhotoCapture = function (imageData, side) { return __awaiter(void 0, void 0, void 0, function () {
|
|
109
|
-
var imageBlob, processedBlob, processedDataUrl_1,
|
|
110
|
+
var imageBlob, processedBlob, processedDataUrl_1, error_1;
|
|
110
111
|
return __generator(this, function (_a) {
|
|
111
112
|
switch (_a.label) {
|
|
112
113
|
case 0:
|
|
@@ -122,14 +123,6 @@ var DocumentCollection = function (_a) {
|
|
|
122
123
|
var _a;
|
|
123
124
|
return (__assign(__assign({}, prev), (_a = {}, _a[side] = processedDataUrl_1, _a)));
|
|
124
125
|
});
|
|
125
|
-
if (side === "recto") {
|
|
126
|
-
selected = allowedDocumentTypes.find(function (d) { return d.id === selectedDocumentType; });
|
|
127
|
-
requiresTwoSides = (selected === null || selected === void 0 ? void 0 : selected.side) === "RECTO_VERSO";
|
|
128
|
-
setPhotoSubStep(requiresTwoSides ? "before-verso" : "confirmation");
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
setPhotoSubStep("confirmation");
|
|
132
|
-
}
|
|
133
126
|
return [3 /*break*/, 4];
|
|
134
127
|
case 3:
|
|
135
128
|
error_1 = _a.sent();
|
|
@@ -138,16 +131,10 @@ var DocumentCollection = function (_a) {
|
|
|
138
131
|
var _a;
|
|
139
132
|
return (__assign(__assign({}, prev), (_a = {}, _a[side] = imageData, _a)));
|
|
140
133
|
});
|
|
141
|
-
if (side === "recto") {
|
|
142
|
-
selected = allowedDocumentTypes.find(function (d) { return d.id === selectedDocumentType; });
|
|
143
|
-
requiresTwoSides = (selected === null || selected === void 0 ? void 0 : selected.side) === "RECTO_VERSO";
|
|
144
|
-
setPhotoSubStep(requiresTwoSides ? "before-verso" : "confirmation");
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
setPhotoSubStep("confirmation");
|
|
148
|
-
}
|
|
149
134
|
return [3 /*break*/, 4];
|
|
150
|
-
case 4:
|
|
135
|
+
case 4:
|
|
136
|
+
setPhotoSubStep(side === "recto" ? "preview-recto" : "preview-verso");
|
|
137
|
+
return [2 /*return*/];
|
|
151
138
|
}
|
|
152
139
|
});
|
|
153
140
|
}); };
|
|
@@ -290,29 +277,39 @@ var DocumentCollection = function (_a) {
|
|
|
290
277
|
return (jsx(DocumentCollectionMethodSelection, { onMethodSelect: handleMethodSelect, onBack: handleBack, title: documentSelection === null || documentSelection === void 0 ? void 0 : documentSelection.title, description: documentSelection === null || documentSelection === void 0 ? void 0 : documentSelection.description }));
|
|
291
278
|
case 3:
|
|
292
279
|
if (selectedMethod === "download") {
|
|
293
|
-
return (jsx(DocumentCollectionUpload, { selectedDocumentType: selectedDocumentType, allowedDocumentTypes: allowedDocumentTypes, onUpload: handleDocumentUpload, onBack: handleBack, documentSelection: documentSelection }));
|
|
280
|
+
return (jsx(DocumentCollectionUpload, { selectedDocumentType: selectedDocumentType, allowedDocumentTypes: allowedDocumentTypes, onUpload: handleDocumentUpload, onBack: handleBack, documentSelection: documentSelection, sessionId: sessionId }));
|
|
294
281
|
}
|
|
295
282
|
else {
|
|
296
283
|
// Photo flow
|
|
297
|
-
var
|
|
284
|
+
var requiresTwoSides_1 = ((_b = allowedDocumentTypes.find(function (dt) { return dt.id === selectedDocumentType; })) === null || _b === void 0 ? void 0 : _b.side) === "RECTO_VERSO";
|
|
298
285
|
switch (photoSubStep) {
|
|
299
286
|
case "before-recto":
|
|
300
|
-
return jsx(BeforePhoto, { setStep: function () { return setPhotoSubStep("recto"); }, isSingleSided: !
|
|
287
|
+
return jsx(BeforePhoto, { setStep: function () { return setPhotoSubStep("recto"); }, isSingleSided: !requiresTwoSides_1, onBack: handleBack });
|
|
301
288
|
case "recto":
|
|
302
289
|
return jsx(Photo, { onCapture: function (img) { return handlePhotoCapture(img, "recto"); }, automaticCapture: false, maskType: "document" });
|
|
290
|
+
case "preview-recto":
|
|
291
|
+
return (jsx(PhotoPreview, { imageUrl: capturedImages.recto, side: "recto", isSingleSided: !requiresTwoSides_1, onValidate: function () { return setPhotoSubStep(requiresTwoSides_1 ? "before-verso" : "confirmation"); }, onRetake: function () {
|
|
292
|
+
setCapturedImages(function (prev) { var next = __assign({}, prev); delete next.recto; return next; });
|
|
293
|
+
setPhotoSubStep("recto");
|
|
294
|
+
} }));
|
|
303
295
|
case "before-verso":
|
|
304
296
|
return jsx(BeforeVersoPhoto, { setStep: function () { return setPhotoSubStep("verso"); } });
|
|
305
297
|
case "verso":
|
|
306
298
|
return jsx(Photo, { onCapture: function (img) { return handlePhotoCapture(img, "verso"); }, automaticCapture: false, maskType: "document" });
|
|
299
|
+
case "preview-verso":
|
|
300
|
+
return (jsx(PhotoPreview, { imageUrl: capturedImages.verso, side: "verso", onValidate: function () { return setPhotoSubStep("confirmation"); }, onRetake: function () {
|
|
301
|
+
setCapturedImages(function (prev) { var next = __assign({}, prev); delete next.verso; return next; });
|
|
302
|
+
setPhotoSubStep("verso");
|
|
303
|
+
} }));
|
|
307
304
|
case "confirmation":
|
|
308
|
-
return (jsx(PhotoConfirmation, { imageUrl: capturedImages.recto, versoImageUrl: capturedImages.verso, requiresTwoSides:
|
|
305
|
+
return (jsx(PhotoConfirmation, { imageUrl: capturedImages.recto, versoImageUrl: capturedImages.verso, requiresTwoSides: requiresTwoSides_1, onConfirm: handlePhotoConfirmation, onRetry: function () {
|
|
309
306
|
setPhotoSubStep("before-recto");
|
|
310
307
|
setCapturedImages({});
|
|
311
308
|
}, onRetryAfterProcessing: function () {
|
|
312
309
|
setCurrentStep(1);
|
|
313
310
|
setPhotoSubStep("before-recto");
|
|
314
311
|
setCapturedImages({});
|
|
315
|
-
}, fileUploaded: fileUploaded, isSingleSided: !
|
|
312
|
+
}, fileUploaded: fileUploaded, isSingleSided: !requiresTwoSides_1 }));
|
|
316
313
|
}
|
|
317
314
|
}
|
|
318
315
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentCollection.js","sources":["../../../../../src/components/document-collection/DocumentCollection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport {\n SessionTemplate,\n SessionTemplateNode,\n stepObject,\n} from \"../../types/session\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport DocumentCollectionIntroduction from \"./DocumentCollectionIntroduction\";\nimport DocumentCollectionSelection from \"./DocumentCollectionSelection\";\nimport DocumentCollectionUpload from \"./DocumentCollectionUpload\";\nimport DocumentCollectionMethodSelection from \"./DocumentCollectionMethodSelection\";\nimport { DocumentError, DocumentProcessing, DocumentSuccess } from \".\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport { analyzeFiles } from \"../../services/analysis\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\n\nexport type DocumentTypeSide = \"ONE_FILE\" | \"RECTO_VERSO\";\n\nexport interface NodeDocumentCollection {\n id: string;\n allowedDocumentTypes: Array<{\n name: string;\n id: string;\n collectOnly?: boolean;\n }>;\n allowedAddingMethods: Array<'download' | 'picture'>;\n introductionPage: {\n title: string;\n description: string;\n };\n documentSelection: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n collectOnly?: boolean;\n}\n\ninterface DocumentCollectionProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeDocumentCollection;\n onContinueOnPC?: () => void;\n allowedDocumentTypes: AllowedDocumentType[];\n allowedAddingMethods: string[];\n template?: SessionTemplate;\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * DocumentCollection component manages the multi-step document collection flow.\n * It handles document type selection, document upload, processing, and error/success handling.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {NodeDocumentCollection} props.node - Node configuration containing allowed document types and page content.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC.\n * @param {AllowedDocumentType[]} props.allowedDocumentTypes - List of document types accepted for collection.\n * @param {string[]} props.allowedAddingMethods - List of allowed methods for adding documents (download, picture, etc.).\n * @param {Object} [props.introductionPage] - Optional introduction page configuration with title and description.\n * @param {Object} [props.documentSelection] - Optional document selection page configuration with title and description.\n *\n * @returns {JSX.Element} Multi-step document collection UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Manages internal state for step navigation, document selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for invalid navigation.\n * - Uses translation hooks for internationalization support.\n */\nconst DocumentCollection = ({\n stepObject,\n sessionId,\n node,\n template,\n onContinueOnPC,\n allowedDocumentTypes,\n allowedAddingMethods,\n introductionPage,\n documentSelection,\n allowResubmission,\n maxResubmissionAttempts,\n}: DocumentCollectionProps) => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [currentStep, setCurrentStep] = useState(introductionPage?.title ? 0 : 1);\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [selectedDocumentType, setSelectedDocumentType] = useState<string>(\"\");\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<\"download\" | \"picture\" | null>(null);\n const [photoSubStep, setPhotoSubStep] = useState<\"before-recto\" | \"recto\" | \"before-verso\" | \"verso\" | \"confirmation\">(\"before-recto\");\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>({});\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (allowResubmission === false && retryCount > 0) {\n setCurrentStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n if (retryCount > 0 && !isRetryAllowed()) {\n // User has exhausted retries, redirect to error page\n setCurrentStep(6);\n }\n }, [retryCount, allowResubmission]);\n\n const handleContinueFromIntroduction = () => {\n setCurrentStep(1);\n };\n\n const handleDocumentTypeSelect = (docType: string, files?: onUploadFiles) => {\n setSelectedDocumentType(docType);\n\n if (files) {\n handleDocumentUpload(files);\n return;\n }\n\n const isPictureAllowed = allowedAddingMethods.includes(\"picture\");\n const isDownloadAllowed = allowedAddingMethods.includes(\"download\");\n\n if (isPictureAllowed && isDownloadAllowed) {\n setCurrentStep(2); // Method selection\n } else {\n const method = isPictureAllowed ? \"picture\" : \"download\";\n handleMethodSelect(method);\n }\n };\n\n const handleMethodSelect = (method: \"download\" | \"picture\") => {\n setSelectedMethod(method);\n if (method === \"picture\") {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }\n setCurrentStep(3); // Go to action (Upload screen or Photo flow)\n };\n\n const handlePhotoCapture = async (imageData: string, side: \"recto\" | \"verso\") => {\n try {\n const imageBlob = dataUrlToBlob(imageData);\n const processedBlob = await resizeAfterCapture(imageBlob);\n const processedDataUrl = await blobToDataUrl(processedBlob);\n\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n\n if (side === \"recto\") {\n const selected = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n const requiresTwoSides = selected?.side === \"RECTO_VERSO\";\n setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\");\n } else {\n setPhotoSubStep(\"confirmation\");\n }\n } catch (error) {\n console.error(`[DocumentCollection] Failed to process photo for ${side}:`, error);\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n if (side === \"recto\") {\n const selected = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n const requiresTwoSides = selected?.side === \"RECTO_VERSO\";\n setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\");\n } else {\n setPhotoSubStep(\"confirmation\");\n }\n }\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n const files: onUploadFiles = {\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n };\n setFileUploaded(files);\n setCurrentStep(4);\n }\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n setFileUploaded(files);\n\n // Check if the selected document type is collectOnly — skip processing step\n const selectedDoc = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n if (selectedDoc?.collectOnly) {\n handleCollectOnlyUpload(files);\n return;\n }\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setCurrentStep(6);\n } else {\n // Proceed to processing\n setCurrentStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n currentRetryCount?: number,\n apiAnalysisData?: Prediction[] | null\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n if (apiAnalysisData.length > 0) {\n setErrorCode(apiAnalysisData[0].code);\n }\n }\n\n if (success) {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setCurrentStep(5);\n } else {\n setRetryCount((prev) => {\n const newCount = prev + 1;\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setCurrentStep(6);\n }\n };\n\n const handleCollectOnlyUpload = async (files: onUploadFiles) => {\n try {\n await analyzeFiles(sessionId, node.id, files, selectedDocumentType, {\n documentTypeKey: selectedDocumentType,\n collectOnly: true,\n enablePolling: false,\n });\n handleProcessingComplete(true, retryCount, null);\n } catch (error) {\n console.error(\"[DocumentCollection] collectOnly upload failed:\", error);\n handleProcessingComplete(false, retryCount, null);\n }\n };\n\n const handleRetryFromError = () => {\n setCurrentStep(1);\n setSelectedMethod(null);\n setCapturedImages({});\n setFileUploaded(null);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n if (allowResubmission === undefined) return true;\n if (!allowResubmission) return false;\n if (maxResubmissionAttempts !== undefined) {\n return retryCount <= maxResubmissionAttempts;\n }\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n stepObject.setStep(stepObject.step - 1);\n } else {\n setCurrentStep(currentStep - 1);\n }\n };\n\n switch (currentStep) {\n case 0:\n return (\n <DocumentCollectionIntroduction\n onContinue={handleContinueFromIntroduction}\n onBack={handleBack}\n introductionPage={introductionPage}\n />\n );\n case 1:\n return (\n <DocumentCollectionSelection\n onContinue={handleDocumentTypeSelect}\n onBack={handleBack}\n allowedDocumentTypes={allowedDocumentTypes}\n allowedAddingMethods={allowedAddingMethods}\n stepObject={stepObject}\n documentSelection={documentSelection}\n />\n );\n case 2:\n return (\n <DocumentCollectionMethodSelection\n onMethodSelect={handleMethodSelect}\n onBack={handleBack}\n title={documentSelection?.title}\n description={documentSelection?.description}\n />\n );\n case 3:\n if (selectedMethod === \"download\") {\n return (\n <DocumentCollectionUpload\n selectedDocumentType={selectedDocumentType}\n allowedDocumentTypes={allowedDocumentTypes}\n onUpload={handleDocumentUpload}\n onBack={handleBack}\n documentSelection={documentSelection}\n />\n );\n } else {\n // Photo flow\n const requiresTwoSides = allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.side === \"RECTO_VERSO\";\n\n switch (photoSubStep) {\n case \"before-recto\":\n return <BeforePhoto setStep={() => setPhotoSubStep(\"recto\")} isSingleSided={!requiresTwoSides} onBack={handleBack} />;\n case \"recto\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"recto\")} automaticCapture={false} maskType=\"document\" />;\n case \"before-verso\":\n return <BeforeVersoPhoto setStep={() => setPhotoSubStep(\"verso\")} />;\n case \"verso\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"verso\")} automaticCapture={false} maskType=\"document\" />;\n case \"confirmation\":\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={requiresTwoSides}\n onConfirm={handlePhotoConfirmation}\n onRetry={() => {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n onRetryAfterProcessing={() => {\n setCurrentStep(1);\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n fileUploaded={fileUploaded}\n isSingleSided={!requiresTwoSides}\n />\n );\n }\n }\n return null;\n\n case 4:\n return (\n <DocumentProcessing\n documentType={selectedDocumentType}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={selectedDocumentType}\n retryCount={retryCount}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <DocumentSuccess\n documentType={selectedDocumentType}\n documentTypeLabel={t(allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.name || \"\")}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n successDetails={{\n nextSteps: {\n title: t(\"success.next_steps\", \"Prochaines étapes\"),\n description: t(\n \"success.next_steps_description\",\n \"Vous pouvez maintenant continuer le processus de vérification en suivant les instructions à l'écran.\"\n ),\n },\n }}\n />\n );\n case 6:\n return (\n <DocumentError\n documentType={selectedDocumentType}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={allowResubmission}\n maxResubmissionAttempts={maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n\n default:\n console.error(`Invalid document collection step: ${currentStep} `);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_collection.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"document_collection.navigation_error.description\", \"Étape non valide. Veuillez recommencer.\")}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"w-full\"\n onClick={() => setCurrentStep(0)}\n >\n {t(\"document_collection.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCollection;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentCollection.js","sources":["../../../../../src/components/document-collection/DocumentCollection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport {\n SessionTemplate,\n SessionTemplateNode,\n stepObject,\n} from \"../../types/session\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport DocumentCollectionIntroduction from \"./DocumentCollectionIntroduction\";\nimport DocumentCollectionSelection from \"./DocumentCollectionSelection\";\nimport DocumentCollectionUpload from \"./DocumentCollectionUpload\";\nimport DocumentCollectionMethodSelection from \"./DocumentCollectionMethodSelection\";\nimport { DocumentError, DocumentProcessing, DocumentSuccess } from \".\";\nimport JDIProcessing from \"../jdi/JDIProcessing\";\nimport JDISuccess from \"../jdi/JDISuccess\";\nimport JDIError from \"../jdi/JDIError\";\nimport BeforePhoto from \"../id-check/BeforePhoto\";\nimport BeforeVersoPhoto from \"../id-check/BeforeVersoPhoto\";\nimport Photo from \"../id-check/Photo\";\nimport PhotoPreview from \"../id-check/PhotoPreview\";\nimport PhotoConfirmation from \"../id-check/PhotoConfirmation\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { updateSessionCurrentStep } from \"../../services/sessionService\";\nimport { analyzeFiles } from \"../../services/analysis\";\nimport {\n getNodeRetryCount,\n incrementNodeRetryCount,\n} from \"../../services/retryService\";\nimport { getSession } from \"../../context/SessionContext\";\nimport {\n resizeAfterCapture,\n dataUrlToBlob,\n blobToDataUrl,\n} from \"../../utils/imageProcessing\";\n\nexport type DocumentTypeSide = \"ONE_FILE\" | \"RECTO_VERSO\";\n\nexport interface NodeDocumentCollection {\n id: string;\n allowedDocumentTypes: Array<{\n name: string;\n id: string;\n collectOnly?: boolean;\n }>;\n allowedAddingMethods: Array<'download' | 'picture'>;\n introductionPage: {\n title: string;\n description: string;\n };\n documentSelection: {\n title: string;\n description: string;\n };\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n}\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n collectOnly?: boolean;\n}\n\ninterface DocumentCollectionProps {\n stepObject: stepObject;\n sessionId: string;\n node: NodeDocumentCollection;\n onContinueOnPC?: () => void;\n allowedDocumentTypes: AllowedDocumentType[];\n allowedAddingMethods: string[];\n template?: SessionTemplate;\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n}\n\n/**\n * DocumentCollection component manages the multi-step document collection flow.\n * It handles document type selection, document upload, processing, and error/success handling.\n *\n * @component\n * @param {Object} props - Component props.\n * @param {stepObject} props.stepObject - Object managing the current step in the parent flow, with setStep and step properties.\n * @param {string} props.sessionId - Unique identifier for the current session.\n * @param {NodeDocumentCollection} props.node - Node configuration containing allowed document types and page content.\n * @param {() => void} [props.onContinueOnPC] - Optional callback to continue the process on a PC.\n * @param {AllowedDocumentType[]} props.allowedDocumentTypes - List of document types accepted for collection.\n * @param {string[]} props.allowedAddingMethods - List of allowed methods for adding documents (download, picture, etc.).\n * @param {Object} [props.introductionPage] - Optional introduction page configuration with title and description.\n * @param {Object} [props.documentSelection] - Optional document selection page configuration with title and description.\n *\n * @returns {JSX.Element} Multi-step document collection UI, rendering different subcomponents based on the current step.\n *\n * @remarks\n * - Manages internal state for step navigation, document selection, file uploads, and error handling.\n * - Displays error messages and fallback UI for invalid navigation.\n * - Uses translation hooks for internationalization support.\n */\nconst DocumentCollection = ({\n stepObject,\n sessionId,\n node,\n template,\n onContinueOnPC,\n allowedDocumentTypes,\n allowedAddingMethods,\n introductionPage,\n documentSelection,\n allowResubmission,\n maxResubmissionAttempts,\n}: DocumentCollectionProps) => {\n const { t } = useI18n();\n const { session } = getSession();\n\n const [currentStep, setCurrentStep] = useState(introductionPage?.title ? 0 : 1);\n const [fileUploaded, setFileUploaded] = useState<onUploadFiles | null>(null);\n const [selectedDocumentType, setSelectedDocumentType] = useState<string>(\"\");\n const [analysisData, setAnalysisData] = useState<Prediction[] | null>(null);\n const [errorCode, setErrorCode] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<\"download\" | \"picture\" | null>(null);\n const [photoSubStep, setPhotoSubStep] = useState<\"before-recto\" | \"recto\" | \"preview-recto\" | \"before-verso\" | \"verso\" | \"preview-verso\" | \"confirmation\">(\"before-recto\");\n const [capturedImages, setCapturedImages] = useState<Record<string, string>>({});\n\n // Initialize retry count from session data\n const [retryCount, setRetryCount] = useState(() => {\n return getNodeRetryCount(session, node.id);\n });\n\n // Update retry count when session loads/changes\n useEffect(() => {\n if (session) {\n const sessionRetryCount = getNodeRetryCount(session, node.id);\n setRetryCount(sessionRetryCount);\n }\n }, [session, node.id]);\n\n // Check retry limits on mount/reload - if retries exhausted, show error page\n useEffect(() => {\n // Special case: if allowResubmission is false and retryCount > 0, show error immediately\n if (allowResubmission === false && retryCount > 0) {\n setCurrentStep(6);\n return;\n }\n\n // Normal case: check against maxResubmissionAttempts\n if (retryCount > 0 && !isRetryAllowed()) {\n // User has exhausted retries, redirect to error page\n setCurrentStep(6);\n }\n }, [retryCount, allowResubmission]);\n\n const handleContinueFromIntroduction = () => {\n setCurrentStep(1);\n };\n\n const handleDocumentTypeSelect = (docType: string, files?: onUploadFiles) => {\n setSelectedDocumentType(docType);\n\n if (files) {\n handleDocumentUpload(files);\n return;\n }\n\n const isPictureAllowed = allowedAddingMethods.includes(\"picture\");\n const isDownloadAllowed = allowedAddingMethods.includes(\"download\");\n\n if (isPictureAllowed && isDownloadAllowed) {\n setCurrentStep(2); // Method selection\n } else {\n const method = isPictureAllowed ? \"picture\" : \"download\";\n handleMethodSelect(method);\n }\n };\n\n const handleMethodSelect = (method: \"download\" | \"picture\") => {\n setSelectedMethod(method);\n if (method === \"picture\") {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }\n setCurrentStep(3); // Go to action (Upload screen or Photo flow)\n };\n\n const handlePhotoCapture = async (imageData: string, side: \"recto\" | \"verso\") => {\n try {\n const imageBlob = dataUrlToBlob(imageData);\n const processedBlob = await resizeAfterCapture(imageBlob);\n const processedDataUrl = await blobToDataUrl(processedBlob);\n setCapturedImages((prev) => ({ ...prev, [side]: processedDataUrl }));\n } catch (error) {\n console.error(`[DocumentCollection] Failed to process photo for ${side}:`, error);\n setCapturedImages((prev) => ({ ...prev, [side]: imageData }));\n }\n setPhotoSubStep(side === \"recto\" ? \"preview-recto\" : \"preview-verso\");\n };\n\n const handlePhotoConfirmation = () => {\n if (capturedImages.recto) {\n const files: onUploadFiles = {\n front: capturedImages.recto,\n back: capturedImages.verso || null,\n };\n setFileUploaded(files);\n setCurrentStep(4);\n }\n };\n\n const handleDocumentUpload = (files: onUploadFiles) => {\n setFileUploaded(files);\n\n // Check if the selected document type is collectOnly — skip processing step\n const selectedDoc = allowedDocumentTypes.find((d) => d.id === selectedDocumentType);\n if (selectedDoc?.collectOnly) {\n handleCollectOnlyUpload(files);\n return;\n }\n\n // Check if retry limit is reached before processing\n if (!isRetryAllowed() && retryCount > 0) {\n // Skip processing and go directly to error page\n setCurrentStep(6);\n } else {\n // Proceed to processing\n setCurrentStep(4);\n }\n };\n\n const handleProcessingComplete = (\n success: boolean,\n currentRetryCount?: number,\n apiAnalysisData?: Prediction[] | null\n ) => {\n if (apiAnalysisData) {\n setAnalysisData(apiAnalysisData);\n if (apiAnalysisData.length > 0) {\n setErrorCode(apiAnalysisData[0].code);\n }\n }\n\n if (success) {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n setCurrentStep(5);\n } else {\n setRetryCount((prev) => {\n const newCount = prev + 1;\n incrementNodeRetryCount(sessionId, node.id, prev).catch((error) => {\n console.error(\"Failed to update retry count in session:\", error);\n });\n return newCount;\n });\n setCurrentStep(6);\n }\n };\n\n const handleCollectOnlyUpload = async (files: onUploadFiles) => {\n try {\n await analyzeFiles(sessionId, node.id, files, selectedDocumentType, {\n documentTypeKey: selectedDocumentType,\n collectOnly: true,\n enablePolling: false,\n });\n handleProcessingComplete(true, retryCount, null);\n } catch (error) {\n console.error(\"[DocumentCollection] collectOnly upload failed:\", error);\n handleProcessingComplete(false, retryCount, null);\n }\n };\n\n const handleRetryFromError = () => {\n setCurrentStep(1);\n setSelectedMethod(null);\n setCapturedImages({});\n setFileUploaded(null);\n };\n\n // Check if retry is allowed based on configuration\n const isRetryAllowed = () => {\n if (allowResubmission === undefined) return true;\n if (!allowResubmission) return false;\n if (maxResubmissionAttempts !== undefined) {\n return retryCount <= maxResubmissionAttempts;\n }\n return true;\n };\n\n const handleContinueAnyway = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleSuccessContinue = () => {\n if (onContinueOnPC) {\n onContinueOnPC();\n } else {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n }\n };\n\n const handleBack = () => {\n if (currentStep === 0) {\n stepObject.setStep(stepObject.step - 1);\n } else {\n setCurrentStep(currentStep - 1);\n }\n };\n\n switch (currentStep) {\n case 0:\n return (\n <DocumentCollectionIntroduction\n onContinue={handleContinueFromIntroduction}\n onBack={handleBack}\n introductionPage={introductionPage}\n />\n );\n case 1:\n return (\n <DocumentCollectionSelection\n onContinue={handleDocumentTypeSelect}\n onBack={handleBack}\n allowedDocumentTypes={allowedDocumentTypes}\n allowedAddingMethods={allowedAddingMethods}\n stepObject={stepObject}\n documentSelection={documentSelection}\n />\n );\n case 2:\n return (\n <DocumentCollectionMethodSelection\n onMethodSelect={handleMethodSelect}\n onBack={handleBack}\n title={documentSelection?.title}\n description={documentSelection?.description}\n />\n );\n case 3:\n if (selectedMethod === \"download\") {\n return (\n <DocumentCollectionUpload\n selectedDocumentType={selectedDocumentType}\n allowedDocumentTypes={allowedDocumentTypes}\n onUpload={handleDocumentUpload}\n onBack={handleBack}\n documentSelection={documentSelection}\n sessionId={sessionId}\n />\n );\n } else {\n // Photo flow\n const requiresTwoSides = allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.side === \"RECTO_VERSO\";\n\n switch (photoSubStep) {\n case \"before-recto\":\n return <BeforePhoto setStep={() => setPhotoSubStep(\"recto\")} isSingleSided={!requiresTwoSides} onBack={handleBack} />;\n case \"recto\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"recto\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-recto\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.recto}\n side=\"recto\"\n isSingleSided={!requiresTwoSides}\n onValidate={() => setPhotoSubStep(requiresTwoSides ? \"before-verso\" : \"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.recto; return next; });\n setPhotoSubStep(\"recto\");\n }}\n />\n );\n case \"before-verso\":\n return <BeforeVersoPhoto setStep={() => setPhotoSubStep(\"verso\")} />;\n case \"verso\":\n return <Photo onCapture={(img) => handlePhotoCapture(img, \"verso\")} automaticCapture={false} maskType=\"document\" />;\n case \"preview-verso\":\n return (\n <PhotoPreview\n imageUrl={capturedImages.verso}\n side=\"verso\"\n onValidate={() => setPhotoSubStep(\"confirmation\")}\n onRetake={() => {\n setCapturedImages((prev) => { const next = { ...prev }; delete next.verso; return next; });\n setPhotoSubStep(\"verso\");\n }}\n />\n );\n case \"confirmation\":\n return (\n <PhotoConfirmation\n imageUrl={capturedImages.recto}\n versoImageUrl={capturedImages.verso}\n requiresTwoSides={requiresTwoSides}\n onConfirm={handlePhotoConfirmation}\n onRetry={() => {\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n onRetryAfterProcessing={() => {\n setCurrentStep(1);\n setPhotoSubStep(\"before-recto\");\n setCapturedImages({});\n }}\n fileUploaded={fileUploaded}\n isSingleSided={!requiresTwoSides}\n />\n );\n }\n }\n return null;\n\n case 4:\n return (\n <DocumentProcessing\n documentType={selectedDocumentType}\n onProcessingComplete={handleProcessingComplete}\n fileUploaded={fileUploaded}\n documentTypeId={selectedDocumentType}\n retryCount={retryCount}\n nodeId={node.id}\n />\n );\n case 5:\n return (\n <DocumentSuccess\n documentType={selectedDocumentType}\n documentTypeLabel={t(allowedDocumentTypes.find((dt) => dt.id === selectedDocumentType)?.name || \"\")}\n onContinue={handleSuccessContinue}\n errorCode={errorCode || undefined}\n successDetails={{\n nextSteps: {\n title: t(\"success.next_steps\", \"Prochaines étapes\"),\n description: t(\n \"success.next_steps_description\",\n \"Vous pouvez maintenant continuer le processus de vérification en suivant les instructions à l'écran.\"\n ),\n },\n }}\n />\n );\n case 6:\n return (\n <DocumentError\n documentType={selectedDocumentType}\n onRetry={handleRetryFromError}\n onContinueAnyway={handleContinueAnyway}\n retryCount={retryCount}\n predictions={analysisData || undefined}\n errorCode={errorCode || undefined}\n allowResubmission={allowResubmission}\n maxResubmissionAttempts={maxResubmissionAttempts}\n isRetryAllowed={isRetryAllowed()}\n />\n );\n\n default:\n console.error(`Invalid document collection step: ${currentStep} `);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"document_collection.navigation_error.title\", \"Erreur de navigation\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"document_collection.navigation_error.description\", \"Étape non valide. Veuillez recommencer.\")}\n </p>\n <ButtonDesktop\n type=\"back\"\n className=\"w-full\"\n onClick={() => setCurrentStep(0)}\n >\n {t(\"document_collection.navigation_error.back\", \"Retour au début\")}\n </ButtonDesktop>\n </div>\n );\n }\n};\n\nexport default DocumentCollection;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -8,9 +8,10 @@ import { Upload } from 'lucide-react';
|
|
|
8
8
|
import PDFPreview from '../ui/PDFPreview.js';
|
|
9
9
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
10
10
|
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
11
|
+
import { logDocumentLoaded, logDocumentsValidated } from '../../services/auditTrailService.js';
|
|
11
12
|
|
|
12
13
|
var DocumentCollectionUpload = function (_a) {
|
|
13
|
-
var onUpload = _a.onUpload, onBack = _a.onBack, selectedDocumentType = _a.selectedDocumentType, allowedDocumentTypes = _a.allowedDocumentTypes; _a.documentSelection;
|
|
14
|
+
var onUpload = _a.onUpload, onBack = _a.onBack, selectedDocumentType = _a.selectedDocumentType, allowedDocumentTypes = _a.allowedDocumentTypes; _a.documentSelection; var sessionId = _a.sessionId;
|
|
14
15
|
var t = useI18n().t;
|
|
15
16
|
var _b = useState(null), frontImage = _b[0], setFrontImage = _b[1];
|
|
16
17
|
var _c = useState(null), backImage = _c[0], setBackImage = _c[1];
|
|
@@ -115,6 +116,13 @@ var DocumentCollectionUpload = function (_a) {
|
|
|
115
116
|
front: frontImage,
|
|
116
117
|
back: requiresTwoSides() ? backImage : null,
|
|
117
118
|
};
|
|
119
|
+
if (sessionId) {
|
|
120
|
+
logDocumentLoaded(sessionId, "recto");
|
|
121
|
+
if (requiresTwoSides() && backImage) {
|
|
122
|
+
logDocumentLoaded(sessionId, "verso");
|
|
123
|
+
}
|
|
124
|
+
logDocumentsValidated(sessionId);
|
|
125
|
+
}
|
|
118
126
|
onUpload(files);
|
|
119
127
|
}
|
|
120
128
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentCollectionUpload.js","sources":["../../../../../src/components/document-collection/DocumentCollectionUpload.tsx"],"sourcesContent":["import React, { useState, useRef } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Card } from \"../ui/Card\";\nimport { Upload } from \"lucide-react\";\nimport PDFPreview from \"../ui/PDFPreview\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { DocumentTypeSide } from \"./DocumentCollection\";\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n}\n\ninterface DocumentCollectionUploadProps {\n onUpload: (files: onUploadFiles) => void;\n onBack: () => void;\n selectedDocumentType: string;\n allowedDocumentTypes: AllowedDocumentType[];\n documentSelection?: {\n title?: string;\n description?: string;\n };\n}\n\nconst DocumentCollectionUpload = ({\n onUpload,\n onBack,\n selectedDocumentType,\n allowedDocumentTypes,\n documentSelection,\n}: DocumentCollectionUploadProps) => {\n const { t } = useI18n();\n const [frontImage, setFrontImage] = useState<string | null>(null);\n const [backImage, setBackImage] = useState<string | null>(null);\n const [frontIsPDF, setFrontIsPDF] = useState<boolean>(false);\n const [backIsPDF, setBackIsPDF] = useState<boolean>(false);\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\n const requiresTwoSides = (): boolean => {\n const selected = allowedDocumentTypes.find(\n (d) => d.id === selectedDocumentType,\n );\n return selected?.side === \"RECTO_VERSO\";\n };\n\n const getSelectedDocumentName = () => {\n const selectedDoc = allowedDocumentTypes.find(\n (doc) => doc.id === selectedDocumentType,\n );\n if (!selectedDoc) return \"document\";\n return t(selectedDoc.name) || selectedDoc.name;\n };\n\n const handleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n side: \"front\" | \"back\" = \"front\",\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n if (\n !file.type.startsWith(\"image/\") &&\n !file.type.startsWith(\"application/pdf\")\n ) {\n setError(t(\"document_upload.errors.invalid_file_type\"));\n return;\n }\n if (file.size > 10 * 1024 * 1024) {\n setError(t(\"document_upload.errors.file_too_large\"));\n return;\n }\n\n setError(\"\");\n const isFilePDF = file.type === \"application/pdf\";\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n if (side === \"front\") {\n setFrontImage(result);\n setFrontIsPDF(isFilePDF);\n } else {\n setBackImage(result);\n setBackIsPDF(isFilePDF);\n }\n };\n reader.readAsDataURL(file);\n };\n\n const handleMultipleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const files = event.target.files;\n if (!files) return;\n const maxFiles = requiresTwoSides() ? 2 : 1;\n if (files.length > maxFiles) {\n setError(t(\"document_upload.errors.max_files\"));\n return;\n }\n setError(\"\");\n Array.from(files).forEach((file, index) => {\n if (\n !file.type.startsWith(\"image/\") &&\n !file.type.startsWith(\"application/pdf\")\n ) {\n setError(t(\"document_upload.errors.invalid_file_type\"));\n return;\n }\n if (file.size > 10 * 1024 * 1024) {\n setError(t(\"document_upload.errors.file_too_large\"));\n return;\n }\n const isFilePDF = file.type === \"application/pdf\";\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n if (index === 0) {\n setFrontImage(result);\n setFrontIsPDF(isFilePDF);\n } else if (index === 1 && requiresTwoSides()) {\n setBackImage(result);\n setBackIsPDF(isFilePDF);\n }\n };\n reader.readAsDataURL(file);\n });\n };\n\n const handleUpload = async () => {\n setError(\"\");\n if (!frontImage) {\n setError(t(\"jdi.document_upload.errors.add_photo_identity\"));\n return;\n }\n\n setIsUploading(true);\n try {\n const files = {\n front: frontImage,\n back: requiresTwoSides() ? backImage : null,\n };\n onUpload(files);\n } catch (err) {\n setError(t(\"document_upload.errors.upload_error\"));\n setIsUploading(false);\n }\n };\n\n const removeImage = (side: \"front\" | \"back\" = \"front\") => {\n if (side === \"front\") {\n setFrontImage(null);\n setFrontIsPDF(false);\n } else {\n setBackImage(null);\n setBackIsPDF(false);\n }\n setError(\"\");\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleUpload}\n disabled={!frontImage || isUploading}\n >\n {isUploading\n ? t(\"jdi.processing.download\")\n : requiresTwoSides()\n ? t(\"jdi.document_upload.validate_multiple\")\n : t(\"jdi.document_upload.validate_single\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack} disabled={isUploading}>\n {t(\"buttons.back\")}\n </Button>\n }\n />\n }\n >\n <div className=\"flex-1 flex items-start justify-center md:items-center p-4\">\n <div className=\"w-full max-w-lg\">\n <div className=\"text-center mb-8\">\n <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-2\">\n {t(\"document_upload.upload_title\")}\n </h1>\n <p className=\"text-gray-600\">\n {t(\"document_upload.upload_description\")}\n </p>\n </div>\n\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700\">\n {error}\n </div>\n )}\n\n <Card\n className=\"border-2 border-dashed border-teal-300 bg-teal-50/30 p-8 mb-6 text-center\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n const files = e.dataTransfer.files;\n if (files.length > 0) {\n const syntheticEvent = { target: { files } } as any;\n requiresTwoSides() ? handleMultipleFileChange(syntheticEvent) : handleFileChange(syntheticEvent);\n }\n }}\n >\n {!frontImage ? (\n <div className=\"space-y-6\">\n <h3 className=\"text-lg font-semibold text-gray-900\">{getSelectedDocumentName()}</h3>\n <Button\n onClick={() => requiresTwoSides() ? multipleInputRef.current?.click() : frontInputRef.current?.click()}\n className=\"bg-teal-600 text-white hover:bg-teal-700 px-6 py-2 rounded-lg font-medium mx-auto flex items-center gap-2\"\n disabled={isUploading}\n >\n <Upload size={18} />\n <span>{t(\"document_upload.browse_files\")}</span>\n </Button>\n <div className=\"text-xs text-gray-500 space-y-1\">\n <p>{t(\"document_upload.accepted_formats\")}</p>\n <p>{requiresTwoSides() ? t(\"document_upload.multiple_files_info\") : t(\"document_upload.single_file_info\")}</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"bg-white border rounded-lg p-4 relative group\">\n <p className=\"text-sm font-medium mb-1\">{frontIsPDF ? t(\"document_upload.pdf_preview\") : t(\"document_upload.image_preview\")}</p>\n {frontIsPDF ? <PDFPreview src={frontImage} /> : <img src={frontImage} alt={t(\"document_upload.front_side\")} className=\"max-h-48 mx-auto\" />}\n <button onClick={() => removeImage(\"front\")} className=\"absolute top-2 right-2 text-red-500 hover:text-red-700\">✕</button>\n </div>\n {requiresTwoSides() && backImage && (\n <div className=\"bg-white border rounded-lg p-4 relative group\">\n <p className=\"text-sm font-medium mb-1\">{t(\"document_upload.back_side\")} {backIsPDF ? \"PDF\" : \"\"}</p>\n {backIsPDF ? <PDFPreview src={backImage} /> : <img src={backImage} alt={t(\"document_upload.back_side\")} className=\"max-h-48 mx-auto\" />}\n <button onClick={() => removeImage(\"back\")} className=\"absolute top-2 right-2 text-red-500 hover:text-red-700\">✕</button>\n </div>\n )}\n {requiresTwoSides() && !backImage && (\n <Button\n onClick={() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*,.pdf\";\n input.onchange = (e) => handleFileChange(e as any, \"back\");\n input.click();\n }}\n className=\"text-teal-600 border border-teal-600 bg-transparent hover:bg-teal-50 w-full\"\n >\n {t(\"document_upload.add_back\")}\n </Button>\n )}\n </div>\n )}\n </Card>\n\n <input ref={frontInputRef} type=\"file\" accept=\"image/*,.pdf\" onChange={(e) => handleFileChange(e, \"front\")} className=\"hidden\" />\n <input ref={multipleInputRef} type=\"file\" accept=\"image/*,.pdf\" multiple={true} onChange={handleMultipleFileChange} className=\"hidden\" />\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default DocumentCollectionUpload;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;AA8BA,IAAM,wBAAwB,GAAG,UAAC,EAMF,EAAA;AAL5B,IAAA,IAAA,QAAQ,GAAA,EAAA,CAAA,QAAA,CAAA,CACR,MAAM,GAAA,EAAA,CAAA,MAAA,CAAA,CACN,oBAAoB,GAAA,EAAA,CAAA,oBAAA,CAAA,CACpB,oBAAoB,GAAA,EAAA,CAAA,oBAAA,CAAA,CACH,EAAA,CAAA;AAET,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;IACH,IAAA,EAAA,GAA8B,QAAQ,CAAgB,IAAI,CAAC,EAA1D,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAAiC;IAC3D,IAAA,EAAA,GAA4B,QAAQ,CAAgB,IAAI,CAAC,EAAxD,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,GAAA,EAAA,CAAA,CAAA,CAAiC;IACzD,IAAA,EAAA,GAA8B,QAAQ,CAAU,KAAK,CAAC,EAArD,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA4B;IACtD,IAAA,EAAA,GAA4B,QAAQ,CAAU,KAAK,CAAC,EAAnD,SAAS,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,YAAY,GAAA,EAAA,CAAA,CAAA,CAA4B;IACpD,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,CAAA,CAAlC,EAAA,CAAA,CAAA,CAAA,CAAA,CAAe,EAAA,CAAA,CAAA;AAEhC,IAAA,IAAM,aAAa,GAAG,MAAM,CAAmB,IAAI,CAAC;AACpD,IAAA,IAAM,gBAAgB,GAAG,MAAM,CAAmB,IAAI,CAAC;AACvD,IAAoB,MAAM,CAAiB,IAAI;AAE/C,IAAA,IAAM,gBAAgB,GAAG,YAAA;AACrB,QAAA,IAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CACtC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,CAAC,EAAE,KAAK,oBAAoB,CAAA,CAA7B,CAA6B,CACvC;QACD,OAAO,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,IAAI,MAAK,aAAa;AAC3C,IAAA,CAAC;AAED,IAAA,IAAM,uBAAuB,GAAG,YAAA;AAC5B,QAAA,IAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CACzC,UAAC,GAAG,EAAA,EAAK,OAAA,GAAG,CAAC,EAAE,KAAK,oBAAoB,CAAA,CAA/B,CAA+B,CAC3C;AACD,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,UAAU;QACnC,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI;AAClD,IAAA,CAAC;AAED,IAAA,IAAM,gBAAgB,GAAG,UACrB,KAA0C,EAC1C,IAAgC,EAAA;;AAAhC,QAAA,IAAA,IAAA,KAAA,MAAA,EAAA,EAAA,IAAA,GAAA,OAAgC,CAAA,CAAA;QAEhC,IAAM,IAAI,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,MAAM,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,CAAC,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,IACI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAC1C;AACE,YAAA,QAAQ,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;YACvD;QACJ;QACA,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;AAC9B,YAAA,QAAQ,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC;YACpD;QACJ;QAEA,QAAQ,CAAC,EAAE,CAAC;AACZ,QAAA,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,iBAAiB;AACjD,QAAA,IAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,QAAA,MAAM,CAAC,MAAM,GAAG,UAAC,CAAC,EAAA;;YACd,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAgB;AACzC,YAAA,IAAI,IAAI,KAAK,OAAO,EAAE;gBAClB,aAAa,CAAC,MAAM,CAAC;gBACrB,aAAa,CAAC,SAAS,CAAC;YAC5B;iBAAO;gBACH,YAAY,CAAC,MAAM,CAAC;gBACpB,YAAY,CAAC,SAAS,CAAC;YAC3B;AACJ,QAAA,CAAC;AACD,QAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC9B,IAAA,CAAC;IAED,IAAM,wBAAwB,GAAG,UAC7B,KAA0C,EAAA;AAE1C,QAAA,IAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAM,QAAQ,GAAG,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC;AAC3C,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE;AACzB,YAAA,QAAQ,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC;YAC/C;QACJ;QACA,QAAQ,CAAC,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAC,IAAI,EAAE,KAAK,EAAA;YAClC,IACI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAC/B,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAC1C;AACE,gBAAA,QAAQ,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;gBACvD;YACJ;YACA,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;AAC9B,gBAAA,QAAQ,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC;gBACpD;YACJ;AACA,YAAA,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,iBAAiB;AACjD,YAAA,IAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,UAAC,CAAC,EAAA;;gBACd,IAAM,MAAM,GAAG,CAAA,EAAA,GAAA,CAAC,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAgB;AACzC,gBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;oBACb,aAAa,CAAC,MAAM,CAAC;oBACrB,aAAa,CAAC,SAAS,CAAC;gBAC5B;AAAO,qBAAA,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,EAAE,EAAE;oBAC1C,YAAY,CAAC,MAAM,CAAC;oBACpB,YAAY,CAAC,SAAS,CAAC;gBAC3B;AACJ,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC9B,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;AAED,IAAA,IAAM,YAAY,GAAG,YAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;YACjB,QAAQ,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,EAAE;AACb,gBAAA,QAAQ,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC;gBAC5D,OAAA,CAAA,CAAA,YAAA;YACJ;YAEA,cAAc,CAAC,IAAI,CAAC;AACpB,YAAA,IAAI;AACM,gBAAA,KAAK,GAAG;AACV,oBAAA,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,gBAAgB,EAAE,GAAG,SAAS,GAAG,IAAI;iBAC9C;gBACD,QAAQ,CAAC,KAAK,CAAC;YACnB;YAAE,OAAO,GAAG,EAAE;AACV,gBAAA,QAAQ,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC;gBAClD,cAAc,CAAC,KAAK,CAAC;YACzB;;;SACH;IAED,IAAM,WAAW,GAAG,UAAC,IAAgC,EAAA;AAAhC,QAAA,IAAA,IAAA,KAAA,MAAA,EAAA,EAAA,IAAA,GAAA,OAAgC,CAAA,CAAA;AACjD,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YAClB,aAAa,CAAC,IAAI,CAAC;YACnB,aAAa,CAAC,KAAK,CAAC;QACxB;aAAO;YACH,YAAY,CAAC,IAAI,CAAC;YAClB,YAAY,CAAC,KAAK,CAAC;QACvB;QACA,QAAQ,CAAC,EAAE,CAAC;AAChB,IAAA,CAAC;IAED,QACIA,GAAA,CAAC,gBAAgB,EAAA,EACb,MAAM,EACFA,GAAA,CAAC,WAAW,EAAA,EACJ,OAAO,EACHA,GAAA,CAAC,MAAM,EAAA,EACH,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,CAAC,UAAU,IAAI,WAAW,EAAA,QAAA,EAEnC;AACG,sBAAE,CAAC,CAAC,yBAAyB;sBAC3B,gBAAgB;AACd,0BAAE,CAAC,CAAC,uCAAuC;0BACzC,CAAC,CAAC,qCAAqC,CAAC,EAAA,CAC7C,EAEb,SAAS,EACLA,GAAA,CAAC,MAAM,IAAC,OAAO,EAAC,WAAW,EAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAA,QAAA,EAC7D,CAAC,CAAC,cAAc,CAAC,GACb,EAAA,CAEf,EAAA,QAAA,EAGVA,aAAK,SAAS,EAAC,4DAA4D,EAAA,QAAA,EACvEC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAC5BA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,aAC7BD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,mDAAmD,EAAA,QAAA,EAC5D,CAAC,CAAC,8BAA8B,CAAC,GACjC,EACLA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,eAAe,EAAA,QAAA,EACvB,CAAC,CAAC,oCAAoC,CAAC,EAAA,CACxC,CAAA,EAAA,CACF,EAEL,KAAK,KACFA,aAAK,SAAS,EAAC,0EAA0E,EAAA,QAAA,EACpF,KAAK,EAAA,CACJ,CACT,EAEDA,GAAA,CAAC,IAAI,EAAA,EACD,SAAS,EAAC,2EAA2E,EACrF,UAAU,EAAE,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,cAAc,EAAE,CAAA,CAAlB,CAAkB,EACrC,MAAM,EAAE,UAAC,CAAC,EAAA;4BACN,CAAC,CAAC,cAAc,EAAE;AAClB,4BAAA,IAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK;AAClC,4BAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gCAClB,IAAM,cAAc,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAA,KAAA,EAAE,EAAS;AACnD,gCAAA,gBAAgB,EAAE,GAAG,wBAAwB,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAAC,cAAc,CAAC;4BACpG;AACJ,wBAAA,CAAC,EAAA,QAAA,EAEA,CAAC,UAAU,IACRC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACtBD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAAE,uBAAuB,EAAE,EAAA,CAAM,EACpFC,IAAA,CAAC,MAAM,EAAA,EACH,OAAO,EAAE,YAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,CAAM,OAAA,gBAAgB,EAAE,GAAG,CAAA,EAAA,GAAA,gBAAgB,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,EAAE,GAAG,CAAA,EAAA,GAAA,aAAa,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,EAAE,CAAA,CAAA,CAAA,EACtG,SAAS,EAAC,2GAA2G,EACrH,QAAQ,EAAE,WAAW,EAAA,QAAA,EAAA,CAErBD,GAAA,CAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAA,CAAI,EACpBA,GAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAO,CAAC,CAAC,8BAA8B,CAAC,EAAA,CAAQ,CAAA,EAAA,CAC3C,EACTC,cAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAAA,CAC5CD,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,CAAC,CAAC,kCAAkC,CAAC,EAAA,CAAK,EAC9CA,GAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC,qCAAqC,CAAC,GAAG,CAAC,CAAC,kCAAkC,CAAC,EAAA,CAAK,CAAA,EAAA,CAC5G,CAAA,EAAA,CACJ,KAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACtBA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+CAA+C,EAAA,QAAA,EAAA,CAC1DD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAE,UAAU,GAAG,CAAC,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,+BAA+B,CAAC,EAAA,CAAK,EAC/H,UAAU,GAAGA,IAAC,UAAU,EAAA,EAAC,GAAG,EAAE,UAAU,EAAA,CAAI,GAAGA,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE,SAAS,EAAC,kBAAkB,EAAA,CAAG,EAC3IA,gBAAQ,OAAO,EAAE,YAAA,EAAM,OAAA,WAAW,CAAC,OAAO,CAAC,EAApB,CAAoB,EAAE,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,QAAA,EAAA,CAAW,CAAA,EAAA,CACxH,EACL,gBAAgB,EAAE,IAAI,SAAS,KAC5BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+CAA+C,EAAA,QAAA,EAAA,CAC1DA,IAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAAA,CAAE,CAAC,CAAC,2BAA2B,CAAC,EAAA,GAAA,EAAG,SAAS,GAAG,KAAK,GAAG,EAAE,CAAA,EAAA,CAAK,EACpG,SAAS,GAAGD,GAAA,CAAC,UAAU,EAAA,EAAC,GAAG,EAAE,SAAS,EAAA,CAAI,GAAGA,aAAK,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,2BAA2B,CAAC,EAAE,SAAS,EAAC,kBAAkB,EAAA,CAAG,EACvIA,GAAA,CAAA,QAAA,EAAA,EAAQ,OAAO,EAAE,YAAA,EAAM,OAAA,WAAW,CAAC,MAAM,CAAC,CAAA,CAAnB,CAAmB,EAAE,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,QAAA,EAAA,CAAW,CAAA,EAAA,CACvH,CACT,EACA,gBAAgB,EAAE,IAAI,CAAC,SAAS,KAC7BA,GAAA,CAAC,MAAM,EAAA,EACH,OAAO,EAAE,YAAA;wCACL,IAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,wCAAA,KAAK,CAAC,IAAI,GAAG,MAAM;AACnB,wCAAA,KAAK,CAAC,MAAM,GAAG,cAAc;AAC7B,wCAAA,KAAK,CAAC,QAAQ,GAAG,UAAC,CAAC,EAAA,EAAK,OAAA,gBAAgB,CAAC,CAAQ,EAAE,MAAM,CAAC,CAAA,CAAlC,CAAkC;wCAC1D,KAAK,CAAC,KAAK,EAAE;AACjB,oCAAA,CAAC,EACD,SAAS,EAAC,6EAA6E,EAAA,QAAA,EAEtF,CAAC,CAAC,0BAA0B,CAAC,EAAA,CACzB,CACZ,CAAA,EAAA,CACC,CACT,EAAA,CACE,EAEPA,eAAO,GAAG,EAAE,aAAa,EAAE,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,gBAAgB,CAAC,CAAC,EAAE,OAAO,CAAC,EAA5B,CAA4B,EAAE,SAAS,EAAC,QAAQ,EAAA,CAAG,EACjIA,GAAA,CAAA,OAAA,EAAA,EAAO,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,wBAAwB,EAAE,SAAS,EAAC,QAAQ,EAAA,CAAG,IACvI,EAAA,CACJ,EAAA,CACS;AAE3B;;;;"}
|
|
1
|
+
{"version":3,"file":"DocumentCollectionUpload.js","sources":["../../../../../src/components/document-collection/DocumentCollectionUpload.tsx"],"sourcesContent":["import React, { useState, useRef } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Card } from \"../ui/Card\";\nimport { Upload } from \"lucide-react\";\nimport PDFPreview from \"../ui/PDFPreview\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { DocumentTypeSide } from \"./DocumentCollection\";\nimport {\n logDocumentLoaded,\n logDocumentsValidated,\n} from \"../../services/auditTrailService\";\n\ninterface AllowedDocumentType {\n id: string;\n name: string;\n side?: DocumentTypeSide;\n}\n\ninterface DocumentCollectionUploadProps {\n onUpload: (files: onUploadFiles) => void;\n onBack: () => void;\n selectedDocumentType: string;\n allowedDocumentTypes: AllowedDocumentType[];\n documentSelection?: {\n title?: string;\n description?: string;\n };\n sessionId?: string;\n}\n\nconst DocumentCollectionUpload = ({\n onUpload,\n onBack,\n selectedDocumentType,\n allowedDocumentTypes,\n documentSelection,\n sessionId,\n}: DocumentCollectionUploadProps) => {\n const { t } = useI18n();\n const [frontImage, setFrontImage] = useState<string | null>(null);\n const [backImage, setBackImage] = useState<string | null>(null);\n const [frontIsPDF, setFrontIsPDF] = useState<boolean>(false);\n const [backIsPDF, setBackIsPDF] = useState<boolean>(false);\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\n const requiresTwoSides = (): boolean => {\n const selected = allowedDocumentTypes.find(\n (d) => d.id === selectedDocumentType,\n );\n return selected?.side === \"RECTO_VERSO\";\n };\n\n const getSelectedDocumentName = () => {\n const selectedDoc = allowedDocumentTypes.find(\n (doc) => doc.id === selectedDocumentType,\n );\n if (!selectedDoc) return \"document\";\n return t(selectedDoc.name) || selectedDoc.name;\n };\n\n const handleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n side: \"front\" | \"back\" = \"front\",\n ) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n if (\n !file.type.startsWith(\"image/\") &&\n !file.type.startsWith(\"application/pdf\")\n ) {\n setError(t(\"document_upload.errors.invalid_file_type\"));\n return;\n }\n if (file.size > 10 * 1024 * 1024) {\n setError(t(\"document_upload.errors.file_too_large\"));\n return;\n }\n\n setError(\"\");\n const isFilePDF = file.type === \"application/pdf\";\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n if (side === \"front\") {\n setFrontImage(result);\n setFrontIsPDF(isFilePDF);\n } else {\n setBackImage(result);\n setBackIsPDF(isFilePDF);\n }\n };\n reader.readAsDataURL(file);\n };\n\n const handleMultipleFileChange = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const files = event.target.files;\n if (!files) return;\n const maxFiles = requiresTwoSides() ? 2 : 1;\n if (files.length > maxFiles) {\n setError(t(\"document_upload.errors.max_files\"));\n return;\n }\n setError(\"\");\n Array.from(files).forEach((file, index) => {\n if (\n !file.type.startsWith(\"image/\") &&\n !file.type.startsWith(\"application/pdf\")\n ) {\n setError(t(\"document_upload.errors.invalid_file_type\"));\n return;\n }\n if (file.size > 10 * 1024 * 1024) {\n setError(t(\"document_upload.errors.file_too_large\"));\n return;\n }\n const isFilePDF = file.type === \"application/pdf\";\n const reader = new FileReader();\n reader.onload = (e) => {\n const result = e.target?.result as string;\n if (index === 0) {\n setFrontImage(result);\n setFrontIsPDF(isFilePDF);\n } else if (index === 1 && requiresTwoSides()) {\n setBackImage(result);\n setBackIsPDF(isFilePDF);\n }\n };\n reader.readAsDataURL(file);\n });\n };\n\n const handleUpload = async () => {\n setError(\"\");\n if (!frontImage) {\n setError(t(\"jdi.document_upload.errors.add_photo_identity\"));\n return;\n }\n\n setIsUploading(true);\n try {\n const files = {\n front: frontImage,\n back: requiresTwoSides() ? backImage : null,\n };\n if (sessionId) {\n logDocumentLoaded(sessionId, \"recto\");\n if (requiresTwoSides() && backImage) {\n logDocumentLoaded(sessionId, \"verso\");\n }\n logDocumentsValidated(sessionId);\n }\n onUpload(files);\n } catch (err) {\n setError(t(\"document_upload.errors.upload_error\"));\n setIsUploading(false);\n }\n };\n\n const removeImage = (side: \"front\" | \"back\" = \"front\") => {\n if (side === \"front\") {\n setFrontImage(null);\n setFrontIsPDF(false);\n } else {\n setBackImage(null);\n setBackIsPDF(false);\n }\n setError(\"\");\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button\n onClick={handleUpload}\n disabled={!frontImage || isUploading}\n >\n {isUploading\n ? t(\"jdi.processing.download\")\n : requiresTwoSides()\n ? t(\"jdi.document_upload.validate_multiple\")\n : t(\"jdi.document_upload.validate_single\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack} disabled={isUploading}>\n {t(\"buttons.back\")}\n </Button>\n }\n />\n }\n >\n <div className=\"flex-1 flex items-start justify-center md:items-center p-4\">\n <div className=\"w-full max-w-lg\">\n <div className=\"text-center mb-8\">\n <h1 className=\"text-2xl md:text-3xl font-bold text-gray-900 mb-2\">\n {t(\"document_upload.upload_title\")}\n </h1>\n <p className=\"text-gray-600\">\n {t(\"document_upload.upload_description\")}\n </p>\n </div>\n\n {error && (\n <div className=\"mb-6 p-4 bg-red-50 border border-red-200 rounded-lg text-sm text-red-700\">\n {error}\n </div>\n )}\n\n <Card\n className=\"border-2 border-dashed border-teal-300 bg-teal-50/30 p-8 mb-6 text-center\"\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n const files = e.dataTransfer.files;\n if (files.length > 0) {\n const syntheticEvent = { target: { files } } as any;\n requiresTwoSides() ? handleMultipleFileChange(syntheticEvent) : handleFileChange(syntheticEvent);\n }\n }}\n >\n {!frontImage ? (\n <div className=\"space-y-6\">\n <h3 className=\"text-lg font-semibold text-gray-900\">{getSelectedDocumentName()}</h3>\n <Button\n onClick={() => requiresTwoSides() ? multipleInputRef.current?.click() : frontInputRef.current?.click()}\n className=\"bg-teal-600 text-white hover:bg-teal-700 px-6 py-2 rounded-lg font-medium mx-auto flex items-center gap-2\"\n disabled={isUploading}\n >\n <Upload size={18} />\n <span>{t(\"document_upload.browse_files\")}</span>\n </Button>\n <div className=\"text-xs text-gray-500 space-y-1\">\n <p>{t(\"document_upload.accepted_formats\")}</p>\n <p>{requiresTwoSides() ? t(\"document_upload.multiple_files_info\") : t(\"document_upload.single_file_info\")}</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"bg-white border rounded-lg p-4 relative group\">\n <p className=\"text-sm font-medium mb-1\">{frontIsPDF ? t(\"document_upload.pdf_preview\") : t(\"document_upload.image_preview\")}</p>\n {frontIsPDF ? <PDFPreview src={frontImage} /> : <img src={frontImage} alt={t(\"document_upload.front_side\")} className=\"max-h-48 mx-auto\" />}\n <button onClick={() => removeImage(\"front\")} className=\"absolute top-2 right-2 text-red-500 hover:text-red-700\">✕</button>\n </div>\n {requiresTwoSides() && backImage && (\n <div className=\"bg-white border rounded-lg p-4 relative group\">\n <p className=\"text-sm font-medium mb-1\">{t(\"document_upload.back_side\")} {backIsPDF ? \"PDF\" : \"\"}</p>\n {backIsPDF ? <PDFPreview src={backImage} /> : <img src={backImage} alt={t(\"document_upload.back_side\")} className=\"max-h-48 mx-auto\" />}\n <button onClick={() => removeImage(\"back\")} className=\"absolute top-2 right-2 text-red-500 hover:text-red-700\">✕</button>\n </div>\n )}\n {requiresTwoSides() && !backImage && (\n <Button\n onClick={() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*,.pdf\";\n input.onchange = (e) => handleFileChange(e as any, \"back\");\n input.click();\n }}\n className=\"text-teal-600 border border-teal-600 bg-transparent hover:bg-teal-50 w-full\"\n >\n {t(\"document_upload.add_back\")}\n </Button>\n )}\n </div>\n )}\n </Card>\n\n <input ref={frontInputRef} type=\"file\" accept=\"image/*,.pdf\" onChange={(e) => handleFileChange(e, \"front\")} className=\"hidden\" />\n <input ref={multipleInputRef} type=\"file\" accept=\"image/*,.pdf\" multiple={true} onChange={handleMultipleFileChange} className=\"hidden\" />\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default DocumentCollectionUpload;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -124,7 +124,6 @@ var Photo = function (_a) {
|
|
|
124
124
|
result = _a.sent();
|
|
125
125
|
setLastCaptureMeta(result);
|
|
126
126
|
stopDetection();
|
|
127
|
-
cameraService.stopCamera();
|
|
128
127
|
setDocumentDetected(false);
|
|
129
128
|
console.debug("Document captured", {
|
|
130
129
|
method: result.method,
|
|
@@ -220,7 +219,7 @@ var Photo = function (_a) {
|
|
|
220
219
|
cameraService.stopCamera();
|
|
221
220
|
setIsDetecting(false);
|
|
222
221
|
};
|
|
223
|
-
}, [facingMode, clearCountdown, stopDetection
|
|
222
|
+
}, [facingMode, clearCountdown, stopDetection]);
|
|
224
223
|
useEffect(function () {
|
|
225
224
|
if (!isDetecting || !videoRef.current) {
|
|
226
225
|
return;
|