import React, { Component } from 'react' import PropTypes from "prop-types"; import { findDOMNode } from 'react-dom' import screenfull from 'screenfull' import ReactPlayer from 'react-player' import Duration from './duration' import Progress from './progress' import styled from "styled-components" import { Icons } from "asc-web-components"; const StyledControls = styled.div` height: 40px; display: block; position: absolute; z-index: 4001; ${props => !props.isVideo && "background-color: rgba(11,11,11,0.7);"} top: ${props => props.top}px; left: ${props => props.left}px; `; const StyledVideoControlBtn = styled.div` display: inline-block; height: 30px; line-height: 30px; margin: 5px; width: 40px; border-radius: 2px; cursor: pointer; text-align: center; &:hover{ background-color: rgba(200,200,200,0.2); } `; const VideoControlBtn = props => { return ( {props.children} ); } VideoControlBtn.propTypes = { children: PropTypes.any } const Controls = props => { return ( {props.children} ); } Controls.propTypes = { children: PropTypes.any } const PlayBtn = props => { return ( {props.playing ? : } ); } PlayBtn.propTypes = { playing: PropTypes.bool, onClick: PropTypes.func } const FullScreenBtn = props => { return ( ); } FullScreenBtn.propTypes = { onClick: PropTypes.func } const StyledValumeContainer = styled.div` display: inline-block; position: relative; .muteConteiner{ display: none; position: absolute; width: 40px; height: 80px; border-radius: 5px; top: -76px; left: 5px; background: black; } &:hover{ .muteConteiner{ display: inline-block; } } .mute{ display: inline-block; transform: rotate(-90deg); float: right; margin: 22px -12px; } `; const StyledDuration = styled.div` display: inline-block; height: 30px; line-height: 30px; margin: 5px; width: 60px; text-align: center; border-radius: 2px; cursor: pointer; &:hover{ background-color: rgba(200,200,200,0.2); } `; const StyledVideoViewer = styled.div` color: #d1d1d1; .playerWrapper{ display: ${props => props.isVideo ? "block" : "none"}; width: ${props => props.width}px; height: ${props => props.height}px; left: ${props => props.left}px; top: ${props => props.top}px; z-index: 4001; position: absolute; padding-bottom: 40px; background-color: rgba(11,11,11,0.7); video{ z-index: 4000; } } `; class ValumeBtn extends Component { constructor(props) { super(props); } render() { return (
{this.props.muted ? : }
); } } ValumeBtn.propTypes = { width: PropTypes.number, volume: PropTypes.number, muted: PropTypes.bool, onMouseDown: PropTypes.func, onChange: PropTypes.func, handleSeekMouseUp: PropTypes.func, onChangeMute: PropTypes.func } class VideoViewer extends Component { state = { url: this.props.url, pip: false, playing: this.props.playing, controls: false, light: false, volume: 0.3, muted: false, played: 0, loaded: 0, duration: 0, playbackRate: 1.0, loop: false } load = url => { this.setState({ url, played: 0, loaded: 0, pip: false }) } componentDidUpdate(prevProps, prevState) { let newUrl = prevState.url; let newPlaying = prevState.playing; if (this.props.url !== prevProps.url || this.props.playing !== prevProps.playing) { if (this.props.url !== prevProps.url) { newUrl = this.props.url } if (this.props.playing !== prevProps.playing) { newPlaying = this.props.playing } this.setState( { url: newUrl, playing: newPlaying } ); } } handlePlayPause = () => { this.setState({ playing: !this.state.playing }) } handleStop = () => { this.setState({ url: null, playing: false }) } handleToggleControls = () => { const url = this.state.url this.setState({ controls: !this.state.controls, url: null }, () => this.load(url)) } handleToggleLight = () => { this.setState({ light: !this.state.light }) } handleToggleLoop = () => { this.setState({ loop: !this.state.loop }) } handleVolumeChange = e => { this.setState({ volume: parseFloat(e.target.value), muted: false }) } handleToggleMuted = () => { this.setState({ muted: !this.state.muted }) } handleSetPlaybackRate = e => { this.setState({ playbackRate: parseFloat(e.target.value) }) } handleTogglePIP = () => { this.setState({ pip: !this.state.pip }) } handlePlay = () => { console.log('onPlay') this.setState({ playing: true }) } handleEnablePIP = () => { console.log('onEnablePIP') this.setState({ pip: true }) } handleDisablePIP = () => { console.log('onDisablePIP') this.setState({ pip: false }) } handlePause = () => { console.log('onPause') this.setState({ playing: false }) } handleSeekMouseDown = e => { this.setState({ seeking: true }) } handleSeekChange = e => { this.setState({ played: parseFloat(e.target.value) }) } handleSeekMouseUp = e => { this.setState({ seeking: false }) this.player.seekTo(parseFloat(e.target.value)) } handleProgress = state => { console.log('onProgress', state) // We only want to update time slider if we are not currently seeking if (!this.state.seeking) { this.setState(state) } } handleEnded = () => { console.log('onEnded') this.setState({ playing: this.state.loop }) } handleDuration = (duration) => { console.log('onDuration', duration) this.setState({ duration }) } handleClickFullscreen = () => { screenfull.request(findDOMNode(this.player)) } renderLoadButton = (url, label) => { return ( ) } ref = player => { this.player = player } resizePlayer = (videoSize, screenSize) => { var ratio = videoSize.h / videoSize.w; if (videoSize.h > screenSize.h) { videoSize.h = screenSize.h; videoSize.w = videoSize.h / ratio; } if (videoSize.w > screenSize.w) { videoSize.w = screenSize.w; videoSize.h = videoSize.w * ratio; } return { width: videoSize.w, height: videoSize.h }; }; render() { const { url, playing, controls, light, volume, muted, loop, played, loaded, duration, playbackRate, pip } = this.state var screenSize = { w: window.innerWidth, h: window.innerHeight }; screenSize.h -= 48 + 48 + 40; let width = screenSize.w; let height = screenSize.h; var centerAreaOx = screenSize.w / 2 + document.documentElement.scrollLeft; var centerAreaOy = screenSize.h / 2 + document.documentElement.scrollTop; if (document.getElementsByTagName('video')[0]) { width = this.props.isVideo ? document.getElementsByTagName('video')[0].videoWidth || 480 : screenSize.w - 300; height = this.props.isVideo ? document.getElementsByTagName('video')[0].videoHeight || 270 : 0; console.log(width, height) let resize = this.resizePlayer( { w: width, h: height }, screenSize ) width = resize.width; height = resize.height; } let left = centerAreaOx - width / 2; let top = this.props.isVideo ? centerAreaOy - height / 2 + 48 : centerAreaOy + 48; return (
console.log('onReady')} onStart={() => console.log('onStart')} onPlay={this.handlePlay} onEnablePIP={this.handleEnablePIP} onDisablePIP={this.handleDisablePIP} onPause={this.handlePause} onBuffer={() => console.log('onBuffer')} onSeek={e => console.log('onSeek', e)} onEnded={this.handleEnded} onError={e => console.log('onError', e)} onProgress={this.handleProgress} onDuration={this.handleDuration} />
- {this.props.isVideo && }
) } } VideoViewer.propTypes = { isVideo: PropTypes.bool, url: PropTypes.string, playing: PropTypes.bool } export default VideoViewer;