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:
+24
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user