import React, { useEffect } from 'react'; import { useEventListener } from 'expo'; import { AudioComponent, VideoComponent as ExpoAVVideoComponent } from './AudioVideo'; let videoPackage; try { videoPackage = require('expo-video'); } catch (e) { // do nothing } if (!videoPackage) { console.log( 'The video library is currently not installed. To allow in-app video playback, install the "expo-video" package.', ); } const VideoComponent = videoPackage ? videoPackage.VideoView : ExpoAVVideoComponent; const useVideoPlayer = videoPackage ? videoPackage.useVideoPlayer : null; let Video = null; // expo-video if (videoPackage) { Video = ({ onLoadStart, onLoad, onEnd, onProgress, onBuffer, resizeMode, style, uri, videoRef, }) => { const player = useVideoPlayer(uri, (player) => { player.timeUpdateEventInterval = 0.5; videoRef.current = player; }); useEventListener(player, 'statusChange', ({ status, oldStatus }) => { if ((!oldStatus || oldStatus === 'idle') && status === 'loading') { onLoadStart(); } else if ((oldStatus === 'loading' || oldStatus === 'idle') && status === 'readyToPlay') { onLoad({ duration: player.duration }); onBuffer({ buffering: false }); } else if (oldStatus === 'readyToPlay' && status === 'loading') { onBuffer({ buffering: true }); } }); useEventListener(player, 'playToEnd', () => { player.replay(); onEnd(); }); useEventListener(player, 'timeUpdate', ({ currentTime }) => onProgress({ currentTime, seekableDuration: player.duration }), ); // This is done so that the audio of the video is not muted when the phone is in silent mode for iOS. useEffect(() => { const initializeSound = async () => { if (AudioComponent) { await AudioComponent.setAudioModeAsync({ playsInSilentModeIOS: true, }); } }; initializeSound(); }, []); return ( ); }; } // expo-av else if (ExpoAVVideoComponent) { Video = ({ onPlaybackStatusUpdate, paused, resizeMode, style, uri, videoRef }) => { // This is done so that the audio of the video is not muted when the phone is in silent mode for iOS. useEffect(() => { const initializeSound = async () => { await AudioComponent.setAudioModeAsync({ playsInSilentModeIOS: true, }); }; initializeSound(); }, []); return ( ); }; } export { Video };