@ -43,62 +43,59 @@ const spoilerButtonStyle = {
zIndex : '100'
} ;
const MediaGallery = React . createClass ( {
const itemStyle = {
boxSizing : 'border-box' ,
position : 'relative' ,
float : 'left' ,
border : 'none' ,
display : 'block'
} ;
getInitialState ( ) {
return {
visible : ! this . props . sensitive
} ;
} ,
const thumbStyle = {
display : 'block' ,
width : '100%' ,
height : '100%' ,
textDecoration : 'none' ,
backgroundSize : 'cover' ,
cursor : 'zoom-in'
} ;
const gifvThumbStyle = {
position : 'relative' ,
zIndex : '1' ,
width : '100%' ,
height : '100%' ,
objectFit : 'cover' ,
top : '50%' ,
transform : 'translateY(-50%)' ,
cursor : 'zoom-in'
} ;
const Item = React . createClass ( {
propTypes : {
sensitive : React . PropTypes . bool ,
media : ImmutablePropTypes . list . isRequired ,
height : React . PropTypes . number . isRequired ,
onOpenMedia : React . PropTypes . func . isRequired ,
intl : React . PropTypes . object . isRequired
attachment : ImmutablePropTypes . map . isRequired ,
index : React . PropTypes . number . isRequired ,
size : React . PropTypes . number . isRequired ,
onClick : React . PropTypes . func . isRequired
} ,
mixins : [ PureRenderMixin ] ,
handleClick ( index , e ) {
handleClick ( e ) {
const { index , onClick } = this . props ;
if ( e . button === 0 ) {
e . preventDefault ( ) ;
this . props . onOpenMedia ( this . props . media , index ) ;
onClick ( index ) ;
}
e . stopPropagation ( ) ;
} ,
handleOpen ( ) {
this . setState ( { visible : ! this . state . visible } ) ;
} ,
render ( ) {
const { media, intl , sensitiv e } = this . props ;
const { attachment , index , size } = this . props ;
let children ;
if ( ! this . state . visible ) {
if ( sensitive ) {
children = (
< div style = { spoilerStyle } className = 'media-spoiler' onClick = { this . handleOpen } >
< span style = { spoilerSpanStyle } > < FormattedMessage id = 'status.sensitive_warning' defaultMessage = 'Sensitive content' / > < / span >
< span style = { spoilerSubSpanStyle } > < FormattedMessage id = 'status.sensitive_toggle' defaultMessage = 'Click to view' / > < / span >
< / div >
) ;
} else {
children = (
< div style = { spoilerStyle } className = 'media-spoiler' onClick = { this . handleOpen } >
< span style = { spoilerSpanStyle } > < FormattedMessage id = 'status.media_hidden' defaultMessage = 'Media hidden' / > < / span >
< span style = { spoilerSubSpanStyle } > < FormattedMessage id = 'status.sensitive_toggle' defaultMessage = 'Click to view' / > < / span >
< / div >
) ;
}
} else {
const size = media . take ( 4 ) . size ;
children = media . take ( 4 ) . map ( ( attachment , i ) => {
let width = 50 ;
let height = 100 ;
let top = 'auto' ;
@ -110,57 +107,134 @@ const MediaGallery = React.createClass({
width = 100 ;
}
if ( size === 4 || ( size === 3 && i > 0 ) ) {
if ( size === 4 || ( size === 3 && i ndex > 0 ) ) {
height = 50 ;
}
if ( size === 2 ) {
if ( i === 0 ) {
if ( i ndex === 0 ) {
right = '2px' ;
} else {
left = '2px' ;
}
} else if ( size === 3 ) {
if ( i === 0 ) {
if ( i ndex === 0 ) {
right = '2px' ;
} else if ( i > 0 ) {
} else if ( i ndex > 0 ) {
left = '2px' ;
}
if ( i === 1 ) {
if ( i ndex === 1 ) {
bottom = '2px' ;
} else if ( i > 1 ) {
} else if ( i ndex > 1 ) {
top = '2px' ;
}
} else if ( size === 4 ) {
if ( i === 0 || i === 2 ) {
if ( i ndex === 0 || i ndex === 2 ) {
right = '2px' ;
}
if ( i === 1 || i === 3 ) {
if ( i ndex === 1 || i ndex === 3 ) {
left = '2px' ;
}
if ( i < 2 ) {
if ( i ndex < 2 ) {
bottom = '2px' ;
} else {
top = '2px' ;
}
}
let thumbnail = '' ;
if ( attachment . get ( 'type' ) === 'image' ) {
thumbnail = (
< a
href = { attachment . get ( 'remote_url' ) ? attachment . get ( 'remote_url' ) : attachment . get ( 'url' ) }
onClick = { this . handleClick }
target = '_blank'
style = { { background : ` url( ${ attachment . get ( 'preview_url' ) } ) no-repeat center ` , ... thumbStyle } }
/ >
) ;
} else if ( attachment . get ( 'type' ) === 'gifv' ) {
thumbnail = (
< video
src = { attachment . get ( 'url' ) }
onClick = { this . handleClick }
autoPlay = { true }
loop = { true }
muted = { true }
style = { gifvThumbStyle }
/ >
) ;
}
return (
< div key = { attachment . get ( 'id' ) } style = { { boxSizing : 'border-box' , position : 'relative' , left : left , top : top , right : right , bottom : bottom , float : 'left' , border : 'none' , display : 'block' , width : ` ${ width } % ` , height : ` ${ height } % ` } } >
< a href = { attachment . get ( 'remote_url' ) ? attachment . get ( 'remote_url' ) : attachment . get ( 'url' ) } onClick = { this . handleClick . bind ( this , i ) } target = '_blank' style = { { display : 'block' , width : '100%' , height : '100%' , background : ` url( ${ attachment . get ( 'preview_url' ) } ) no-repeat center ` , textDecoration : 'none' , backgroundSize : 'cover' , cursor : 'zoom-in' } } / >
< div key = { attachment . get ( 'id' ) } style = { { ... itemStyle , left : left , top : top , right : right , bottom : bottom , width : ` ${ width } % ` , height : ` ${ height } % ` } } >
{ thumbnail}
< / div >
) ;
} ) ;
}
} ) ;
const MediaGallery = React . createClass ( {
getInitialState ( ) {
return {
visible : ! this . props . sensitive
} ;
} ,
propTypes : {
sensitive : React . PropTypes . bool ,
media : ImmutablePropTypes . list . isRequired ,
height : React . PropTypes . number . isRequired ,
onOpenMedia : React . PropTypes . func . isRequired ,
intl : React . PropTypes . object . isRequired
} ,
mixins : [ PureRenderMixin ] ,
handleOpen ( e ) {
this . setState ( { visible : ! this . state . visible } ) ;
} ,
handleClick ( index ) {
this . props . onOpenMedia ( this . props . media , index ) ;
} ,
render ( ) {
const { media , intl , sensitive } = this . props ;
let children ;
if ( ! this . state . 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 = (
< div style = { spoilerStyle } className = 'media-spoiler' onClick = { this . handleOpen } >
< span style = { spoilerSpanStyle } > { warning } < / span >
< span style = { spoilerSubSpanStyle } > < FormattedMessage id = 'status.sensitive_toggle' defaultMessage = 'Click to view' / > < / span >
< / div >
) ;
} else {
const size = media . take ( 4 ) . size ;
children = media . take ( 4 ) . map ( ( attachment , i ) => < Item key = { attachment . get ( 'id' ) } onClick = { this . handleClick } attachment = { attachment } index = { i } size = { size } / > ) ;
}
return (
< div style = { { ... outerStyle , height : ` ${ this . props . height } px ` } } >
< div style = { spoilerButtonStyle } >
< div style = { spoilerButtonStyle } >
< IconButton title = { intl . formatMessage ( messages . toggle _visible ) } icon = { this . state . visible ? 'eye' : 'eye-slash' } onClick = { this . handleOpen } / >
< / div >
{ children }
< / div >
) ;