return <div className='media-spoiler-video' style={{ height: '110px' }} />;
}
- handleOpenVideo = startTime => {
- this.props.onOpenVideo(this._properStatus().getIn(['media_attachments', 0]), startTime);
+ handleOpenVideo = (media, startTime) => {
+ this.props.onOpenVideo(media, startTime);
}
handleHotkeyReply = e => {
import Card from '../features/status/components/card';
import ModalRoot from '../components/modal_root';
import MediaModal from '../features/ui/components/media_modal';
-import { fromJS } from 'immutable';
+import { List as ImmutableList, fromJS } from 'immutable';
const { localeData, messages } = getLocale();
addLocaleData(localeData);
state = {
media: null,
index: null,
+ time: null,
};
handleOpenMedia = (media, index) => {
this.setState({ media, index });
}
+ handleOpenVideo = (video, time) => {
+ const media = ImmutableList([video]);
+
+ document.body.classList.add('media-standalone__body');
+ this.setState({ media, time });
+ }
+
handleCloseMedia = () => {
document.body.classList.remove('media-standalone__body');
- this.setState({ media: null, index: null });
+ this.setState({ media: null, index: null, time: null });
}
render () {
Object.assign(props, {
...(media ? { media: fromJS(media) } : {}),
...(card ? { card: fromJS(card) } : {}),
+
+ ...(componentName === 'Video' ? {
+ onOpenVideo: this.handleOpenVideo,
+ } : {
+ onOpenMedia: this.handleOpenMedia,
+ }),
});
return ReactDOM.createPortal(
- <Component onOpenMedia={this.handleOpenMedia} {...props} key={`media-${i}`} />,
+ <Component {...props} key={`media-${i}`} />,
component,
);
})}
<ModalRoot onClose={this.handleCloseMedia}>
- {this.state.media === null || this.state.index === null ? null : (
+ {this.state.media && (
<MediaModal
media={this.state.media}
- index={this.state.index}
+ index={this.state.index || 0}
+ time={this.state.time}
onClose={this.handleCloseMedia}
/>
)}
e.stopPropagation();
}
- handleOpenVideo = startTime => {
- this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
+ handleOpenVideo = (media, startTime) => {
+ this.props.onOpenVideo(media, startTime);
}
handleExpandedToggle = () => {
import ReactSwipeableViews from 'react-swipeable-views';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
+import Video from '../../video';
import ExtendedVideoPlayer from '../../../components/extended_video_player';
import classNames from 'classnames';
import { defineMessages, injectIntl } from 'react-intl';
onClick={this.toggleNavigation}
/>
);
+ } else if (image.get('type') === 'video') {
+ const { time } = this.props;
+
+ return (
+ <Video
+ preview={image.get('preview_url')}
+ src={image.get('url')}
+ width={image.get('width')}
+ height={image.get('height')}
+ startTime={time || 0}
+ onCloseVideo={onClose}
+ detailed
+ description={image.get('description')}
+ key={image.get('url')}
+ />
+ );
} else if (image.get('type') === 'gifv') {
return (
<ExtendedVideoPlayer
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { fromJS } from 'immutable';
import { throttle } from 'lodash';
import classNames from 'classnames';
import { isFullscreen, requestFullscreen, exitFullscreen } from '../ui/util/fullscreen';
this.seek = c;
}
+ handleClickRoot = e => e.stopPropagation();
+
handlePlay = () => {
this.setState({ paused: false });
}
}
handleOpenVideo = () => {
+ const { src, preview, width, height } = this.props;
+ const media = fromJS({
+ type: 'video',
+ url: src,
+ preview_url: preview,
+ width,
+ height,
+ });
+
this.video.pause();
- this.props.onOpenVideo(this.video.currentTime);
+ this.props.onOpenVideo(media, this.video.currentTime);
}
handleCloseVideo = () => {
}
return (
- <div className={classNames('video-player', { inactive: !revealed, detailed, inline: inline && !fullscreen, fullscreen })} style={playerStyle} ref={this.setPlayerRef} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>
+ <div
+ role='menuitem'
+ className={classNames('video-player', { inactive: !revealed, detailed, inline: inline && !fullscreen, fullscreen })}
+ style={playerStyle}
+ ref={this.setPlayerRef}
+ onMouseEnter={this.handleMouseEnter}
+ onMouseLeave={this.handleMouseLeave}
+ onClick={this.handleClickRoot}
+ tabIndex={0}
+ >
<video
ref={this.setVideoRef}
src={src}
max-width: 100%;
border-radius: 4px;
+ &:focus {
+ outline: 0;
+ }
+
video {
max-width: 100vw;
max-height: 80vh;