useAudio/useVideo play lock resets across renders
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 75/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- react, typescript
Direzione di ricerca
Inizia da createHTMLMediaHook e dalla gestione di lockPlay descritta nell’issue, quindi segui il percorso di rerendering degli eventi media. Il lavoro è completo quando il blocco sopravvive ai rerendering fino alla risoluzione di play(), con un test di regressione mirato che copra il caso di pausa mentre play() è in sospeso.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
What is the current behavior?
useAudio and useVideo use a lockPlay local variable inside createHTMLMediaHook to avoid calling pause() while a pending HTMLMediaElement.play() promise is still resolving.
Because lockPlay is a plain local variable, it is recreated on every render. Media events such as play, playing, waiting, pause, durationchange, or timeupdate can call setState, causing a rerender before the original play() promise settles. After that rerender, the lock is reset to false, so a new controls.pause() call can run while the earlier play() promise is still pending.
This weakens the Chromium workaround described in the comment above the lock:
Some browsers return
Promiseon.play()and may throw errors if one tries to execute another.play()or.pause()while that promise is resolving.
Expected behavior
The play lock should persist across renders until the pending play() promise resolves or rejects.
Using a ref for the lock would preserve the intended behavior without changing the public API.
Why this matters
In video/audio-heavy UIs, components often call controls.play() and controls.pause() in response to store changes, user interactions, or source changes. If a media event causes a rerender while play() is still pending, the current lock can be lost and the hook can issue a conflicting pause().
Possible fix
Change the local variable:
let lockPlay = false;
to a ref-backed value, for example:
const lockPlay = useRef(false);
and read/write lockPlay.current inside the controls.
I can open a PR with a focused regression test if this direction sounds good.
- Lingua principale
- TypeScript
- Stelle
- 44k
- Fork
- 3.3k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di streamich/react-use
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
-
Add Generic Fn for useDebounceForse già presa @itsmejay80 l’ha presa 180 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
-
useVideo.story.tsx - sampleVideo can not be loadedForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 62/100
-
useSlider: event callbacks are not updatedForse già presa @erykpiast l’ha presa 1827 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
Tutte le issue di streamich/react-use
Issue simili
-
First unknown-user login after boot is one scrypt run slower than a real user's wrong passwordApertaarea: backend bug priority: low
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
snapotter-hq/SnapOtter#2254 ·
I maintainer di solito rispondono entro 1 giorno
-
bug ticket
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
cratestack/cratestack#1154 ·
I maintainer di solito rispondono entro 1 giorno
-
server 消息处理器 cmd 分支补显式错误回报——竞态非法命令现走未处理拒绝Forse già presa @openaddr l’ha presa oggi. Apertaready-for-agent refactor wayfinder:task
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
openaddr/dafung-web#428 ·
I maintainer di solito rispondono entro 1 giorno
-
Flaky: mongodb-memory-server 'Port already in use' when another process starts a mongod concurrentlyApertaarea:testing bug effort:S priority:P2
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
lens:agent lens:process process
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
thebristolsound/birdbrain#1772 ·
I maintainer di solito rispondono entro 1 giorno