Show SENSITIVE tag on sensitive images (#267)
This commit is contained in:
		
							parent
							
								
									d4a36ee962
								
							
						
					
					
						commit
						95459fc5bd
					
				
					 3 changed files with 109 additions and 45 deletions
				
			
		|  | @ -9,7 +9,26 @@ import classNames from 'classnames'; | |||
| import { autoPlayGif } from 'flavours/glitch/util/initial_state'; | ||||
| 
 | ||||
| const messages = defineMessages({ | ||||
|   toggle_visible: { id: 'media_gallery.toggle_visible', defaultMessage: 'Toggle visibility' }, | ||||
|   hidden: { | ||||
|     defaultMessage: 'Media hidden', | ||||
|     id: 'status.media_hidden', | ||||
|   }, | ||||
|   sensitive: { | ||||
|     defaultMessage: 'Sensitive', | ||||
|     id: 'media_gallery.sensitive', | ||||
|   }, | ||||
|   toggle: { | ||||
|     defaultMessage: 'Click to view', | ||||
|     id: 'status.sensitive_toggle' | ||||
|   }, | ||||
|   toggle_visible: { | ||||
|     defaultMessage: 'Toggle visibility', | ||||
|     id: 'media_gallery.toggle_visible', | ||||
|   }, | ||||
|   warning: { | ||||
|     defaultMessage: 'Sensitive content', | ||||
|     id: 'status.sensitive_warning', | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| class Item extends React.PureComponent { | ||||
|  | @ -206,48 +225,79 @@ export default class MediaGallery extends React.PureComponent { | |||
|     this.props.onOpenMedia(this.props.media, index); | ||||
|   } | ||||
| 
 | ||||
|   isStandaloneEligible() { | ||||
|     const { media, standalone } = this.props; | ||||
|     return standalone && media.size === 1 && media.getIn([0, 'meta', 'small', 'aspect']); | ||||
|   } | ||||
| 
 | ||||
|   render () { | ||||
|     const { media, intl, sensitive, letterbox, fullwidth } = this.props; | ||||
|     const { | ||||
|       handleClick, | ||||
|       handleOpen, | ||||
|     } = this; | ||||
|     const { | ||||
|       fullwidth, | ||||
|       intl, | ||||
|       letterbox, | ||||
|       media, | ||||
|       sensitive, | ||||
|       standalone, | ||||
|     } = this.props; | ||||
|     const { visible } = this.state; | ||||
|     const size = media.take(4).size; | ||||
| 
 | ||||
|     let children; | ||||
| 
 | ||||
|     if (!visible) { | ||||
|       let warning; | ||||
| 
 | ||||
|       if (sensitive) { | ||||
|         warning = <FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />; | ||||
|       } else { | ||||
|         warning = <FormattedMessage id='status.media_hidden' defaultMessage='Media hidden' />; | ||||
|       } | ||||
| 
 | ||||
|       children = ( | ||||
|         <button className='media-spoiler' onClick={this.handleOpen}> | ||||
|           <span className='media-spoiler__warning'>{warning}</span> | ||||
|           <span className='media-spoiler__trigger'><FormattedMessage id='status.sensitive_toggle' defaultMessage='Click to view' /></span> | ||||
|         </button> | ||||
|       ); | ||||
|     } else { | ||||
|       if (this.isStandaloneEligible()) { | ||||
|         children = <Item standalone onClick={this.handleClick} attachment={media.get(0)} />; | ||||
|       } else { | ||||
|         children = media.take(4).map((attachment, i) => <Item key={attachment.get('id')} onClick={this.handleClick} attachment={attachment} index={i} size={size} letterbox={letterbox} />); | ||||
|       } | ||||
|     } | ||||
|     const computedClass = classNames('media-gallery', `size-${size}`, { 'full-width': fullwidth }); | ||||
| 
 | ||||
|     return ( | ||||
|       <div className={`media-gallery size-${size} ${fullwidth ? 'full-width' : ''}`}> | ||||
|         <div className={classNames('spoiler-button', { 'spoiler-button--visible': visible })}> | ||||
|           <IconButton title={intl.formatMessage(messages.toggle_visible)} icon={visible ? 'eye' : 'eye-slash'} overlay onClick={this.handleOpen} /> | ||||
|         </div> | ||||
| 
 | ||||
|         {children} | ||||
|       <div className={computedClass}> | ||||
|         {visible ? ( | ||||
|           <div className='sensitive-info'> | ||||
|             <IconButton | ||||
|               icon='eye' | ||||
|               onClick={handleOpen} | ||||
|               overlay | ||||
|               title={intl.formatMessage(messages.toggle_visible)} | ||||
|             /> | ||||
|             {sensitive ? ( | ||||
|               <span className='sensitive-marker'> | ||||
|                 <FormattedMessage {...messages.sensitive} /> | ||||
|               </span> | ||||
|             ) : null} | ||||
|           </div> | ||||
|         ) : null} | ||||
|         {function () { | ||||
|           switch (true) { | ||||
|           case !visible: | ||||
|             return ( | ||||
|               <button | ||||
|                 className='media-spoiler' | ||||
|                 onClick={handleOpen} | ||||
|               > | ||||
|                 <span className='media-spoiler__warning'> | ||||
|                   <FormattedMessage {...(sensitive ? messages.warning : messages.hidden)} /> | ||||
|                 </span> | ||||
|                 <span className='media-spoiler__trigger'> | ||||
|                   <FormattedMessage {...messages.toggle} /> | ||||
|                 </span> | ||||
|               </button> | ||||
|             ); | ||||
|           case standalone && media.size === 1 && !!media.getIn([0, 'meta', 'small', 'aspect']): | ||||
|             return ( | ||||
|               <Item | ||||
|                 attachment={media.get(0)} | ||||
|                 onClick={handleClick} | ||||
|                 standalone | ||||
|               /> | ||||
|             ); | ||||
|           default: | ||||
|             return media.take(4).map( | ||||
|               (attachment, i) => ( | ||||
|                 <Item | ||||
|                   attachment={attachment} | ||||
|                   index={i} | ||||
|                   key={attachment.get('id')} | ||||
|                   letterbox={letterbox} | ||||
|                   onClick={handleClick} | ||||
|                   size={size} | ||||
|                 /> | ||||
|               ) | ||||
|             ); | ||||
|           } | ||||
|         }()} | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|  |  | |||
|  | @ -34,6 +34,8 @@ const messages = { | |||
|   'status.collapse': 'Collapse', | ||||
|   'status.uncollapse': 'Uncollapse', | ||||
| 
 | ||||
|   'media_gallery.sensitive': 'Sensitive', | ||||
| 
 | ||||
|   'favourite_modal.combo': 'You can press {combo} to skip this next time', | ||||
| 
 | ||||
|   'home.column_settings.show_direct': 'Show DMs', | ||||
|  |  | |||
|  | @ -2487,17 +2487,29 @@ | |||
|   font-weight: 500; | ||||
| } | ||||
| 
 | ||||
| .spoiler-button { | ||||
|   display: none; | ||||
|   left: 4px; | ||||
| .sensitive-info { | ||||
|   display: flex; | ||||
|   flex-direction: row; | ||||
|   align-items: center; | ||||
|   position: absolute; | ||||
|   text-shadow: 0 1px 1px $base-shadow-color, 1px 0 1px $base-shadow-color; | ||||
|   top: 4px; | ||||
|   left: 4px; | ||||
|   z-index: 100; | ||||
| } | ||||
| 
 | ||||
|   &.spoiler-button--visible { | ||||
|     display: block; | ||||
|   } | ||||
| .sensitive-marker { | ||||
|   margin: 0 3px; | ||||
|   border-radius: 2px; | ||||
|   padding: 2px 6px; | ||||
|   color: rgba($primary-text-color, 0.8); | ||||
|   background: rgba($base-overlay-background, 0.5); | ||||
|   font-size: 12px; | ||||
|   line-height: 15px; | ||||
|   text-transform: uppercase; | ||||
|   opacity: .9; | ||||
|   transition: opacity .1s ease; | ||||
| 
 | ||||
|   .media-gallery:hover & { opacity: 1 } | ||||
| } | ||||
| 
 | ||||
| .modal-container--preloader { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue