diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 953d98c20d..fd08ff3b7c 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -84,8 +84,8 @@ export default class Status extends ImmutablePureComponent {
return
;
}
- handleOpenVideo = startTime => {
- this.props.onOpenVideo(this._properStatus().getIn(['media_attachments', 0]), startTime);
+ handleOpenVideo = (media, startTime) => {
+ this.props.onOpenVideo(media, startTime);
}
handleHotkeyReply = e => {
diff --git a/app/javascript/mastodon/containers/media_container.js b/app/javascript/mastodon/containers/media_container.js
index eb2d540cb3..1700fba05a 100644
--- a/app/javascript/mastodon/containers/media_container.js
+++ b/app/javascript/mastodon/containers/media_container.js
@@ -8,7 +8,7 @@ import Video from '../features/video';
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);
@@ -25,6 +25,7 @@ export default class MediaContainer extends PureComponent {
state = {
media: null,
index: null,
+ time: null,
};
handleOpenMedia = (media, index) => {
@@ -32,9 +33,16 @@ export default class MediaContainer extends PureComponent {
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 () {
@@ -51,18 +59,25 @@ export default class MediaContainer extends PureComponent {
Object.assign(props, {
...(media ? { media: fromJS(media) } : {}),
...(card ? { card: fromJS(card) } : {}),
+
+ ...(componentName === 'Video' ? {
+ onOpenVideo: this.handleOpenVideo,
+ } : {
+ onOpenMedia: this.handleOpenMedia,
+ }),
});
return ReactDOM.createPortal(
- ,
+ ,
component,
);
})}
- {this.state.media === null || this.state.index === null ? null : (
+ {this.state.media && (
)}
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index b5f5160326..4177190044 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -34,8 +34,8 @@ export default class DetailedStatus extends ImmutablePureComponent {
e.stopPropagation();
}
- handleOpenVideo = startTime => {
- this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), startTime);
+ handleOpenVideo = (media, startTime) => {
+ this.props.onOpenVideo(media, startTime);
}
handleExpandedToggle = () => {
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.js b/app/javascript/mastodon/features/ui/components/media_modal.js
index fb76270fad..f4d6b5c4e6 100644
--- a/app/javascript/mastodon/features/ui/components/media_modal.js
+++ b/app/javascript/mastodon/features/ui/components/media_modal.js
@@ -2,6 +2,7 @@ import React from 'react';
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';
@@ -112,6 +113,22 @@ export default class MediaModal extends ImmutablePureComponent {
onClick={this.toggleNavigation}
/>
);
+ } else if (image.get('type') === 'video') {
+ const { time } = this.props;
+
+ return (
+
+ );
} else if (image.get('type') === 'gifv') {
return (
e.stopPropagation();
+
handlePlay = () => {
this.setState({ paused: false });
}
@@ -244,8 +247,17 @@ export default class Video extends React.PureComponent {
}
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 = () => {
@@ -270,7 +282,16 @@ export default class Video extends React.PureComponent {
}
return (
-