diff --git a/frontend/css/style.css b/frontend/css/style.css index 02b10bb..1149010 100644 --- a/frontend/css/style.css +++ b/frontend/css/style.css @@ -332,8 +332,10 @@ html, body { } .preview-erreur-camera span { - font-size: 1.2rem; - opacity: 0.7; + font-size: 1.3rem; + opacity: 0.85; + text-align: center; + max-width: 80%; } .compte-a-rebours { diff --git a/frontend/js/camera.js b/frontend/js/camera.js index 3ec8811..7639945 100644 --- a/frontend/js/camera.js +++ b/frontend/js/camera.js @@ -9,16 +9,17 @@ const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' }; // --- Preview live --- -function afficherErreurCapture(message) { +function afficherErreurCapture(titre, detail = '') { + arreterPreview(); const el = document.getElementById('preview-erreur-camera'); if (!el) { allerA('accueil'); return; } - el.querySelector('p').textContent = message; - el.querySelector('span').textContent = 'Retour dans 3 secondes...'; + el.querySelector('p').textContent = titre; + el.querySelector('span').textContent = detail || 'Retour dans 4 secondes...'; el.classList.remove('cache'); setTimeout(() => { el.classList.add('cache'); allerA('accueil'); - }, 3000); + }, 4000); } function afficherErreurPreview(visible) { @@ -88,17 +89,27 @@ async function lancerCapture() { photosSession = []; photoImpression = null; - // Vider les aperçus precedents document.getElementById('photo-resultat').src = ''; document.getElementById('photo-partage').src = ''; majCompteurAccueil(); + // Verifier l'etat de la camera avant de commencer + try { + const statut = await apiGet('/api/camera/statut'); + if (!statut.connectee || statut.mode === 'erreur') { + afficherErreurCapture('Appareil photo non disponible', 'Verifiez la connexion USB du DSLR'); + return; + } + } catch (e) { + afficherErreurCapture('Impossible de joindre le serveur', 'Verifiez que le photobooth est bien demarre'); + return; + } + const nbPhotos = getNombrePhotos(); const compteurEl = document.getElementById('capture-compteur'); for (let i = 0; i < nbPhotos; i++) { - // Lancer la preview pour que l'utilisateur se voit lancerPreview(); await pause(500); @@ -106,32 +117,48 @@ async function lancerCapture() { compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`; } - // Compte a rebours par dessus la preview await compteARebours(); - // Arreter la preview et attendre que le DSLR soit libre + // Si la camera a signale une erreur pendant le compte a rebours, on arrete + const erreurVisible = !document.getElementById('preview-erreur-camera').classList.contains('cache'); + if (erreurVisible) { + arreterPreview(); + afficherErreurCapture('Appareil photo deconnecte', 'Reconnectez le DSLR et reessayez'); + return; + } + arreterPreview(); await pause(300); - afficherFlash(); // Tenter la capture avec retry let resultat = null; + let erreurReseau = false; for (let r = 0; r < 3; r++) { - resultat = await apiPost('/api/capturer'); + try { + resultat = await apiPost('/api/capturer'); + } catch (e) { + erreurReseau = true; + await pause(500); + continue; + } + erreurReseau = false; if (!resultat.erreur) break; if (resultat.erreur === 'Limite de photos atteinte') { - allerA('accueil'); + afficherErreurCapture('Limite de photos atteinte', 'La session est terminee'); return; } await pause(500); } - if (resultat.erreur) { - arreterPreview(); - afficherErreurCapture(resultat.erreur === 'Limite de photos atteinte' - ? 'Limite de photos atteinte' - : 'Echec de la capture — verifier le DSLR'); + if (erreurReseau) { + afficherErreurCapture('Erreur reseau', 'Le serveur ne repond pas — redemarrez le photobooth'); + return; + } + + if (!resultat || resultat.erreur) { + const msg = resultat?.erreur || 'Erreur inconnue'; + afficherErreurCapture('Echec de la capture', msg.includes('Echec') ? 'Verifiez le DSLR et reessayez' : msg); return; } @@ -249,30 +276,43 @@ let photoImpression = null; // Nom du fichier d'impression (2 bandes sur 10x15) async function traiterCapture() { if (photosSession.length === 0) { - allerA('accueil'); + afficherErreurCapture('Aucune photo capturee', 'Une erreur inattendue s\'est produite'); return; } photoImpression = null; - if (modeActuel === 'multi') { - const mode = config.multi_shot?.mode || 'strip'; - let resultat; - if (mode === 'strip') { - resultat = await apiPost('/api/strip', { photos: photosSession }); - if (resultat.impression) { - photoImpression = resultat.impression; + try { + if (modeActuel === 'multi') { + const mode = config.multi_shot?.mode || 'strip'; + let resultat; + if (mode === 'strip') { + resultat = await apiPost('/api/strip', { photos: photosSession }); + if (resultat.erreur) { + afficherErreurCapture('Erreur creation de la planche', resultat.erreur); + return; + } + if (resultat.impression) photoImpression = resultat.impression; + } else { + resultat = await apiPost('/api/collage', { photos: photosSession }); + if (resultat.erreur) { + afficherErreurCapture('Erreur creation du collage', resultat.erreur); + return; + } + } + if (!resultat.nom) { + afficherErreurCapture('Erreur traitement des photos', 'Le fichier final n\'a pas ete genere'); + return; } - } else { - resultat = await apiPost('/api/collage', { photos: photosSession }); - } - if (resultat.nom) { photoFinale = resultat.nom; afficherPreviewPhoto('/data/exports/' + resultat.nom); + } else { + photoFinale = photosSession[0]; + afficherPreviewPhoto('/data/photos/' + photosSession[0]); } - } else { - photoFinale = photosSession[0]; - afficherPreviewPhoto('/data/photos/' + photosSession[0]); + } catch (e) { + afficherErreurCapture('Erreur reseau', 'Impossible de traiter les photos'); + return; } allerA('preview');