mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
* Updating client dependancies. Switching to using yarn. * Updating React * Moving pure components to using function syntax (performance gains with newer react version) * Updating client dependancies. * Ignore .yarninstall * Enabling pre-lockfile because it's the entire point of using yarn. * Removing old webpack config * Moving to new prop-types * Fixing ESLint Errors * Updating jest snapshots. * Cleaning up package.json
117 lines
3.1 KiB
JavaScript
117 lines
3.1 KiB
JavaScript
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
import $ from 'jquery';
|
|
import ReactDOM from 'react-dom';
|
|
import Constants from 'utils/constants.jsx';
|
|
import FileInfoPreview from './file_info_preview.jsx';
|
|
import * as Utils from 'utils/utils.jsx';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import React from 'react';
|
|
|
|
export default class AudioVideoPreview extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
|
|
this.handleFileInfoChanged = this.handleFileInfoChanged.bind(this);
|
|
this.handleLoadError = this.handleLoadError.bind(this);
|
|
|
|
this.stop = this.stop.bind(this);
|
|
|
|
this.state = {
|
|
canPlay: true
|
|
};
|
|
}
|
|
|
|
componentWillMount() {
|
|
this.handleFileInfoChanged(this.props.fileInfo);
|
|
}
|
|
|
|
componentDidMount() {
|
|
if (this.refs.source) {
|
|
$(ReactDOM.findDOMNode(this.refs.source)).one('error', this.handleLoadError);
|
|
}
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
if (this.props.fileUrl !== nextProps.fileUrl) {
|
|
this.handleFileInfoChanged(nextProps.fileInfo);
|
|
}
|
|
}
|
|
|
|
handleFileInfoChanged(fileInfo) {
|
|
let video = ReactDOM.findDOMNode(this.refs.video);
|
|
if (!video) {
|
|
video = document.createElement('video');
|
|
}
|
|
|
|
const canPlayType = video.canPlayType(fileInfo.mime_type);
|
|
|
|
this.setState({
|
|
canPlay: canPlayType === 'probably' || canPlayType === 'maybe'
|
|
});
|
|
}
|
|
|
|
componentDidUpdate() {
|
|
if (this.refs.source) {
|
|
$(ReactDOM.findDOMNode(this.refs.source)).one('error', this.handleLoadError);
|
|
}
|
|
}
|
|
|
|
handleLoadError() {
|
|
this.setState({
|
|
canPlay: false
|
|
});
|
|
}
|
|
|
|
stop() {
|
|
if (this.refs.video) {
|
|
const video = ReactDOM.findDOMNode(this.refs.video);
|
|
video.pause();
|
|
video.currentTime = 0;
|
|
}
|
|
}
|
|
|
|
render() {
|
|
if (!this.state.canPlay) {
|
|
return (
|
|
<FileInfoPreview
|
|
fileInfo={this.props.fileInfo}
|
|
fileUrl={this.props.fileUrl}
|
|
/>
|
|
);
|
|
}
|
|
|
|
let width = Constants.WEB_VIDEO_WIDTH;
|
|
let height = Constants.WEB_VIDEO_HEIGHT;
|
|
if (Utils.isMobile()) {
|
|
width = Constants.MOBILE_VIDEO_WIDTH;
|
|
height = Constants.MOBILE_VIDEO_HEIGHT;
|
|
}
|
|
|
|
// add a key to the video to prevent React from using an old video source while a new one is loading
|
|
return (
|
|
<video
|
|
key={this.props.fileInfo.id}
|
|
ref='video'
|
|
data-setup='{}'
|
|
controls='controls'
|
|
width={width}
|
|
height={height}
|
|
>
|
|
<source
|
|
ref='source'
|
|
src={this.props.fileUrl}
|
|
/>
|
|
</video>
|
|
);
|
|
}
|
|
}
|
|
|
|
AudioVideoPreview.propTypes = {
|
|
fileInfo: PropTypes.object.isRequired,
|
|
fileUrl: PropTypes.string.isRequired
|
|
};
|