123456789101112131415161718192021222324252627282930313233343536 |
- import {useEffect, useRef} from 'react';
- interface AutoplayVideoProps extends React.VideoHTMLAttributes<HTMLVideoElement> {
- 'aria-label': string;
- }
- /**
- * Wrapper for autoplaying video.
- *
- * Because of react limitations and browser controls we need to
- * use refs.
- *
- * Note, video needs `muted` for `autoplay` to work on Chrome
- * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video
- */
- function AutoplayVideo(props: AutoplayVideoProps) {
- const videoRef = useRef<HTMLVideoElement>(null);
- useEffect(() => {
- if (videoRef.current) {
- // Set muted as more browsers allow autoplay with muted video.
- // We can't use the muted prop because of a react bug.
- // https://github.com/facebook/react/issues/10389
- // So we need to set the muted property then trigger play.
- videoRef.current.muted = true;
- // non-chromium Edge and jsdom don't return a promise.
- videoRef.current.play()?.catch(() => {
- // Do nothing. Interrupting this playback is fine.
- });
- }
- }, []);
- return <video ref={videoRef} playsInline disablePictureInPicture loop {...props} />;
- }
- export {AutoplayVideo};
|