Open video modal on public UI (#7469)
This commit is contained in:
		
							parent
							
								
									f77b11cd10
								
							
						
					
					
						commit
						d9b2f84c92
					
				
					 6 changed files with 68 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -84,8 +84,8 @@ export default class Status extends ImmutablePureComponent {
 | 
			
		|||
    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 => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 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}
 | 
			
		||||
              />
 | 
			
		||||
            )}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 = () => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 (
 | 
			
		||||
          <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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
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';
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +132,8 @@ export default class Video extends React.PureComponent {
 | 
			
		|||
    this.seek = c;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleClickRoot = e => 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 (
 | 
			
		||||
      <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}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4432,6 +4432,10 @@ a.status-card {
 | 
			
		|||
  max-width: 100%;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
 | 
			
		||||
  &:focus {
 | 
			
		||||
    outline: 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  video {
 | 
			
		||||
    max-width: 100vw;
 | 
			
		||||
    max-height: 80vh;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue