[Glitch] Add button to view context to media modal
Port eb63217210b0ab85ff1fcca9506d5e7931382a56 to glitch-soc Signed-off-by: Thibaut Girka <thib@sitedethib.com>
This commit is contained in:
		
							parent
							
								
									209c080280
								
							
						
					
					
						commit
						bc97fd641f
					
				| @ -112,12 +112,12 @@ export default class AccountGallery extends ImmutablePureComponent { | |||||||
| 
 | 
 | ||||||
|   handleOpenMedia = attachment => { |   handleOpenMedia = attachment => { | ||||||
|     if (attachment.get('type') === 'video') { |     if (attachment.get('type') === 'video') { | ||||||
|       this.props.dispatch(openModal('VIDEO', { media: attachment })); |       this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') })); | ||||||
|     } else { |     } else { | ||||||
|       const media = attachment.getIn(['status', 'media_attachments']); |       const media = attachment.getIn(['status', 'media_attachments']); | ||||||
|       const index = media.findIndex(x => x.get('id') === attachment.get('id')); |       const index = media.findIndex(x => x.get('id') === attachment.get('id')); | ||||||
| 
 | 
 | ||||||
|       this.props.dispatch(openModal('MEDIA', { media, index })); |       this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') })); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ import PropTypes from 'prop-types'; | |||||||
| import Video from 'flavours/glitch/features/video'; | import Video from 'flavours/glitch/features/video'; | ||||||
| import ExtendedVideoPlayer from 'flavours/glitch/components/extended_video_player'; | import ExtendedVideoPlayer from 'flavours/glitch/components/extended_video_player'; | ||||||
| import classNames from 'classnames'; | import classNames from 'classnames'; | ||||||
| import { defineMessages, injectIntl } from 'react-intl'; | import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; | ||||||
| import IconButton from 'flavours/glitch/components/icon_button'; | import IconButton from 'flavours/glitch/components/icon_button'; | ||||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||||
| import ImageLoader from './image_loader'; | import ImageLoader from './image_loader'; | ||||||
| @ -19,8 +19,13 @@ const messages = defineMessages({ | |||||||
| @injectIntl | @injectIntl | ||||||
| export default class MediaModal extends ImmutablePureComponent { | export default class MediaModal extends ImmutablePureComponent { | ||||||
| 
 | 
 | ||||||
|  |   static contextTypes = { | ||||||
|  |     router: PropTypes.object, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   static propTypes = { |   static propTypes = { | ||||||
|     media: ImmutablePropTypes.list.isRequired, |     media: ImmutablePropTypes.list.isRequired, | ||||||
|  |     status: ImmutablePropTypes.map, | ||||||
|     index: PropTypes.number.isRequired, |     index: PropTypes.number.isRequired, | ||||||
|     onClose: PropTypes.func.isRequired, |     onClose: PropTypes.func.isRequired, | ||||||
|     intl: PropTypes.object.isRequired, |     intl: PropTypes.object.isRequired, | ||||||
| @ -81,8 +86,15 @@ export default class MediaModal extends ImmutablePureComponent { | |||||||
|     })); |     })); | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  |   handleStatusClick = e => { | ||||||
|  |     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||||
|  |       e.preventDefault(); | ||||||
|  |       this.context.router.history.push(`/statuses/${this.props.status.get('id')}`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   render () { |   render () { | ||||||
|     const { media, intl, onClose } = this.props; |     const { media, status, intl, onClose } = this.props; | ||||||
|     const { navigationHidden } = this.state; |     const { navigationHidden } = this.state; | ||||||
| 
 | 
 | ||||||
|     const index = this.getIndex(); |     const index = this.getIndex(); | ||||||
| @ -186,10 +198,19 @@ export default class MediaModal extends ImmutablePureComponent { | |||||||
|             {content} |             {content} | ||||||
|           </ReactSwipeableViews> |           </ReactSwipeableViews> | ||||||
|         </div> |         </div> | ||||||
|  | 
 | ||||||
|         <div className={navigationClassName}> |         <div className={navigationClassName}> | ||||||
|           <IconButton className='media-modal__close' title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={40} /> |           <IconButton className='media-modal__close' title={intl.formatMessage(messages.close)} icon='times' onClick={onClose} size={40} /> | ||||||
|  | 
 | ||||||
|           {leftNav} |           {leftNav} | ||||||
|           {rightNav} |           {rightNav} | ||||||
|  | 
 | ||||||
|  |           {status && ( | ||||||
|  |             <div className={classNames('media-modal__meta', { 'media-modal__meta--shifted': media.size > 1 })}> | ||||||
|  |               <a href={status.get('url')} onClick={this.handleStatusClick}><FormattedMessage id='lightbox.view_context' defaultMessage='View context' /></a> | ||||||
|  |             </div> | ||||||
|  |           )} | ||||||
|  | 
 | ||||||
|           <ul className='media-modal__pagination'> |           <ul className='media-modal__pagination'> | ||||||
|             {pagination} |             {pagination} | ||||||
|           </ul> |           </ul> | ||||||
|  | |||||||
| @ -3,17 +3,32 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; | |||||||
| import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||||
| import Video from 'flavours/glitch/features/video'; | import Video from 'flavours/glitch/features/video'; | ||||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||||
|  | import { FormattedMessage } from 'react-intl'; | ||||||
| 
 | 
 | ||||||
| export default class VideoModal extends ImmutablePureComponent { | export default class VideoModal extends ImmutablePureComponent { | ||||||
| 
 | 
 | ||||||
|  |   static contextTypes = { | ||||||
|  |     router: PropTypes.object, | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   static propTypes = { |   static propTypes = { | ||||||
|     media: ImmutablePropTypes.map.isRequired, |     media: ImmutablePropTypes.map.isRequired, | ||||||
|  |     status: ImmutablePropTypes.map, | ||||||
|     time: PropTypes.number, |     time: PropTypes.number, | ||||||
|     onClose: PropTypes.func.isRequired, |     onClose: PropTypes.func.isRequired, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|  |   handleStatusClick = e => { | ||||||
|  |     if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { | ||||||
|  |       e.preventDefault(); | ||||||
|  |       this.context.router.history.push(`/statuses/${this.props.status.get('id')}`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   render () { |   render () { | ||||||
|     const { media, time, onClose } = this.props; |     const { media, status, time, onClose } = this.props; | ||||||
|  | 
 | ||||||
|  |     const link = status && <a href={status.get('url')} onClick={this.handleStatusClick}><FormattedMessage id='lightbox.view_context' defaultMessage='View context' /></a>; | ||||||
| 
 | 
 | ||||||
|     return ( |     return ( | ||||||
|       <div className='modal-root__modal video-modal'> |       <div className='modal-root__modal video-modal'> | ||||||
| @ -24,6 +39,7 @@ export default class VideoModal extends ImmutablePureComponent { | |||||||
|             src={media.get('url')} |             src={media.get('url')} | ||||||
|             startTime={time} |             startTime={time} | ||||||
|             onCloseVideo={onClose} |             onCloseVideo={onClose} | ||||||
|  |             link={link} | ||||||
|             detailed |             detailed | ||||||
|             alt={media.get('description')} |             alt={media.get('description')} | ||||||
|           /> |           /> | ||||||
|  | |||||||
| @ -106,6 +106,7 @@ export default class Video extends React.PureComponent { | |||||||
|     intl: PropTypes.object.isRequired, |     intl: PropTypes.object.isRequired, | ||||||
|     cacheWidth: PropTypes.func, |     cacheWidth: PropTypes.func, | ||||||
|     blurhash: PropTypes.string, |     blurhash: PropTypes.string, | ||||||
|  |     link: PropTypes.node, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   state = { |   state = { | ||||||
| @ -384,7 +385,7 @@ export default class Video extends React.PureComponent { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   render () { |   render () { | ||||||
|     const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed, sensitive } = this.props; |     const { preview, src, inline, startTime, onOpenVideo, onCloseVideo, intl, alt, letterbox, fullwidth, detailed, sensitive, link } = this.props; | ||||||
|     const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; |     const { containerWidth, currentTime, duration, volume, buffer, dragging, paused, fullscreen, hovered, muted, revealed } = this.state; | ||||||
|     const progress = (currentTime / duration) * 100; |     const progress = (currentTime / duration) * 100; | ||||||
|     const playerStyle = {}; |     const playerStyle = {}; | ||||||
| @ -487,13 +488,15 @@ export default class Video extends React.PureComponent { | |||||||
|                 /> |                 /> | ||||||
|               </div> |               </div> | ||||||
| 
 | 
 | ||||||
|               {(detailed || fullscreen) && |               {(detailed || fullscreen) && ( | ||||||
|                 <span> |                 <span> | ||||||
|                   <span className='video-player__time-current'>{formatTime(currentTime)}</span> |                   <span className='video-player__time-current'>{formatTime(currentTime)}</span> | ||||||
|                   <span className='video-player__time-sep'>/</span> |                   <span className='video-player__time-sep'>/</span> | ||||||
|                   <span className='video-player__time-total'>{formatTime(duration)}</span> |                   <span className='video-player__time-total'>{formatTime(duration)}</span> | ||||||
|                 </span> |                 </span> | ||||||
|               } |               )} | ||||||
|  | 
 | ||||||
|  |               {link && <span className='video-player__link'>{link}</span>} | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
|             <div className='video-player__buttons right'> |             <div className='video-player__buttons right'> | ||||||
|  | |||||||
| @ -270,6 +270,31 @@ | |||||||
|   pointer-events: none; |   pointer-events: none; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .media-modal__meta { | ||||||
|  |   text-align: center; | ||||||
|  |   position: absolute; | ||||||
|  |   left: 0; | ||||||
|  |   bottom: 20px; | ||||||
|  |   width: 100%; | ||||||
|  |   pointer-events: none; | ||||||
|  | 
 | ||||||
|  |   &--shifted { | ||||||
|  |     bottom: 62px; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   a { | ||||||
|  |     text-decoration: none; | ||||||
|  |     font-weight: 500; | ||||||
|  |     color: $ui-secondary-color; | ||||||
|  | 
 | ||||||
|  |     &:hover, | ||||||
|  |     &:focus, | ||||||
|  |     &:active { | ||||||
|  |       text-decoration: underline; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .media-modal__page-dot { | .media-modal__page-dot { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
| } | } | ||||||
| @ -519,6 +544,23 @@ | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   &__link { | ||||||
|  |     padding: 2px 10px; | ||||||
|  | 
 | ||||||
|  |     a { | ||||||
|  |       text-decoration: none; | ||||||
|  |       font-size: 14px; | ||||||
|  |       font-weight: 500; | ||||||
|  |       color: $white; | ||||||
|  | 
 | ||||||
|  |       &:hover, | ||||||
|  |       &:active, | ||||||
|  |       &:focus { | ||||||
|  |         text-decoration: underline; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   &__seek { |   &__seek { | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
|     height: 24px; |     height: 24px; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user