Show SENSITIVE tag on sensitive images (#267)
This commit is contained in:
		
							parent
							
								
									90e568413b
								
							
						
					
					
						commit
						5d2ef7a616
					
				
					 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';
 | 
					import { autoPlayGif } from 'flavours/glitch/util/initial_state';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const messages = defineMessages({
 | 
					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 {
 | 
					class Item extends React.PureComponent {
 | 
				
			||||||
| 
						 | 
					@ -206,48 +225,79 @@ export default class MediaGallery extends React.PureComponent {
 | 
				
			||||||
    this.props.onOpenMedia(this.props.media, index);
 | 
					    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 () {
 | 
					  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 { visible } = this.state;
 | 
				
			||||||
    const size = media.take(4).size;
 | 
					    const size = media.take(4).size;
 | 
				
			||||||
 | 
					    const computedClass = classNames('media-gallery', `size-${size}`, { 'full-width': fullwidth });
 | 
				
			||||||
    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} />);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <div className={`media-gallery size-${size} ${fullwidth ? 'full-width' : ''}`}>
 | 
					      <div className={computedClass}>
 | 
				
			||||||
        <div className={classNames('spoiler-button', { 'spoiler-button--visible': visible })}>
 | 
					        {visible ? (
 | 
				
			||||||
          <IconButton title={intl.formatMessage(messages.toggle_visible)} icon={visible ? 'eye' : 'eye-slash'} overlay onClick={this.handleOpen} />
 | 
					          <div className='sensitive-info'>
 | 
				
			||||||
        </div>
 | 
					            <IconButton
 | 
				
			||||||
 | 
					              icon='eye'
 | 
				
			||||||
        {children}
 | 
					              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>
 | 
					      </div>
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,8 @@ const messages = {
 | 
				
			||||||
  'status.collapse': 'Collapse',
 | 
					  'status.collapse': 'Collapse',
 | 
				
			||||||
  'status.uncollapse': 'Uncollapse',
 | 
					  'status.uncollapse': 'Uncollapse',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  'media_gallery.sensitive': 'Sensitive',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  'favourite_modal.combo': 'You can press {combo} to skip this next time',
 | 
					  'favourite_modal.combo': 'You can press {combo} to skip this next time',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  'home.column_settings.show_direct': 'Show DMs',
 | 
					  'home.column_settings.show_direct': 'Show DMs',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2487,17 +2487,29 @@
 | 
				
			||||||
  font-weight: 500;
 | 
					  font-weight: 500;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.spoiler-button {
 | 
					.sensitive-info {
 | 
				
			||||||
  display: none;
 | 
					  display: flex;
 | 
				
			||||||
  left: 4px;
 | 
					  flex-direction: row;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
  position: absolute;
 | 
					  position: absolute;
 | 
				
			||||||
  text-shadow: 0 1px 1px $base-shadow-color, 1px 0 1px $base-shadow-color;
 | 
					 | 
				
			||||||
  top: 4px;
 | 
					  top: 4px;
 | 
				
			||||||
 | 
					  left: 4px;
 | 
				
			||||||
  z-index: 100;
 | 
					  z-index: 100;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  &.spoiler-button--visible {
 | 
					.sensitive-marker {
 | 
				
			||||||
    display: block;
 | 
					  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 {
 | 
					.modal-container--preloader {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue