Merge remote-tracking branch 'glitchsoc/master' into gs-master
This commit is contained in:
		
						commit
						d2b28ea51d
					
				
					 7 changed files with 46 additions and 21 deletions
				
			
		|  | @ -6,7 +6,7 @@ import IconButton from './icon_button'; | |||
| import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; | ||||
| import { isIOS } from 'flavours/glitch/util/is_mobile'; | ||||
| import classNames from 'classnames'; | ||||
| import { autoPlayGif } from 'flavours/glitch/util/initial_state'; | ||||
| import { autoPlayGif, displaySensitiveMedia } from 'flavours/glitch/util/initial_state'; | ||||
| 
 | ||||
| const messages = defineMessages({ | ||||
|   hidden: { | ||||
|  | @ -208,7 +208,7 @@ export default class MediaGallery extends React.PureComponent { | |||
|   }; | ||||
| 
 | ||||
|   state = { | ||||
|     visible: !this.props.sensitive, | ||||
|     visible: !this.props.sensitive || displaySensitiveMedia, | ||||
|   }; | ||||
| 
 | ||||
|   componentWillReceiveProps (nextProps) { | ||||
|  | @ -265,6 +265,7 @@ export default class MediaGallery extends React.PureComponent { | |||
|             return ( | ||||
|               <button | ||||
|                 className='media-spoiler' | ||||
|                 type='button' | ||||
|                 onClick={handleOpen} | ||||
|               > | ||||
|                 <span className='media-spoiler__warning'> | ||||
|  |  | |||
|  | @ -326,6 +326,7 @@ export default class Status extends ImmutablePureComponent { | |||
|             {Component => (<Component | ||||
|               preview={video.get('preview_url')} | ||||
|               src={video.get('url')} | ||||
|               inline | ||||
|               sensitive={status.get('sensitive')} | ||||
|               letterbox={settings.getIn(['media', 'letterbox'])} | ||||
|               fullwidth={settings.getIn(['media', 'fullwidth'])} | ||||
|  |  | |||
|  | @ -58,6 +58,7 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||
|           <Video | ||||
|             preview={video.get('preview_url')} | ||||
|             src={video.get('url')} | ||||
|             inline | ||||
|             sensitive={status.get('sensitive')} | ||||
|             letterbox={settings.getIn(['media', 'letterbox'])} | ||||
|             fullwidth={settings.getIn(['media', 'fullwidth'])} | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ import BundleContainer from '../containers/bundle_container'; | |||
| import ColumnLoading from './column_loading'; | ||||
| import DrawerLoading from './drawer_loading'; | ||||
| import BundleColumnError from './bundle_column_error'; | ||||
| import { Drawer, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, ListTimeline } from 'flavours/glitch/util/async-components'; | ||||
| import { Drawer, Notifications, HomeTimeline, CommunityTimeline, PublicTimeline, HashtagTimeline, DirectTimeline, FavouritedStatuses, BookmarkedStatuses, ListTimeline } from 'flavours/glitch/util/async-components'; | ||||
| 
 | ||||
| import detectPassiveEvents from 'detect-passive-events'; | ||||
| import { scrollRight } from 'flavours/glitch/util/scroll'; | ||||
|  | @ -25,6 +25,7 @@ const componentMap = { | |||
|   'HASHTAG': HashtagTimeline, | ||||
|   'DIRECT': DirectTimeline, | ||||
|   'FAVOURITES': FavouritedStatuses, | ||||
|   'BOOKMARKS': BookmarkedStatuses, | ||||
|   'LIST': ListTimeline, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; | |||
| import { throttle } from 'lodash'; | ||||
| import classNames from 'classnames'; | ||||
| import { isFullscreen, requestFullscreen, exitFullscreen } from 'flavours/glitch/util/fullscreen'; | ||||
| import { displaySensitiveMedia } from 'flavours/glitch/util/initial_state'; | ||||
| 
 | ||||
| const messages = defineMessages({ | ||||
|   play: { id: 'video.play', defaultMessage: 'Play' }, | ||||
|  | @ -97,6 +98,7 @@ export default class Video extends React.PureComponent { | |||
|     letterbox: PropTypes.bool, | ||||
|     fullwidth: PropTypes.bool, | ||||
|     detailed: PropTypes.bool, | ||||
|     inline: PropTypes.bool, | ||||
|     intl: PropTypes.object.isRequired, | ||||
|   }; | ||||
| 
 | ||||
|  | @ -105,14 +107,21 @@ export default class Video extends React.PureComponent { | |||
|     duration: 0, | ||||
|     paused: true, | ||||
|     dragging: false, | ||||
|     containerWidth: false, | ||||
|     fullscreen: false, | ||||
|     hovered: false, | ||||
|     muted: false, | ||||
|     revealed: !this.props.sensitive, | ||||
|     revealed: !this.props.sensitive || displaySensitiveMedia, | ||||
|   }; | ||||
| 
 | ||||
|   setPlayerRef = c => { | ||||
|     this.player = c; | ||||
| 
 | ||||
|     if (c) { | ||||
|       this.setState({ | ||||
|         containerWidth: c.offsetWidth, | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   setVideoRef = c => { | ||||
|  | @ -246,12 +255,23 @@ export default class Video extends React.PureComponent { | |||
|   } | ||||
| 
 | ||||
|   render () { | ||||
|     const { preview, src, width, height, startTime, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed } = this.props; | ||||
|     const { currentTime, duration, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; | ||||
|     const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed } = this.props; | ||||
|     const { containerWidth, currentTime, duration, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; | ||||
|     const progress = (currentTime / duration) * 100; | ||||
|     const playerStyle = {}; | ||||
| 
 | ||||
|     let { width, height } = this.props; | ||||
| 
 | ||||
|     if (inline && containerWidth) { | ||||
|       width  = containerWidth; | ||||
|       height = containerWidth / (16/9); | ||||
| 
 | ||||
|       playerStyle.width  = width; | ||||
|       playerStyle.height = height; | ||||
|     } | ||||
| 
 | ||||
|     return ( | ||||
|       <div className={classNames('video-player', { inactive: !revealed, detailed, inline: width && height && !fullscreen, fullscreen, letterbox, 'full-width': fullwidth })} style={{ width, height }} ref={this.setPlayerRef} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|       <div className={classNames('video-player', { inactive: !revealed, detailed, inline: width && height && !fullscreen, fullscreen, letterbox, 'full-width': fullwidth })} style={playerStyle} ref={this.setPlayerRef} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}> | ||||
|         <video | ||||
|           ref={this.setVideoRef} | ||||
|           src={src} | ||||
|  | @ -271,7 +291,7 @@ export default class Video extends React.PureComponent { | |||
|           onProgress={this.handleProgress} | ||||
|         /> | ||||
| 
 | ||||
|         <button className={classNames('video-player__spoiler', { active: !revealed })} onClick={this.toggleReveal}> | ||||
|         <button type='button' className={classNames('video-player__spoiler', { active: !revealed })} onClick={this.toggleReveal}> | ||||
|           <span className='video-player__spoiler__title'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span> | ||||
|           <span className='video-player__spoiler__subtitle'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span> | ||||
|         </button> | ||||
|  | @ -290,10 +310,10 @@ export default class Video extends React.PureComponent { | |||
| 
 | ||||
|           <div className='video-player__buttons-bar'> | ||||
|             <div className='video-player__buttons left'> | ||||
|               <button aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay}><i className={classNames('fa fa-fw', { 'fa-play': paused, 'fa-pause': !paused })} /></button> | ||||
|               <button aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><i className={classNames('fa fa-fw', { 'fa-volume-off': muted, 'fa-volume-up': !muted })} /></button> | ||||
|               <button type='button' aria-label={intl.formatMessage(paused ? messages.play : messages.pause)} onClick={this.togglePlay}><i className={classNames('fa fa-fw', { 'fa-play': paused, 'fa-pause': !paused })} /></button> | ||||
|               <button type='button' aria-label={intl.formatMessage(muted ? messages.unmute : messages.mute)} onClick={this.toggleMute}><i className={classNames('fa fa-fw', { 'fa-volume-off': muted, 'fa-volume-up': !muted })} /></button> | ||||
| 
 | ||||
|               {!onCloseVideo && <button aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><i className='fa fa-fw fa-eye' /></button>} | ||||
|               {!onCloseVideo && <button type='button' aria-label={intl.formatMessage(messages.hide)} onClick={this.toggleReveal}><i className='fa fa-fw fa-eye' /></button>} | ||||
| 
 | ||||
|               {(detailed || fullscreen) && | ||||
|                 <span> | ||||
|  | @ -305,9 +325,9 @@ export default class Video extends React.PureComponent { | |||
|             </div> | ||||
| 
 | ||||
|             <div className='video-player__buttons right'> | ||||
|               {(!fullscreen && onOpenVideo) && <button aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><i className='fa fa-fw fa-expand' /></button>} | ||||
|               {onCloseVideo && <button aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><i className='fa fa-fw fa-compress' /></button>} | ||||
|               <button aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><i className={classNames('fa fa-fw', { 'fa-arrows-alt': !fullscreen, 'fa-compress': fullscreen })} /></button> | ||||
|               {(!fullscreen && onOpenVideo) && <button type='button' aria-label={intl.formatMessage(messages.expand)} onClick={this.handleOpenVideo}><i className='fa fa-fw fa-expand' /></button>} | ||||
|               {onCloseVideo && <button type='button' aria-label={intl.formatMessage(messages.close)} onClick={this.handleCloseVideo}><i className='fa fa-fw fa-compress' /></button>} | ||||
|               <button type='button' aria-label={intl.formatMessage(fullscreen ? messages.exit_fullscreen : messages.fullscreen)} onClick={this.toggleFullscreen}><i className={classNames('fa fa-fw', { 'fa-arrows-alt': !fullscreen, 'fa-compress': fullscreen })} /></button> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|  |  | |||
|  | @ -161,6 +161,12 @@ | |||
|   max-width: 100vw; | ||||
|   max-height: 100vh; | ||||
|   position: relative; | ||||
| } | ||||
| 
 | ||||
| .media-modal { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   position: relative; | ||||
| 
 | ||||
|   .extended-video-player { | ||||
|     width: 100%; | ||||
|  | @ -176,12 +182,6 @@ | |||
|   } | ||||
| } | ||||
| 
 | ||||
| .media-modal { | ||||
|   width: 100%; | ||||
|   height: 100%; | ||||
|   position: relative; | ||||
| } | ||||
| 
 | ||||
| .media-modal__closer { | ||||
|   position: absolute; | ||||
|   top: 0; | ||||
|  | @ -307,7 +307,7 @@ | |||
| 
 | ||||
|   &.inline { | ||||
|     video { | ||||
|       object-fit: cover; | ||||
|       object-fit: contain; | ||||
|       position: relative; | ||||
|       top: 50%; | ||||
|       transform: translateY(-50%); | ||||
|  |  | |||
|  | @ -13,6 +13,7 @@ const getMeta = (prop) => initialState && initialState.meta && initialState.meta | |||
| 
 | ||||
| export const reduceMotion = getMeta('reduce_motion'); | ||||
| export const autoPlayGif = getMeta('auto_play_gif'); | ||||
| export const displaySensitiveMedia = getMeta('display_sensitive_media'); | ||||
| export const unfollowModal = getMeta('unfollow_modal'); | ||||
| export const boostModal = getMeta('boost_modal'); | ||||
| export const favouriteModal = getMeta('favourite_modal'); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue