import React from 'react'; import PropTypes from 'prop-types'; import videoConnect from './../video/video'; import copy from './copy'; import { setVolume, showTrack, showSpeed, toggleTracks, toggleSpeeds, toggleMute, togglePause, setCurrentTime, toggleFullscreen, getPercentagePlayed, getPercentageBuffered } from './../video/api'; import styles from './DefaultPlayer.css'; import Time from './Time/Time'; import Seek from './Seek/Seek'; import Volume from './Volume/Volume'; import Captions from './Captions/Captions'; import Speed from './Speed/Speed'; import PlayPause from './PlayPause/PlayPause'; import Fullscreen from './Fullscreen/Fullscreen'; import Overlay from './Overlay/Overlay'; const DefaultPlayer = ({ copy, video, style, controls, children, className, onSeekChange, onVolumeChange, onVolumeClick, onCaptionsClick, onSpeedClick, onPlayPauseClick, onFullscreenClick, onCaptionsItemClick, onSpeedsItemClick, ...restProps }) => { let playbackrates = restProps['data-playbackrates']; if (playbackrates) { playbackrates = JSON.parse(playbackrates); } let onScreenClickCallback = restProps['onScreenClickCallback']; return (
{ controls && controls.length && !video.error ?
{ controls.map((control, i) => { switch (control) { case 'Seek': return ; case 'PlayPause': return ; case 'Fullscreen': return ; case 'Time': return
: null }
); }; const controls = ['PlayPause', 'Seek', 'Time', 'Volume', 'Captions', 'Speed', 'Fullscreen']; DefaultPlayer.defaultProps = { copy, controls, video: {} }; DefaultPlayer.propTypes = { copy: PropTypes.object.isRequired, controls: PropTypes.arrayOf(PropTypes.oneOf(controls)), video: PropTypes.object.isRequired }; const connectedPlayer = videoConnect( DefaultPlayer, ({ networkState, readyState, error, ...restState }) => ({ video: { readyState, networkState, error: error || networkState === 3, // TODO: This is not pretty. Doing device detection to remove // spinner on iOS devices for a quick and dirty win. We should see if // we can use the same readyState check safely across all browsers. loading: readyState < (/iPad|iPhone|iPod/.test(navigator.userAgent) ? 1 : 4), percentagePlayed: getPercentagePlayed(restState), percentageBuffered: getPercentageBuffered(restState), ...restState } }), (videoEl, state) => ({ onFullscreenClick: () => toggleFullscreen(videoEl.parentElement), onVolumeClick: () => toggleMute(videoEl, state), onCaptionsClick: () => toggleTracks(state), onSpeedClick: () => toggleSpeeds(videoEl, state), onPlayPauseClick: () => togglePause(videoEl, state), onCaptionsItemClick: (track) => showTrack(state, track), onSpeedsItemClick: (speed) => showSpeed(videoEl, state, speed), onVolumeChange: (e) => setVolume(videoEl, state, e.target.value), onSeekChange: (e) => setCurrentTime(videoEl, state, e.target.value * state.duration / 100) }) ); export { connectedPlayer as default, DefaultPlayer, Time, Seek, Volume, Captions, PlayPause, Fullscreen, Overlay };