2017-04-22 03:05:35 +09:00
import PropTypes from 'prop-types' ;
2023-05-24 00:15:17 +09:00
2017-04-12 04:24:17 +09:00
import { defineMessages , injectIntl , FormattedMessage } from 'react-intl' ;
2023-05-24 00:15:17 +09:00
import classNames from 'classnames' ;
2023-10-20 02:44:55 +09:00
import { withRouter } from 'react-router-dom' ;
2023-05-24 00:15:17 +09:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2017-05-03 09:04:16 +09:00
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2023-05-24 00:15:17 +09:00
import { connect } from 'react-redux' ;
2024-01-12 19:31:24 +09:00
import RepeatIcon from '@material-symbols/svg-600/outlined/repeat.svg?react' ;
2023-10-25 02:45:08 +09:00
2023-05-24 00:15:17 +09:00
import { changeBoostPrivacy } from 'mastodon/actions/boosts' ;
2019-06-14 00:04:52 +09:00
import AttachmentList from 'mastodon/components/attachment_list' ;
2023-05-24 00:15:17 +09:00
import { Icon } from 'mastodon/components/icon' ;
2023-10-25 02:45:08 +09:00
import { VisibilityIcon } from 'mastodon/components/visibility_icon' ;
2021-02-11 08:53:12 +09:00
import PrivacyDropdown from 'mastodon/features/compose/components/privacy_dropdown' ;
2023-10-20 02:44:55 +09:00
import { WithRouterPropTypes } from 'mastodon/utils/react_router' ;
2023-05-24 00:15:17 +09:00
import { Avatar } from '../../../components/avatar' ;
2023-10-23 16:43:00 +09:00
import { Button } from '../../../components/button' ;
2023-05-24 00:15:17 +09:00
import { DisplayName } from '../../../components/display_name' ;
import { RelativeTimestamp } from '../../../components/relative_timestamp' ;
import StatusContent from '../../../components/status_content' ;
2017-04-11 11:28:52 +09:00
const messages = defineMessages ( {
2019-05-10 05:39:27 +09:00
cancel _reblog : { id : 'status.cancel_reblog_private' , defaultMessage : 'Unboost' } ,
2017-05-21 00:31:47 +09:00
reblog : { id : 'status.reblog' , defaultMessage : 'Boost' } ,
2017-04-11 11:28:52 +09:00
} ) ;
2021-02-11 08:53:12 +09:00
const mapStateToProps = state => {
return {
privacy : state . getIn ( [ 'boosts' , 'new' , 'privacy' ] ) ,
} ;
} ;
const mapDispatchToProps = dispatch => {
return {
onChangeBoostPrivacy ( value ) {
dispatch ( changeBoostPrivacy ( value ) ) ;
} ,
} ;
} ;
2018-09-15 00:59:48 +09:00
class BoostModal extends ImmutablePureComponent {
2017-05-12 21:44:10 +09:00
static propTypes = {
status : ImmutablePropTypes . map . isRequired ,
onReblog : PropTypes . func . isRequired ,
onClose : PropTypes . func . isRequired ,
2021-02-11 08:53:12 +09:00
onChangeBoostPrivacy : PropTypes . func . isRequired ,
privacy : PropTypes . string . isRequired ,
2017-05-21 00:31:47 +09:00
intl : PropTypes . object . isRequired ,
2023-10-20 02:44:55 +09:00
... WithRouterPropTypes ,
2017-05-12 21:44:10 +09:00
} ;
handleReblog = ( ) => {
2021-02-11 08:53:12 +09:00
this . props . onReblog ( this . props . status , this . props . privacy ) ;
2017-04-11 11:28:52 +09:00
this . props . onClose ( ) ;
2023-01-30 09:45:35 +09:00
} ;
2017-04-11 11:28:52 +09:00
2017-05-12 21:44:10 +09:00
handleAccountClick = ( e ) => {
2018-08-18 19:50:32 +09:00
if ( e . button === 0 && ! ( e . ctrlKey || e . metaKey ) ) {
2017-04-12 04:24:17 +09:00
e . preventDefault ( ) ;
this . props . onClose ( ) ;
2023-10-20 02:44:55 +09:00
this . props . history . push ( ` /@ ${ this . props . status . getIn ( [ 'account' , 'acct' ] ) } ` ) ;
2017-04-12 04:24:17 +09:00
}
2023-01-30 09:45:35 +09:00
} ;
2017-04-11 11:28:52 +09:00
2021-02-11 08:53:12 +09:00
_findContainer = ( ) => {
return document . getElementsByClassName ( 'modal-root__container' ) [ 0 ] ;
} ;
2017-04-11 11:28:52 +09:00
render ( ) {
2021-02-11 08:53:12 +09:00
const { status , privacy , intl } = this . props ;
2019-05-10 05:39:27 +09:00
const buttonText = status . get ( 'reblogged' ) ? messages . cancel _reblog : messages . reblog ;
2017-04-11 11:28:52 +09:00
return (
< div className = 'modal-root__modal boost-modal' >
2017-04-12 04:24:17 +09:00
< div className = 'boost-modal__container' >
2020-07-12 22:22:48 +09:00
< div className = { classNames ( 'status' , ` status- ${ status . get ( 'visibility' ) } ` , 'light' ) } >
2022-10-26 02:02:21 +09:00
< div className = 'status__info' >
2023-02-13 23:12:14 +09:00
< a href = { ` /@ ${ status . getIn ( [ 'account' , 'acct' ] ) } / ${ status . get ( 'id' ) } ` } className = 'status__relative-time' target = '_blank' rel = 'noopener noreferrer' >
2023-10-25 02:45:08 +09:00
< span className = 'status__visibility-icon' > < VisibilityIcon visibility = { status . get ( 'visibility' ) } / > < / span >
2022-10-26 02:02:21 +09:00
< RelativeTimestamp timestamp = { status . get ( 'created_at' ) } / >
< / a >
2017-04-12 04:24:17 +09:00
2022-11-14 05:10:20 +09:00
< a onClick = { this . handleAccountClick } href = { ` /@ ${ status . getIn ( [ 'account' , 'acct' ] ) } ` } className = 'status__display-name' >
2017-04-23 11:26:55 +09:00
< div className = 'status__avatar' >
2017-08-08 02:44:55 +09:00
< Avatar account = { status . get ( 'account' ) } size = { 48 } / >
2017-04-12 04:24:17 +09:00
< / div >
< DisplayName account = { status . get ( 'account' ) } / >
< / a >
< / div >
< StatusContent status = { status } / >
2019-06-14 00:04:52 +09:00
{ status . get ( 'media_attachments' ) . size > 0 && (
< AttachmentList
compact
media = { status . get ( 'media_attachments' ) }
/ >
) }
2017-04-12 04:24:17 +09:00
< / div >
2017-04-11 11:28:52 +09:00
< / div >
2017-04-12 04:24:17 +09:00
< div className = 'boost-modal__action-bar' >
2023-10-25 02:45:08 +09:00
< div > < FormattedMessage id = 'boost_modal.combo' defaultMessage = 'You can press {combo} to skip this next time' values = { { combo : < span > Shift + < Icon id = 'retweet' icon = { RepeatIcon } / > < / span > } } / > < / div >
2021-02-11 08:53:12 +09:00
{ status . get ( 'visibility' ) !== 'private' && ! status . get ( 'reblogged' ) && (
< PrivacyDropdown
noDirect
value = { privacy }
container = { this . _findContainer }
onChange = { this . props . onChangeBoostPrivacy }
/ >
) }
2023-10-23 16:43:00 +09:00
< Button text = { intl . formatMessage ( buttonText ) } onClick = { this . handleReblog } autoFocus / >
2017-04-11 11:28:52 +09:00
< / div >
< / div >
) ;
}
2017-04-22 03:05:35 +09:00
}
2023-03-24 11:17:53 +09:00
2023-10-20 02:44:55 +09:00
export default withRouter ( connect ( mapStateToProps , mapDispatchToProps ) ( injectIntl ( BoostModal ) ) ) ;