2017-05-03 00:04:16 +00:00
import React from 'react' ;
2021-02-10 23:53:12 +00:00
import { connect } from 'react-redux' ;
2017-04-11 02:28:52 +00:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2017-04-21 18:05:35 +00:00
import PropTypes from 'prop-types' ;
2017-04-11 19:24:17 +00:00
import { defineMessages , injectIntl , FormattedMessage } from 'react-intl' ;
2017-12-04 07:26:40 +00:00
import Button from 'flavours/glitch/components/button' ;
import StatusContent from 'flavours/glitch/components/status_content' ;
import Avatar from 'flavours/glitch/components/avatar' ;
import RelativeTimestamp from 'flavours/glitch/components/relative_timestamp' ;
import DisplayName from 'flavours/glitch/components/display_name' ;
2019-06-13 15:04:52 +00:00
import AttachmentList from 'flavours/glitch/components/attachment_list' ;
2019-09-09 14:41:41 +00:00
import Icon from 'flavours/glitch/components/icon' ;
2017-05-03 00:04:16 +00:00
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2021-02-10 23:53:12 +00:00
import PrivacyDropdown from 'flavours/glitch/features/compose/components/privacy_dropdown' ;
2020-07-12 13:22:48 +00:00
import classNames from 'classnames' ;
2021-02-10 23:53:12 +00:00
import { changeBoostPrivacy } from 'flavours/glitch/actions/boosts' ;
2017-04-11 02:28:52 +00:00
const messages = defineMessages ( {
2019-05-09 20:39:27 +00:00
cancel _reblog : { id : 'status.cancel_reblog_private' , defaultMessage : 'Unboost' } ,
2017-05-20 15:31:47 +00:00
reblog : { id : 'status.reblog' , defaultMessage : 'Boost' } ,
2020-07-12 13:22:48 +00:00
public _short : { id : 'privacy.public.short' , defaultMessage : 'Public' } ,
unlisted _short : { id : 'privacy.unlisted.short' , defaultMessage : 'Unlisted' } ,
private _short : { id : 'privacy.private.short' , defaultMessage : 'Followers-only' } ,
direct _short : { id : 'privacy.direct.short' , defaultMessage : 'Direct' } ,
2017-04-11 02:28:52 +00:00
} ) ;
2021-02-10 23:53:12 +00:00
const mapStateToProps = state => {
return {
privacy : state . getIn ( [ 'boosts' , 'new' , 'privacy' ] ) ,
} ;
} ;
const mapDispatchToProps = dispatch => {
return {
onChangeBoostPrivacy ( value ) {
dispatch ( changeBoostPrivacy ( value ) ) ;
} ,
} ;
} ;
export default @ connect ( mapStateToProps , mapDispatchToProps )
@ injectIntl
2019-09-09 13:16:08 +00:00
class BoostModal extends ImmutablePureComponent {
2017-04-11 02:28:52 +00:00
2017-05-12 12:44:10 +00:00
static contextTypes = {
2017-05-20 15:31:47 +00:00
router : PropTypes . object ,
2017-05-12 12:44:10 +00:00
} ;
static propTypes = {
status : ImmutablePropTypes . map . isRequired ,
onReblog : PropTypes . func . isRequired ,
onClose : PropTypes . func . isRequired ,
2019-06-07 16:38:07 +00:00
missingMediaDescription : PropTypes . bool ,
2017-05-20 15:31:47 +00:00
intl : PropTypes . object . isRequired ,
2017-05-12 12:44:10 +00:00
} ;
2017-06-01 02:20:10 +00:00
componentDidMount ( ) {
this . button . focus ( ) ;
}
2017-05-12 12:44:10 +00:00
handleReblog = ( ) => {
2021-02-10 23:53:12 +00:00
this . props . onReblog ( this . props . status , this . props . privacy ) ;
2017-04-11 02:28:52 +00:00
this . props . onClose ( ) ;
2017-04-21 18:05:35 +00:00
}
2017-04-11 02:28:52 +00:00
2017-05-12 12:44:10 +00:00
handleAccountClick = ( e ) => {
2017-04-11 19:24:17 +00:00
if ( e . button === 0 ) {
e . preventDefault ( ) ;
this . props . onClose ( ) ;
2019-04-15 20:23:05 +00:00
let state = { ... this . context . router . history . location . state } ;
state . mastodonBackSteps = ( state . mastodonBackSteps || 0 ) + 1 ;
2021-09-26 03:46:13 +00:00
this . context . router . history . push ( ` /@ ${ this . props . status . getIn ( [ 'account' , 'acct' ] ) } ` , state ) ;
2017-04-11 19:24:17 +00:00
}
2017-04-21 18:05:35 +00:00
}
2017-04-11 02:28:52 +00:00
2021-02-10 23:53:12 +00:00
_findContainer = ( ) => {
return document . getElementsByClassName ( 'modal-root__container' ) [ 0 ] ;
} ;
2017-06-01 02:20:10 +00:00
setRef = ( c ) => {
this . button = c ;
}
2017-04-11 02:28:52 +00:00
render ( ) {
2021-02-10 23:53:12 +00:00
const { status , missingMediaDescription , privacy , intl } = this . props ;
2019-05-09 20:39:27 +00:00
const buttonText = status . get ( 'reblogged' ) ? messages . cancel _reblog : messages . reblog ;
2017-04-11 02:28:52 +00:00
2020-07-12 13:22:48 +00:00
const visibilityIconInfo = {
'public' : { icon : 'globe' , text : intl . formatMessage ( messages . public _short ) } ,
'unlisted' : { icon : 'unlock' , text : intl . formatMessage ( messages . unlisted _short ) } ,
'private' : { icon : 'lock' , text : intl . formatMessage ( messages . private _short ) } ,
'direct' : { icon : 'envelope' , text : intl . formatMessage ( messages . direct _short ) } ,
} ;
const visibilityIcon = visibilityIconInfo [ status . get ( 'visibility' ) ] ;
2017-04-11 02:28:52 +00:00
return (
< div className = 'modal-root__modal boost-modal' >
2017-04-11 19:24:17 +00:00
< div className = 'boost-modal__container' >
2020-07-12 13:22:48 +00:00
< div className = { classNames ( 'status' , ` status- ${ status . get ( 'visibility' ) } ` , 'light' ) } >
2017-04-23 02:26:55 +00:00
< div className = 'boost-modal__status-header' >
< div className = 'boost-modal__status-time' >
2020-10-27 02:00:47 +00:00
< a href = { status . get ( 'url' ) } className = 'status__relative-time' target = '_blank' rel = 'noopener noreferrer' >
< span className = 'status__visibility-icon' > < Icon id = { visibilityIcon . icon } title = { visibilityIcon . text } / > < / s p a n >
< RelativeTimestamp timestamp = { status . get ( 'created_at' ) } / > < / a >
2017-04-11 19:24:17 +00:00
< / d i v >
2017-04-23 02:26:55 +00:00
< a onClick = { this . handleAccountClick } href = { status . getIn ( [ 'account' , 'url' ] ) } className = 'status__display-name' >
< div className = 'status__avatar' >
2017-08-06 18:59:19 +00:00
< Avatar account = { status . get ( 'account' ) } size = { 48 } / >
2017-04-11 19:24:17 +00:00
< / d i v >
< DisplayName account = { status . get ( 'account' ) } / >
< / a >
< / d i v >
< StatusContent status = { status } / >
2019-06-13 15:04:52 +00:00
{ status . get ( 'media_attachments' ) . size > 0 && (
< AttachmentList
compact
media = { status . get ( 'media_attachments' ) }
/ >
) }
2017-04-11 19:24:17 +00:00
< / d i v >
2017-04-11 02:28:52 +00:00
< / d i v >
2017-04-11 19:24:17 +00:00
< div className = 'boost-modal__action-bar' >
2019-06-07 16:38:07 +00:00
< div >
{ missingMediaDescription ?
< FormattedMessage id = 'boost_modal.missing_description' defaultMessage = 'This toot contains some media without description' / >
:
2019-09-09 14:41:41 +00:00
< FormattedMessage id = 'boost_modal.combo' defaultMessage = 'You can press {combo} to skip this next time' values = { { combo : < span > Shift + < Icon id = 'retweet' / > < /span> }} / >
2019-06-07 16:38:07 +00:00
}
< / d i v >
2021-02-10 23:53:12 +00:00
{ status . get ( 'visibility' ) !== 'private' && ! status . get ( 'reblogged' ) && (
< PrivacyDropdown
noDirect
value = { privacy }
container = { this . _findContainer }
onChange = { this . props . onChangeBoostPrivacy }
/ >
) }
2019-05-09 20:39:27 +00:00
< Button text = { intl . formatMessage ( buttonText ) } onClick = { this . handleReblog } ref = { this . setRef } / >
2017-04-11 02:28:52 +00:00
< / d i v >
< / d i v >
) ;
}
2017-04-21 18:05:35 +00:00
}