Gestion erreurs capture : messages clairs a chaque etape
- Verification etat camera AVANT le lancement (pas de DSLR = erreur immediate) - Detection erreur camera PENDANT le compte a rebours (pas de capture aveugle) - Capture : erreur reseau catchee, retry x3, message explicite si echec - Limite de photos : message + detail au lieu de retour accueil silencieux - Strip/collage : verification resultat, message si generation echoue - traiterCapture : try/catch global, plus de retour accueil silencieux - Overlay erreur : titre + detail lisible, 4s avant retour accueil Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -332,8 +332,10 @@ html, body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.preview-erreur-camera span {
|
.preview-erreur-camera span {
|
||||||
font-size: 1.2rem;
|
font-size: 1.3rem;
|
||||||
opacity: 0.7;
|
opacity: 0.85;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 80%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compte-a-rebours {
|
.compte-a-rebours {
|
||||||
|
|||||||
@@ -9,16 +9,17 @@ const EMOJI_CAR = { 3: '🤪', 2: '😱', 1: '🔥' };
|
|||||||
|
|
||||||
// --- Preview live ---
|
// --- Preview live ---
|
||||||
|
|
||||||
function afficherErreurCapture(message) {
|
function afficherErreurCapture(titre, detail = '') {
|
||||||
|
arreterPreview();
|
||||||
const el = document.getElementById('preview-erreur-camera');
|
const el = document.getElementById('preview-erreur-camera');
|
||||||
if (!el) { allerA('accueil'); return; }
|
if (!el) { allerA('accueil'); return; }
|
||||||
el.querySelector('p').textContent = message;
|
el.querySelector('p').textContent = titre;
|
||||||
el.querySelector('span').textContent = 'Retour dans 3 secondes...';
|
el.querySelector('span').textContent = detail || 'Retour dans 4 secondes...';
|
||||||
el.classList.remove('cache');
|
el.classList.remove('cache');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
el.classList.add('cache');
|
el.classList.add('cache');
|
||||||
allerA('accueil');
|
allerA('accueil');
|
||||||
}, 3000);
|
}, 4000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function afficherErreurPreview(visible) {
|
function afficherErreurPreview(visible) {
|
||||||
@@ -88,17 +89,27 @@ async function lancerCapture() {
|
|||||||
photosSession = [];
|
photosSession = [];
|
||||||
photoImpression = null;
|
photoImpression = null;
|
||||||
|
|
||||||
// Vider les aperçus precedents
|
|
||||||
document.getElementById('photo-resultat').src = '';
|
document.getElementById('photo-resultat').src = '';
|
||||||
document.getElementById('photo-partage').src = '';
|
document.getElementById('photo-partage').src = '';
|
||||||
|
|
||||||
majCompteurAccueil();
|
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 nbPhotos = getNombrePhotos();
|
||||||
const compteurEl = document.getElementById('capture-compteur');
|
const compteurEl = document.getElementById('capture-compteur');
|
||||||
|
|
||||||
for (let i = 0; i < nbPhotos; i++) {
|
for (let i = 0; i < nbPhotos; i++) {
|
||||||
// Lancer la preview pour que l'utilisateur se voit
|
|
||||||
lancerPreview();
|
lancerPreview();
|
||||||
await pause(500);
|
await pause(500);
|
||||||
|
|
||||||
@@ -106,32 +117,48 @@ async function lancerCapture() {
|
|||||||
compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`;
|
compteurEl.textContent = `Photo ${i + 1} / ${nbPhotos}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compte a rebours par dessus la preview
|
|
||||||
await compteARebours();
|
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();
|
arreterPreview();
|
||||||
await pause(300);
|
await pause(300);
|
||||||
|
|
||||||
afficherFlash();
|
afficherFlash();
|
||||||
|
|
||||||
// Tenter la capture avec retry
|
// Tenter la capture avec retry
|
||||||
let resultat = null;
|
let resultat = null;
|
||||||
|
let erreurReseau = false;
|
||||||
for (let r = 0; r < 3; r++) {
|
for (let r = 0; r < 3; r++) {
|
||||||
|
try {
|
||||||
resultat = await apiPost('/api/capturer');
|
resultat = await apiPost('/api/capturer');
|
||||||
|
} catch (e) {
|
||||||
|
erreurReseau = true;
|
||||||
|
await pause(500);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
erreurReseau = false;
|
||||||
if (!resultat.erreur) break;
|
if (!resultat.erreur) break;
|
||||||
if (resultat.erreur === 'Limite de photos atteinte') {
|
if (resultat.erreur === 'Limite de photos atteinte') {
|
||||||
allerA('accueil');
|
afficherErreurCapture('Limite de photos atteinte', 'La session est terminee');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await pause(500);
|
await pause(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resultat.erreur) {
|
if (erreurReseau) {
|
||||||
arreterPreview();
|
afficherErreurCapture('Erreur reseau', 'Le serveur ne repond pas — redemarrez le photobooth');
|
||||||
afficherErreurCapture(resultat.erreur === 'Limite de photos atteinte'
|
return;
|
||||||
? 'Limite de photos atteinte'
|
}
|
||||||
: 'Echec de la capture — verifier le DSLR');
|
|
||||||
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,31 +276,44 @@ let photoImpression = null; // Nom du fichier d'impression (2 bandes sur 10x15)
|
|||||||
|
|
||||||
async function traiterCapture() {
|
async function traiterCapture() {
|
||||||
if (photosSession.length === 0) {
|
if (photosSession.length === 0) {
|
||||||
allerA('accueil');
|
afficherErreurCapture('Aucune photo capturee', 'Une erreur inattendue s\'est produite');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
photoImpression = null;
|
photoImpression = null;
|
||||||
|
|
||||||
|
try {
|
||||||
if (modeActuel === 'multi') {
|
if (modeActuel === 'multi') {
|
||||||
const mode = config.multi_shot?.mode || 'strip';
|
const mode = config.multi_shot?.mode || 'strip';
|
||||||
let resultat;
|
let resultat;
|
||||||
if (mode === 'strip') {
|
if (mode === 'strip') {
|
||||||
resultat = await apiPost('/api/strip', { photos: photosSession });
|
resultat = await apiPost('/api/strip', { photos: photosSession });
|
||||||
if (resultat.impression) {
|
if (resultat.erreur) {
|
||||||
photoImpression = resultat.impression;
|
afficherErreurCapture('Erreur creation de la planche', resultat.erreur);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
if (resultat.impression) photoImpression = resultat.impression;
|
||||||
} else {
|
} else {
|
||||||
resultat = await apiPost('/api/collage', { photos: photosSession });
|
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;
|
||||||
}
|
}
|
||||||
if (resultat.nom) {
|
|
||||||
photoFinale = resultat.nom;
|
photoFinale = resultat.nom;
|
||||||
afficherPreviewPhoto('/data/exports/' + resultat.nom);
|
afficherPreviewPhoto('/data/exports/' + resultat.nom);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
photoFinale = photosSession[0];
|
photoFinale = photosSession[0];
|
||||||
afficherPreviewPhoto('/data/photos/' + photosSession[0]);
|
afficherPreviewPhoto('/data/photos/' + photosSession[0]);
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
afficherErreurCapture('Erreur reseau', 'Impossible de traiter les photos');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
allerA('preview');
|
allerA('preview');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user