From 6dd7d2c4e5a129758ec171c2b4ec8c65f3ca9a5b Mon Sep 17 00:00:00 2001 From: ordinarthur <@arthurbarre.js@gmail.com> Date: Sat, 11 Apr 2026 14:37:23 +0200 Subject: [PATCH] fix: validate recording length using audio duration --- frontend/src/pages/Recipes/RecipeForm.tsx | 33 ++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/Recipes/RecipeForm.tsx b/frontend/src/pages/Recipes/RecipeForm.tsx index 8c9a1d5..ce755ab 100644 --- a/frontend/src/pages/Recipes/RecipeForm.tsx +++ b/frontend/src/pages/Recipes/RecipeForm.tsx @@ -45,6 +45,31 @@ const tips = [ "Tu peux ajouter une envie : \"quelque chose de rapide\" ou \"plutôt épicé\".", ] +const MIN_RECORDING_SECONDS = 2 + +const getAudioDuration = (file: File): Promise => + new Promise((resolve) => { + const url = URL.createObjectURL(file) + const audio = document.createElement("audio") + + const cleanup = () => { + URL.revokeObjectURL(url) + audio.src = "" + } + + audio.preload = "metadata" + audio.onloadedmetadata = () => { + const duration = Number.isFinite(audio.duration) ? audio.duration : null + cleanup() + resolve(duration) + } + audio.onerror = () => { + cleanup() + resolve(null) + } + audio.src = url + }) + export default function RecipeForm() { const navigate = useNavigate() @@ -143,8 +168,8 @@ export default function RecipeForm() { const handleStopRecording = async () => { if (!isRecording) return - if (recordingTime < 2) { - setError("Enregistre au moins 2 secondes pour que le chef puisse t'écouter.") + if (recordingTime < MIN_RECORDING_SECONDS) { + setError(`Enregistre au moins ${MIN_RECORDING_SECONDS} secondes pour que le chef puisse t'écouter.`) return } await stopRecording() @@ -160,7 +185,9 @@ export default function RecipeForm() { const handleSubmit = async () => { if (!audioFile) return - if (audioFile.size < 5000) { + + const audioDuration = await getAudioDuration(audioFile) + if (audioDuration !== null && audioDuration < MIN_RECORDING_SECONDS) { setError("L'enregistrement est trop court. Réessaie en parlant un peu plus longtemps.") return }