fix: validate recording length using audio duration
All checks were successful
Build & Deploy to K3s / build-and-deploy (push) Successful in 35s

This commit is contained in:
ordinarthur 2026-04-11 14:37:23 +02:00
parent dfde1c4995
commit 6dd7d2c4e5

View File

@ -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<number | null> =>
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
}