Ajoute un accès direct à la galerie en plus de la caméra

Deux boutons séparés (deux inputs file) plutôt qu'un seul avec
capture=environment qui masquait l'option galerie — retour de Kévin
après test réel. État de sélection centralisé dans state.selectedFile.
This commit is contained in:
2026-09-16 13:12:38 +02:00
parent 62a15ffe2d
commit 7afd3b6a18
3 changed files with 87 additions and 9 deletions
+24 -4
View File
@@ -40,6 +40,8 @@ const successBlock = document.getElementById("success-block");
const addAnotherBtn = document.getElementById("add-another-btn");
const form = document.getElementById("upload-form");
const photoInput = document.getElementById("photo-input");
const photoInputGallery = document.getElementById("photo-input-gallery");
const fileChosenLabel = document.getElementById("file-chosen-label");
const previewImg = document.getElementById("preview");
const nomInput = document.getElementById("nom-input");
const messageInput = document.getElementById("message-input");
@@ -413,17 +415,20 @@ async function insertPhotoRow(eventId, path, nom, message) {
let previewObjectUrl = null;
photoInput.addEventListener("change", () => {
// Deux inputs (caméra directe / galerie) partagent la même logique de
// sélection — état centralisé dans state.selectedFile plutôt que de lire
// photoInput.files[0] un peu partout, pour rester correct quel que soit
// l'input utilisé.
function handleFileSelected(file) {
// Nouveau fichier choisi -> on invalide toute compression déjà faite.
state.compressedBlob = null;
state.selectedFile = photoInput.files[0] || null;
state.selectedFile = file || null;
if (previewObjectUrl) {
URL.revokeObjectURL(previewObjectUrl);
previewObjectUrl = null;
}
const file = state.selectedFile;
if (file && file.type && file.type.startsWith("image/")) {
previewObjectUrl = URL.createObjectURL(file);
previewImg.src = previewObjectUrl;
@@ -435,6 +440,20 @@ photoInput.addEventListener("change", () => {
// Pas d'aperçu fiable pour les HEIC sur la plupart des navigateurs.
previewImg.hidden = true;
}
fileChosenLabel.textContent = file ? file.name : "Aucun fichier choisi";
}
photoInput.addEventListener("change", () => {
handleFileSelected(photoInput.files[0] || null);
// Un seul fichier actif à la fois : on vide l'autre input pour éviter
// toute ambiguïté si l'utilisateur change de méthode après coup.
photoInputGallery.value = "";
});
photoInputGallery.addEventListener("change", () => {
handleFileSelected(photoInputGallery.files[0] || null);
photoInput.value = "";
});
async function submitPhoto() {
@@ -444,7 +463,7 @@ async function submitPhoto() {
return;
}
const file = photoInput.files[0];
const file = state.selectedFile;
if (!file) return showError(appError("file-missing"));
if (!isAcceptableImageFile(file)) return showError(appError("file-not-image"));
if (file.size > MAX_INPUT_BYTES) return showError(appError("file-too-large"));
@@ -487,6 +506,7 @@ addAnotherBtn.addEventListener("click", () => {
form.reset();
state.selectedFile = null;
state.compressedBlob = null;
fileChosenLabel.textContent = "Aucun fichier choisi";
previewImg.hidden = true;
if (previewObjectUrl) {
URL.revokeObjectURL(previewObjectUrl);