86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import React from 'react';
 | |
| import { connect } from 'react-redux';
 | |
| import PropTypes from 'prop-types';
 | |
| import Video from 'mastodon/features/video';
 | |
| import Audio from 'mastodon/features/audio';
 | |
| import { removePictureInPicture } from 'mastodon/actions/picture_in_picture';
 | |
| import Header from './components/header';
 | |
| import Footer from './components/footer';
 | |
| 
 | |
| const mapStateToProps = state => ({
 | |
|   ...state.get('picture_in_picture'),
 | |
| });
 | |
| 
 | |
| export default @connect(mapStateToProps)
 | |
| class PictureInPicture extends React.Component {
 | |
| 
 | |
|   static propTypes = {
 | |
|     statusId: PropTypes.string,
 | |
|     accountId: PropTypes.string,
 | |
|     type: PropTypes.string,
 | |
|     src: PropTypes.string,
 | |
|     muted: PropTypes.bool,
 | |
|     volume: PropTypes.number,
 | |
|     currentTime: PropTypes.number,
 | |
|     poster: PropTypes.string,
 | |
|     backgroundColor: PropTypes.string,
 | |
|     foregroundColor: PropTypes.string,
 | |
|     accentColor: PropTypes.string,
 | |
|     dispatch: PropTypes.func.isRequired,
 | |
|   };
 | |
| 
 | |
|   handleClose = () => {
 | |
|     const { dispatch } = this.props;
 | |
|     dispatch(removePictureInPicture());
 | |
|   }
 | |
| 
 | |
|   render () {
 | |
|     const { type, src, currentTime, accountId, statusId } = this.props;
 | |
| 
 | |
|     if (!currentTime) {
 | |
|       return null;
 | |
|     }
 | |
| 
 | |
|     let player;
 | |
| 
 | |
|     if (type === 'video') {
 | |
|       player = (
 | |
|         <Video
 | |
|           src={src}
 | |
|           currentTime={this.props.currentTime}
 | |
|           volume={this.props.volume}
 | |
|           muted={this.props.muted}
 | |
|           autoPlay
 | |
|           inline
 | |
|           alwaysVisible
 | |
|         />
 | |
|       );
 | |
|     } else if (type === 'audio') {
 | |
|       player = (
 | |
|         <Audio
 | |
|           src={src}
 | |
|           currentTime={this.props.currentTime}
 | |
|           volume={this.props.volume}
 | |
|           muted={this.props.muted}
 | |
|           poster={this.props.poster}
 | |
|           backgroundColor={this.props.backgroundColor}
 | |
|           foregroundColor={this.props.foregroundColor}
 | |
|           accentColor={this.props.accentColor}
 | |
|           autoPlay
 | |
|         />
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return (
 | |
|       <div className='picture-in-picture'>
 | |
|         <Header accountId={accountId} statusId={statusId} onClose={this.handleClose} />
 | |
| 
 | |
|         {player}
 | |
| 
 | |
|         <Footer statusId={statusId} />
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
| }
 |