2020-08-17 21:07:16 +01:00
import React from 'react'
2020-08-17 21:59:29 +01:00
import PropTypes from 'prop-types'
2020-08-17 21:39:25 +01:00
import { connect } from 'react-redux'
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'
2020-06-16 02:41:46 +01:00
import { changeReportComment , submitReport } from '../../actions/reports'
2020-03-24 04:39:12 +00:00
import { expandAccountTimeline } from '../../actions/timelines'
import { makeGetAccount } from '../../selectors'
import ModalLayout from './modal_layout'
2020-06-16 02:41:46 +01:00
import ResponsiveClassesComponent from '../../features/ui/util/responsive_classes_component'
2020-03-24 04:39:12 +00:00
import Button from '../button'
import StatusCheckBox from '../status_check_box'
2020-03-27 23:23:27 +00:00
import Text from '../text'
import Textarea from '../textarea'
2019-07-02 08:10:25 +01:00
class ReportModal extends ImmutablePureComponent {
2020-06-16 02:41:46 +01:00
handleCommentChange = ( value ) => {
2020-05-02 07:25:55 +01:00
this . props . dispatch ( changeReportComment ( value ) )
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 ,
onClose
} = this . props
if ( ! account ) return null
2019-07-02 08:10:25 +01:00
return (
2020-03-24 04:39:12 +00:00
< ModalLayout
2020-12-20 17:27:24 +00:00
width = { 760 }
2020-03-24 04:39:12 +00:00
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
>
2020-06-16 02:41:46 +01:00
< ResponsiveClassesComponent
2020-08-18 21:49:11 +01:00
classNames = { [ _s . d , _s . flexRow ] . join ( ' ' ) }
classNamesSmall = { [ _s . d , _s . flexColumnReverse ] . join ( ' ' ) }
2020-06-16 02:41:46 +01:00
>
< ResponsiveClassesComponent
2020-12-20 17:27:24 +00:00
classNames = { [ _s . d , _s . maxW320PX , _s . py10 , _s . px15 , _s . borderRight1PX , _s . borderColorSecondary ] . join ( ' ' ) }
2020-08-18 21:49:11 +01:00
classNamesSmall = { [ _s . d , _s . w100PC , _s . py10 , _s . px15 , _s . borderTop1PX , _s . borderColorSecondary ] . join ( ' ' ) }
2020-06-16 02:41:46 +01:00
>
2020-03-24 04:39:12 +00:00
< 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 >
< 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 >
2020-06-16 02:41:46 +01:00
< / R e s p o n s i v e C l a s s e s C o m p o n e n t >
2019-07-02 08:10:25 +01:00
2020-06-16 02:41:46 +01:00
< ResponsiveClassesComponent
2020-12-20 17:27:24 +00:00
classNames = { [ _s . d , _s . flexNormal , _s . maxH80VH ] . join ( ' ' ) }
2020-08-18 21:49:11 +01:00
classNamesSmall = { [ _s . d , _s . w100PC , _s . h260PX ] . join ( ' ' ) }
2020-06-16 02:41:46 +01:00
>
2020-12-20 17:27:24 +00:00
< div className = { [ _s . d , _s . h100PC , _s . overflowYScroll ] . join ( ' ' ) } >
2020-03-24 04:39:12 +00:00
{
2020-12-20 17:27:24 +00:00
statusIds . map ( ( statusId ) => (
< StatusCheckBox id = { statusId } key = { ` reporting- ${ statusId } ` } disabled = { isSubmitting } / >
2020-03-24 04:39:12 +00:00
) )
}
2019-07-02 08:10:25 +01:00
< / d i v >
2020-06-16 02:41:46 +01:00
< / R e s p o n s i v e C l a s s e s C o m p o n e n t >
< / R e s p o n s i v e C l a s s e s C o m p o n e n t >
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
}
}
2020-08-18 18:07:47 +01:00
const messages = defineMessages ( {
close : { id : 'lightbox.close' , defaultMessage : 'Close' } ,
placeholder : { id : 'report.placeholder' , defaultMessage : 'Additional comments' } ,
submit : { id : 'report.submit' , defaultMessage : 'Submit' } ,
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:' } ,
target : { id : 'report.target' , defaultMessage : 'Report {target}' } ,
} )
const makeMapStateToProps = ( ) => {
const getAccount = makeGetAccount ( )
const mapStateToProps = ( state ) => {
const accountId = state . getIn ( [ 'reports' , 'new' , 'account_id' ] )
return {
isSubmitting : state . getIn ( [ 'reports' , 'new' , 'isSubmitting' ] ) ,
account : getAccount ( state , accountId ) ,
comment : state . getIn ( [ 'reports' , 'new' , 'comment' ] ) ,
statusIds : OrderedSet ( state . getIn ( [ 'timelines' , ` account: ${ accountId } :with_replies ` , 'items' ] ) ) . union ( state . getIn ( [ 'reports' , 'new' , 'status_ids' ] ) ) ,
}
}
return mapStateToProps
}
ReportModal . propTypes = {
isSubmitting : PropTypes . bool ,
account : ImmutablePropTypes . map ,
statusIds : ImmutablePropTypes . orderedSet . isRequired ,
comment : PropTypes . string . isRequired ,
dispatch : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
onClose : PropTypes . func . isRequired ,
}
export default injectIntl ( connect ( makeMapStateToProps ) ( ReportModal ) )