2020-03-27 13:59:38 -07:00
import React from 'react' ;
import ImmutablePropTypes from 'react-immutable-proptypes' ;
import PropTypes from 'prop-types' ;
import { defineMessages , injectIntl , FormattedMessage } from 'react-intl' ;
import Button from '../../../components/button' ;
import StatusContent from '../../../components/status_content' ;
import Avatar from '../../../components/avatar' ;
import RelativeTimestamp from '../../../components/relative_timestamp' ;
import DisplayName from '../../../components/display_name' ;
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2020-05-28 15:52:07 -07:00
import Icon from 'soapbox/components/icon' ;
2021-08-02 06:30:01 -07:00
import AttachmentList from 'soapbox/components/attachment_list' ;
2020-03-27 13:59:38 -07:00
const messages = defineMessages ( {
cancel _reblog : { id : 'status.cancel_reblog_private' , defaultMessage : 'Un-repost' } ,
reblog : { id : 'status.reblog' , defaultMessage : 'Repost' } ,
} ) ;
export default @ injectIntl
class BoostModal extends ImmutablePureComponent {
static contextTypes = {
router : PropTypes . object ,
} ;
static propTypes = {
status : ImmutablePropTypes . map . isRequired ,
onReblog : PropTypes . func . isRequired ,
onClose : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
} ;
componentDidMount ( ) {
this . button . focus ( ) ;
}
handleReblog = ( ) => {
this . props . onReblog ( this . props . status ) ;
this . props . onClose ( ) ;
}
handleAccountClick = ( e ) => {
if ( e . button === 0 && ! ( e . ctrlKey || e . metaKey ) ) {
e . preventDefault ( ) ;
this . props . onClose ( ) ;
this . context . router . history . push ( ` /@ ${ this . props . status . getIn ( [ 'account' , 'acct' ] ) } ` ) ;
}
}
handleStatusClick = ( e ) => {
if ( e . button === 0 && ! ( e . ctrlKey || e . metaKey ) ) {
e . preventDefault ( ) ;
this . props . onClose ( ) ;
this . context . router . history . push ( ` /@ ${ this . props . status . getIn ( [ 'account' , 'acct' ] ) } /posts/ ${ this . props . status . get ( 'url' ) } ` ) ;
}
}
setRef = ( c ) => {
this . button = c ;
}
2020-04-14 14:47:35 -07:00
render ( ) {
2020-03-27 13:59:38 -07:00
const { status , intl } = this . props ;
const buttonText = status . get ( 'reblogged' ) ? messages . cancel _reblog : messages . reblog ;
const statusUrl = ` /@ ${ status . getIn ( [ 'account' , 'acct' ] ) } /posts/ ${ status . get ( 'url' ) } ` ;
return (
< div className = 'modal-root__modal boost-modal' >
< div className = 'boost-modal__container' >
< div className = 'status light' >
< div className = 'boost-modal__status-header' >
< div className = 'boost-modal__status-time' >
< a onClick = { this . handleStatusClick } href = { statusUrl } className = 'status__relative-time' >
< RelativeTimestamp timestamp = { status . get ( 'created_at' ) } / >
< / a >
< / d i v >
< a onClick = { this . handleAccountClick } href = { ` /@ ${ status . getIn ( [ 'account' , 'acct' ] ) } ` } className = 'status__display-name' >
< div className = 'status__avatar' >
< Avatar account = { status . get ( 'account' ) } size = { 48 } / >
< / d i v >
< DisplayName account = { status . get ( 'account' ) } / >
< / a >
< / d i v >
< StatusContent status = { status } / >
2021-08-02 06:30:01 -07:00
{ status . get ( 'media_attachments' ) . size > 0 && (
< AttachmentList
compact
media = { status . get ( 'media_attachments' ) }
/ >
) }
2020-03-27 13:59:38 -07:00
< / d i v >
< / d i v >
< div className = 'boost-modal__action-bar' >
< div > < FormattedMessage id = 'boost_modal.combo' defaultMessage = 'You can press {combo} to skip this next time' values = { { combo : < span > Shift + < Icon id = 'retweet' / > < /span> }} / > < / d i v >
< Button text = { intl . formatMessage ( buttonText ) } onClick = { this . handleReblog } ref = { this . setRef } / >
< / d i v >
< / d i v >
) ;
}
}