2020-03-24 04:39:12 +00:00
import { defineMessages , injectIntl } from 'react-intl'
import { OrderedSet } from 'immutable'
import ImmutablePropTypes from 'react-immutable-proptypes'
import ImmutablePureComponent from 'react-immutable-pure-component'
import { changeReportComment , changeReportForward , submitReport } from '../../actions/reports'
import { expandAccountTimeline } from '../../actions/timelines'
import { makeGetAccount } from '../../selectors'
import ModalLayout from './modal_layout'
import Button from '../button'
import StatusCheckBox from '../status_check_box'
import Switch from '../switch'
2020-03-27 23:23:27 +00:00
import Text from '../text'
import Textarea from '../textarea'
2019-07-02 08:10:25 +01:00
const messages = defineMessages ( {
close : { id : 'lightbox.close' , defaultMessage : 'Close' } ,
placeholder : { id : 'report.placeholder' , defaultMessage : 'Additional comments' } ,
submit : { id : 'report.submit' , defaultMessage : 'Submit' } ,
2019-08-13 16:54:29 +01:00
hint : { id : 'report.hint' , defaultMessage : 'The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' } ,
forwardHint : { id : 'report.forward_hint' , defaultMessage : 'The account is from another server. Send an anonymized copy of the report there as well?' } ,
forward : { id : 'report.forward' , defaultMessage : 'Forward to {target}' } ,
target : { id : 'report.target' , defaultMessage : 'Report {target}' } ,
2020-04-07 02:53:23 +01:00
} )
2019-07-02 08:10:25 +01:00
const makeMapStateToProps = ( ) => {
2020-04-07 02:53:23 +01:00
const getAccount = makeGetAccount ( )
2019-07-02 08:10:25 +01:00
2020-04-11 23:29:19 +01:00
const mapStateToProps = ( state ) => {
2020-04-07 02:53:23 +01:00
const accountId = state . getIn ( [ 'reports' , 'new' , 'account_id' ] )
2019-07-02 08:10:25 +01:00
return {
isSubmitting : state . getIn ( [ 'reports' , 'new' , 'isSubmitting' ] ) ,
account : getAccount ( state , accountId ) ,
comment : state . getIn ( [ 'reports' , 'new' , 'comment' ] ) ,
forward : state . getIn ( [ 'reports' , 'new' , 'forward' ] ) ,
statusIds : OrderedSet ( state . getIn ( [ 'timelines' , ` account: ${ accountId } :with_replies ` , 'items' ] ) ) . union ( state . getIn ( [ 'reports' , 'new' , 'status_ids' ] ) ) ,
2020-04-07 02:53:23 +01:00
}
}
2019-07-02 08:10:25 +01:00
2020-04-07 02:53:23 +01:00
return mapStateToProps
}
2019-07-02 08:10:25 +01:00
2020-02-25 16:04:44 +00:00
export default
@ connect ( makeMapStateToProps )
2019-07-02 08:10:25 +01:00
@ injectIntl
class ReportModal extends ImmutablePureComponent {
static propTypes = {
isSubmitting : PropTypes . bool ,
account : ImmutablePropTypes . map ,
statusIds : ImmutablePropTypes . orderedSet . isRequired ,
comment : PropTypes . string . isRequired ,
forward : PropTypes . bool ,
dispatch : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
2020-04-07 02:53:23 +01:00
onClose : PropTypes . func . isRequired ,
}
2019-07-02 08:10:25 +01:00
2020-05-02 07:25:55 +01:00
handleCommentChange = ( e ) => {
this . props . dispatch ( changeReportComment ( value ) )
2019-07-02 08:10:25 +01:00
}
handleForwardChange = e => {
2020-04-07 02:53:23 +01:00
this . props . dispatch ( changeReportForward ( e . target . checked ) )
2019-07-02 08:10:25 +01:00
}
handleSubmit = ( ) => {
2020-04-07 02:53:23 +01:00
this . props . dispatch ( submitReport ( ) )
2019-07-02 08:10:25 +01:00
}
handleKeyDown = e => {
if ( e . keyCode === 13 && ( e . ctrlKey || e . metaKey ) ) {
2020-04-07 02:53:23 +01:00
this . handleSubmit ( )
2019-07-02 08:10:25 +01:00
}
}
componentDidMount ( ) {
2020-04-07 02:53:23 +01:00
this . props . dispatch ( expandAccountTimeline ( this . props . account . get ( 'id' ) , { withReplies : true } ) )
2019-07-02 08:10:25 +01:00
}
componentWillReceiveProps ( nextProps ) {
if ( this . props . account !== nextProps . account && nextProps . account ) {
2020-04-07 02:53:23 +01:00
this . props . dispatch ( expandAccountTimeline ( nextProps . account . get ( 'id' ) , { withReplies : true } ) )
2019-07-02 08:10:25 +01:00
}
}
render ( ) {
2020-03-24 04:39:12 +00:00
const {
account ,
comment ,
intl ,
statusIds ,
isSubmitting ,
forward ,
onClose
} = this . props
if ( ! account ) return null
2019-07-02 08:10:25 +01:00
2020-04-07 02:53:23 +01:00
const domain = account . get ( 'acct' ) . split ( '@' ) [ 1 ]
2019-07-02 08:10:25 +01:00
return (
2020-03-24 04:39:12 +00:00
< ModalLayout
noPadding
title = { intl . formatMessage ( messages . target , {
target : account . get ( 'acct' )
} ) }
2020-04-07 02:53:23 +01:00
onClose = { onClose }
2020-03-24 04:39:12 +00:00
>
< div className = { [ _s . default , _s . flexRow ] . join ( ' ' ) } >
< div className = { [ _s . default , _s . width50PC , _s . py10 , _s . px15 , _s . borderRight1PX , _s . borderColorSecondary ] . join ( ' ' ) } >
< Text color = 'secondary' size = 'small' >
{ intl . formatMessage ( messages . hint ) }
< / T e x t >
< div className = { _s . my10 } >
< Textarea
placeholder = { intl . formatMessage ( messages . placeholder ) }
value = { comment }
onChange = { this . handleCommentChange }
onKeyDown = { this . handleKeyDown }
disabled = { isSubmitting }
autoFocus
/ >
< / d i v >
2019-07-02 08:10:25 +01:00
2020-04-11 23:29:19 +01:00
{ /** : todo : */
2020-03-24 04:39:12 +00:00
domain &&
2019-07-02 08:10:25 +01:00
< div >
2020-03-24 04:39:12 +00:00
< Text color = 'secondary' size = 'small' >
{ intl . formatMessage ( messages . forwardHint ) }
< / T e x t >
2019-07-02 08:10:25 +01:00
2020-04-11 23:29:19 +01:00
< div >
2020-03-24 04:39:12 +00:00
< Switch
id = 'report-forward'
checked = { forward }
disabled = { isSubmitting }
onChange = { this . handleForwardChange }
label = { intl . formatMessage ( messages . forward , {
target : domain ,
2019-08-13 16:54:29 +01:00
} ) }
2020-03-24 04:39:12 +00:00
labelProps = { {
size : 'small' ,
color : 'secondary' ,
} }
/ >
2019-07-02 08:10:25 +01:00
< / d i v >
< / d i v >
2020-03-24 04:39:12 +00:00
}
< Button
2020-04-23 07:13:29 +01:00
isDisabled = { isSubmitting }
2020-03-24 04:39:12 +00:00
onClick = { this . handleSubmit }
2020-04-23 07:13:29 +01:00
className = { _s . mtAuto }
2020-03-24 04:39:12 +00:00
>
{ intl . formatMessage ( messages . submit ) }
< / B u t t o n >
2019-07-02 08:10:25 +01:00
< / d i v >
2020-03-24 04:39:12 +00:00
< div className = { [ _s . default , _s . width50PC ] . join ( ' ' ) } >
< div className = { [ _s . default , _s . heightMax80VH , _s . overflowYScroll , _s . pr15 , _s . py10 ] . join ( ' ' ) } >
{
statusIds . map ( statusId => (
< StatusCheckBox id = { statusId } key = { statusId } disabled = { isSubmitting } / >
) )
}
2019-07-02 08:10:25 +01:00
< / d i v >
< / d i v >
< / d i v >
2020-03-24 04:39:12 +00:00
< / M o d a l L a y o u t >
2020-04-07 02:53:23 +01:00
)
2019-07-02 08:10:25 +01:00
}
}