From de8434c508c56ed422f3fd998172c435b654c9c5 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Sat, 19 Jul 2025 13:38:42 +0000 Subject: [PATCH] Fix camera issues and improve error handling when taking pictures Updates camera access logic with fallbacks, fixes browser compatibility, and enhances error management. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 4b008663-bd72-492b-b0b6-fa252367e730 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/4b008663-bd72-492b-b0b6-fa252367e730/6nnsA2m --- client/src/hooks/useSimpleCamera.tsx | 68 +++++++++++++++++----------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/client/src/hooks/useSimpleCamera.tsx b/client/src/hooks/useSimpleCamera.tsx index 5f7df35..fb38a40 100644 --- a/client/src/hooks/useSimpleCamera.tsx +++ b/client/src/hooks/useSimpleCamera.tsx @@ -17,6 +17,7 @@ export function useSimpleCamera() { // Nettoyer le stream précédent s'il existe if (stream) { stream.getTracks().forEach(track => track.stop()); + setStream(null); } // Vérifier la disponibilité des médias @@ -24,37 +25,47 @@ export function useSimpleCamera() { throw new Error('Votre navigateur ne supporte pas l\'accès à la caméra. Utilisez un navigateur moderne comme Chrome, Firefox ou Safari.'); } + // État initial + setCurrentPhotoType(photoType); + setIsOpen(true); + let mediaStream: MediaStream; try { - // Essayer d'abord avec des contraintes avancées + // Essayer d'abord avec des contraintes simples + console.log('Trying basic video constraints...'); mediaStream = await navigator.mediaDevices.getUserMedia({ video: { - width: { ideal: 1280 }, - height: { ideal: 720 }, - facingMode: 'environment' + width: { ideal: 1280, max: 1920 }, + height: { ideal: 720, max: 1080 } } }); - } catch (constraintError) { - console.warn('Failed with advanced constraints, trying basic video:', constraintError); + console.log('Basic video constraints successful'); + } catch (basicError) { + console.warn('Basic constraints failed, trying minimal video:', basicError); try { - // Fallback avec des contraintes basiques + // Fallback ultra-simple mediaStream = await navigator.mediaDevices.getUserMedia({ video: true }); - } catch (basicError) { - console.error('Basic camera access failed:', basicError); + console.log('Minimal video constraints successful'); + } catch (minimalError) { + console.error('All camera access failed:', minimalError); + + // Fermer la modal en cas d'erreur + setIsOpen(false); + setCurrentPhotoType(null); // Gestion des erreurs spécifiques - if (basicError instanceof Error) { - if (basicError.name === 'NotAllowedError') { + if (minimalError instanceof Error) { + if (minimalError.name === 'NotAllowedError') { throw new Error('Permission d\'accès à la caméra refusée. Veuillez autoriser l\'accès dans votre navigateur et actualiser la page.'); - } else if (basicError.name === 'NotFoundError') { + } else if (minimalError.name === 'NotFoundError') { throw new Error('Aucune caméra trouvée sur cet appareil. Veuillez connecter une caméra ou utiliser l\'option d\'importation de fichier.'); - } else if (basicError.name === 'NotReadableError') { + } else if (minimalError.name === 'NotReadableError') { throw new Error('Caméra déjà utilisée par une autre application. Fermez les autres applications utilisant la caméra.'); - } else if (basicError.name === 'OverconstrainedError') { + } else if (minimalError.name === 'OverconstrainedError') { throw new Error('Contraintes de caméra non supportées par votre appareil.'); } } @@ -63,36 +74,41 @@ export function useSimpleCamera() { } } - console.log('Media stream obtained:', mediaStream); + console.log('Media stream obtained successfully:', mediaStream.getVideoTracks().length, 'video tracks'); setStream(mediaStream); - setCurrentPhotoType(photoType); - setIsOpen(true); - // Attendre que la modal soit ouverte et l'élément vidéo soit prêt + // Attendre que la modal soit rendue avant d'assigner le stream setTimeout(() => { - if (videoRef.current && mediaStream) { + if (videoRef.current && mediaStream && mediaStream.active) { const video = videoRef.current; console.log('Assigning stream to video element'); video.srcObject = mediaStream; - video.autoplay = true; - video.playsInline = true; - video.muted = true; - // Forcer le play + // Forcer le play avec gestion d'erreur video.play().then(() => { console.log('Video playing successfully'); - }).catch(error => { - console.error('Video play failed:', error); + }).catch(playError => { + console.error('Video play failed:', playError); + // Réessayer après un délai + setTimeout(() => { + video.play().catch(e => console.error('Retry video play failed:', e)); + }, 200); }); + } else { + console.error('Video element not ready or stream inactive'); } - }, 100); + }, 200); } catch (error) { console.error('Camera start failed:', error); // Nettoyer l'état en cas d'erreur setIsOpen(false); setCurrentPhotoType(null); + if (stream) { + stream.getTracks().forEach(track => track.stop()); + setStream(null); + } throw error; } }, [stream]);