fix(expertise): vidéo bloquée quand fwdTarget = duration (3+ items)
All checks were successful
Deploy / Deploy to Production (push) Successful in 22s

Bug : quand la vidéo forward atteint la fin (duration), timeupdate
ne fire pas toujours avec currentTime >= duration exactement.
Le handler ne se déclenche jamais, fwdTarget n'est pas nettoyé,
currentFwdTime garde l'ancienne valeur → la reprise en reverse
part du mauvais point.

Corrections :
- Écoute l'événement ended sur les deux vidéos pour garantir
  le snap de currentFwdTime aux bornes (0 ou duration)
- Tolérance de 50ms dans les comparaisons timeupdate (>= target - 0.05)
  pour capter la cible avant la fin naturelle de la vidéo
- Suppression du reassign de currentTime dans les handlers timeupdate
  (inutile et pouvait causer un seek superflu)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
isUnknown 2026-03-20 14:55:39 +01:00
parent 7838342f96
commit 5cfecd7786

View file

@ -189,27 +189,39 @@
const onFwdUpdate = () => {
if (!videoFwd || videoFwd.paused || fwdTarget === null) return
if (videoFwd.currentTime >= fwdTarget) {
currentFwdTime = fwdTarget // snap exactement à la cible
videoFwd.currentTime = fwdTarget
if (videoFwd.currentTime >= fwdTarget - 0.05) {
currentFwdTime = fwdTarget
videoFwd.pause()
fwdTarget = null
}
}
videoFwd?.addEventListener('timeupdate', onFwdUpdate)
// Quand la vidéo forward atteint la fin naturellement, timeupdate
// peut ne pas fire avec currentTime >= duration. ended le garantit.
const onFwdEnded = () => {
currentFwdTime = videoDuration
fwdTarget = null
}
videoFwd?.addEventListener('ended', onFwdEnded)
const onRevUpdate = () => {
if (!videoRev || videoRev.paused || revTarget === null) return
if (videoRev.currentTime >= revTarget) {
if (videoRev.currentTime >= revTarget - 0.05) {
const fwdPos = videoDuration - revTarget
currentFwdTime = Math.max(fwdPos, 0) // snap exactement
videoRev.currentTime = revTarget
currentFwdTime = Math.max(fwdPos, 0)
videoRev.pause()
revTarget = null
}
}
videoRev?.addEventListener('timeupdate', onRevUpdate)
const onRevEnded = () => {
currentFwdTime = 0
revTarget = null
}
videoRev?.addEventListener('ended', onRevEnded)
const onResize = () => { if (isActive) computeOffset() }
window.addEventListener('resize', onResize)
window.addEventListener('orientationchange', onResize)
@ -218,7 +230,9 @@
return () => {
sectionEl?.removeEventListener('wheel', nav.onWheel)
videoFwd?.removeEventListener('timeupdate', onFwdUpdate)
videoFwd?.removeEventListener('ended', onFwdEnded)
videoRev?.removeEventListener('timeupdate', onRevUpdate)
videoRev?.removeEventListener('ended', onRevEnded)
window.removeEventListener('resize', onResize)
window.removeEventListener('orientationchange', onResize)
window.removeEventListener('keydown', nav.onKeyDown)