|
|
|
@ -61,73 +61,81 @@ export default class MediaItem extends ImmutablePureComponent { |
|
|
|
|
const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`; |
|
|
|
|
const height = width; |
|
|
|
|
const status = attachment.get('status'); |
|
|
|
|
const title = status.get('spoiler_text') || attachment.get('description'); |
|
|
|
|
const title = status.get('spoiler_text') || attachment.get('description'); |
|
|
|
|
|
|
|
|
|
let thumbnail = ''; |
|
|
|
|
let thumbnail, label, icon, content; |
|
|
|
|
|
|
|
|
|
if (attachment.get('type') === 'unknown') { |
|
|
|
|
// Skip
|
|
|
|
|
} else if (attachment.get('type') === 'audio') { |
|
|
|
|
thumbnail = ( |
|
|
|
|
if (!visible) { |
|
|
|
|
icon = ( |
|
|
|
|
<span className='account-gallery__item__icons'> |
|
|
|
|
<Icon id='music' /> |
|
|
|
|
<Icon id='eye-slash' /> |
|
|
|
|
</span> |
|
|
|
|
); |
|
|
|
|
} else if (attachment.get('type') === 'image') { |
|
|
|
|
const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0; |
|
|
|
|
const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0; |
|
|
|
|
const x = ((focusX / 2) + .5) * 100; |
|
|
|
|
const y = ((focusY / -2) + .5) * 100; |
|
|
|
|
|
|
|
|
|
thumbnail = ( |
|
|
|
|
<img |
|
|
|
|
src={attachment.get('preview_url')} |
|
|
|
|
alt={attachment.get('description')} |
|
|
|
|
title={attachment.get('description')} |
|
|
|
|
style={{ objectPosition: `${x}% ${y}%` }} |
|
|
|
|
onLoad={this.handleImageLoad} |
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
} else if (['gifv', 'video'].indexOf(attachment.get('type')) !== -1) { |
|
|
|
|
const autoPlay = !isIOS() && autoPlayGif; |
|
|
|
|
const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF'; |
|
|
|
|
|
|
|
|
|
thumbnail = ( |
|
|
|
|
<div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}> |
|
|
|
|
} else { |
|
|
|
|
if (['audio', 'video'].includes(attachment.get('type'))) { |
|
|
|
|
content = ( |
|
|
|
|
<img |
|
|
|
|
src={attachment.get('preview_url') || attachment.getIn(['account', 'avatar_static'])} |
|
|
|
|
alt={attachment.get('description')} |
|
|
|
|
onLoad={this.handleImageLoad} |
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
if (attachment.get('type') === 'audio') { |
|
|
|
|
label = <Icon id='music' />; |
|
|
|
|
} else { |
|
|
|
|
label = <Icon id='play' />; |
|
|
|
|
} |
|
|
|
|
} else if (attachment.get('type') === 'image') { |
|
|
|
|
const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0; |
|
|
|
|
const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0; |
|
|
|
|
const x = ((focusX / 2) + .5) * 100; |
|
|
|
|
const y = ((focusY / -2) + .5) * 100; |
|
|
|
|
|
|
|
|
|
content = ( |
|
|
|
|
<img |
|
|
|
|
src={attachment.get('preview_url')} |
|
|
|
|
alt={attachment.get('description')} |
|
|
|
|
style={{ objectPosition: `${x}% ${y}%` }} |
|
|
|
|
onLoad={this.handleImageLoad} |
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
} else if (attachment.get('type') === 'gifv') { |
|
|
|
|
content = ( |
|
|
|
|
<video |
|
|
|
|
className='media-gallery__item-gifv-thumbnail' |
|
|
|
|
aria-label={attachment.get('description')} |
|
|
|
|
title={attachment.get('description')} |
|
|
|
|
role='application' |
|
|
|
|
src={attachment.get('url')} |
|
|
|
|
onMouseEnter={this.handleMouseEnter} |
|
|
|
|
onMouseLeave={this.handleMouseLeave} |
|
|
|
|
autoPlay={autoPlay} |
|
|
|
|
autoPlay={!isIOS() && autoPlayGif} |
|
|
|
|
loop |
|
|
|
|
muted |
|
|
|
|
/> |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
label = 'GIF'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
thumbnail = ( |
|
|
|
|
<div className='media-gallery__gifv'> |
|
|
|
|
{content} |
|
|
|
|
|
|
|
|
|
<span className='media-gallery__gifv__label'>{label}</span> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const icon = ( |
|
|
|
|
<span className='account-gallery__item__icons'> |
|
|
|
|
<Icon id='eye-slash' /> |
|
|
|
|
</span> |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className='account-gallery__item' style={{ width, height }}> |
|
|
|
|
<a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'> |
|
|
|
|
<Blurhash |
|
|
|
|
hash={attachment.get('blurhash')} |
|
|
|
|
className={classNames('media-gallery__preview', { |
|
|
|
|
'media-gallery__preview--hidden': visible && loaded, |
|
|
|
|
})} |
|
|
|
|
className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} |
|
|
|
|
dummy={!useBlurhash} |
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
{visible ? thumbnail : icon} |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|