2020-03-25 03:08:43 +00:00
import { defineMessages , injectIntl } from 'react-intl'
2020-03-14 17:31:29 +00:00
import {
followAccount ,
unfollowAccount ,
blockAccount ,
unblockAccount ,
unmuteAccount ,
pinAccount ,
unpinAccount ,
} from '../../actions/accounts'
import {
mentionCompose ,
} from '../../actions/compose'
2020-03-24 04:39:12 +00:00
import { muteAccount } from '../../actions/accounts'
2020-03-14 17:31:29 +00:00
import { initReport } from '../../actions/reports'
import { openModal } from '../../actions/modal'
import { blockDomain , unblockDomain } from '../../actions/domain_blocks'
import { unfollowModal , autoPlayGif , me , isStaff } from '../../initial_state'
import { makeGetAccount } from '../../selectors'
2020-02-28 15:20:47 +00:00
import PopoverLayout from './popover_layout'
import Text from '../text'
2020-03-14 17:31:29 +00:00
import List from '../list'
const messages = defineMessages ( {
unfollowConfirm : { id : 'confirmations.unfollow.confirm' , defaultMessage : 'Unfollow' } ,
2020-05-01 06:50:27 +01:00
blockDomainConfirm : { id : 'confirmations.domain_block.confirm' , defaultMessage : 'Block entire domain' } ,
2020-03-14 17:31:29 +00:00
blockAndReport : { id : 'confirmations.block.block_and_report' , defaultMessage : 'Block & Report' } ,
unfollow : { id : 'account.unfollow' , defaultMessage : 'Unfollow' } ,
follow : { id : 'account.follow' , defaultMessage : 'Follow' } ,
requested : { id : 'account.requested' , defaultMessage : 'Awaiting approval. Click to cancel follow request' } ,
unblock : { id : 'account.unblock' , defaultMessage : 'Unblock @{name}' } ,
edit _profile : { id : 'account.edit_profile' , defaultMessage : 'Edit profile' } ,
linkVerifiedOn : { id : 'account.link_verified_on' , defaultMessage : 'Ownership of this link was checked on {date}' } ,
account _locked : { id : 'account.locked_info' , defaultMessage : 'This account privacy status is set to locked. The owner manually reviews who can follow them.' } ,
mention : { id : 'account.mention' , defaultMessage : 'Mention' } ,
unmute : { id : 'account.unmute' , defaultMessage : 'Unmute @{name}' } ,
block : { id : 'account.block' , defaultMessage : 'Block @{name}' } ,
mute : { id : 'account.mute' , defaultMessage : 'Mute @{name}' } ,
report : { id : 'account.report' , defaultMessage : 'Report @{name}' } ,
share : { id : 'account.share' , defaultMessage : 'Share @{name}\'s profile' } ,
media : { id : 'account.media' , defaultMessage : 'Media' } ,
2020-05-01 06:50:27 +01:00
blockDomain : { id : 'account.block_domain' , defaultMessage : 'Block domain {domain}' } ,
unblockDomain : { id : 'account.unblock_domain' , defaultMessage : 'Unblock domain {domain}' } ,
2020-03-14 17:31:29 +00:00
hideReposts : { id : 'account.hide_reblogs' , defaultMessage : 'Hide reposts from @{name}' } ,
showReposts : { id : 'account.show_reblogs' , defaultMessage : 'Show reposts from @{name}' } ,
preferences : { id : 'navigation_bar.preferences' , defaultMessage : 'Preferences' } ,
blocks : { id : 'navigation_bar.blocks' , defaultMessage : 'Blocked users' } ,
2020-05-01 06:50:27 +01:00
domain _blocks : { id : 'navigation_bar.domain_blocks' , defaultMessage : 'Blocked domains' } ,
2020-03-14 17:31:29 +00:00
mutes : { id : 'navigation_bar.mutes' , defaultMessage : 'Muted users' } ,
2020-03-24 04:39:12 +00:00
admin _account : { id : 'admin_account' , defaultMessage : 'Open moderation interface' } ,
2020-03-14 17:31:29 +00:00
add _or _remove _from _list : { id : 'account.add_or_remove_from_list' , defaultMessage : 'Add or Remove from lists' } ,
2020-03-24 04:39:12 +00:00
add _or _remove _from _shortcuts : { id : 'account.add_or_remove_from_shortcuts' , defaultMessage : 'Add or Remove from shortcuts' } ,
2020-03-14 17:31:29 +00:00
accountBlocked : { id : 'account.blocked' , defaultMessage : 'Blocked' } ,
accountMuted : { id : 'account.muted' , defaultMessage : 'Muted' } ,
domainBlocked : { id : 'account.domain_blocked' , defaultMessage : 'Domain hidden' } ,
} ) ;
const makeMapStateToProps = ( ) => {
const getAccount = makeGetAccount ( ) ;
const mapStateToProps = ( state , { account } ) => ( {
account : getAccount ( state , ! ! account ? account . get ( 'id' ) : - 1 ) ,
domain : state . getIn ( [ 'meta' , 'domain' ] ) ,
} ) ;
return mapStateToProps ;
} ;
const mapDispatchToProps = ( dispatch , { intl } ) => ( {
2020-03-24 04:39:12 +00:00
onFollow ( account ) {
2020-03-14 17:31:29 +00:00
if ( account . getIn ( [ 'relationship' , 'following' ] ) || account . getIn ( [ 'relationship' , 'requested' ] ) ) {
if ( unfollowModal ) {
2020-03-24 04:39:12 +00:00
dispatch ( openModal ( 'UNFOLLOW' , {
accountId : account . get ( 'id' ) ,
} ) )
2020-03-14 17:31:29 +00:00
} else {
2020-03-24 04:39:12 +00:00
dispatch ( unfollowAccount ( account . get ( 'id' ) ) )
2020-03-14 17:31:29 +00:00
}
} else {
2020-03-24 04:39:12 +00:00
dispatch ( followAccount ( account . get ( 'id' ) ) )
2020-03-14 17:31:29 +00:00
}
} ,
2020-03-24 04:39:12 +00:00
onBlock ( account ) {
2020-03-14 17:31:29 +00:00
if ( account . getIn ( [ 'relationship' , 'blocking' ] ) ) {
dispatch ( unblockAccount ( account . get ( 'id' ) ) ) ;
} else {
2020-03-24 04:39:12 +00:00
dispatch ( openModal ( 'BLOCK_ACCOUNT' , {
accountId : account . get ( 'id' ) ,
2020-03-14 17:31:29 +00:00
} ) ) ;
}
} ,
2020-03-24 04:39:12 +00:00
onMention ( account ) {
dispatch ( mentionCompose ( account ) ) ;
2020-03-14 17:31:29 +00:00
} ,
2020-03-24 04:39:12 +00:00
onRepostToggle ( account ) {
2020-03-14 17:31:29 +00:00
if ( account . getIn ( [ 'relationship' , 'showing_reblogs' ] ) ) {
dispatch ( followAccount ( account . get ( 'id' ) , false ) ) ;
} else {
dispatch ( followAccount ( account . get ( 'id' ) , true ) ) ;
}
} ,
2020-03-24 04:39:12 +00:00
onReport ( account ) {
2020-03-14 17:31:29 +00:00
dispatch ( initReport ( account ) ) ;
} ,
2020-03-24 04:39:12 +00:00
onMute ( account ) {
2020-03-14 17:31:29 +00:00
if ( account . getIn ( [ 'relationship' , 'muting' ] ) ) {
dispatch ( unmuteAccount ( account . get ( 'id' ) ) ) ;
} else {
2020-03-24 04:39:12 +00:00
dispatch ( openModal ( 'MUTE' , {
accountId : account . get ( 'id' ) ,
} ) )
2020-03-14 17:31:29 +00:00
}
} ,
2020-03-24 04:39:12 +00:00
onBlockDomain ( domain ) {
dispatch ( openModal ( 'BLOCK_DOMAIN' , {
domain ,
2020-03-14 17:31:29 +00:00
} ) ) ;
} ,
2020-03-24 04:39:12 +00:00
onUnblockDomain ( domain ) {
2020-03-14 17:31:29 +00:00
dispatch ( unblockDomain ( domain ) ) ;
} ,
2020-03-24 04:39:12 +00:00
onAddToList ( account ) {
2020-03-14 17:31:29 +00:00
dispatch ( openModal ( 'LIST_ADDER' , {
accountId : account . get ( 'id' ) ,
} ) ) ;
} ,
} ) ;
export default
@ injectIntl
@ connect ( makeMapStateToProps , mapDispatchToProps )
class ProfileOptionsPopover extends PureComponent {
makeMenu ( ) {
const { account , intl , domain } = this . props ;
let menu = [ ] ;
2020-03-24 04:39:12 +00:00
if ( ! account ) return menu
if ( account . get ( 'id' ) === me ) return menu
2020-03-14 17:31:29 +00:00
if ( 'share' in navigator ) {
2020-03-24 04:39:12 +00:00
menu . push ( {
hideArrow : true ,
icon : 'share' ,
title : intl . formatMessage ( messages . share , { name : account . get ( 'username' ) } ) ,
onClick : this . handleShare
} ) ;
2020-03-14 17:31:29 +00:00
}
2020-03-24 04:39:12 +00:00
menu . push ( {
hideArrow : true ,
icon : 'comment' ,
title : intl . formatMessage ( messages . mention , { name : account . get ( 'acct' ) } ) ,
onClick : this . handleOnMention
} ) ;
if ( account . getIn ( [ 'relationship' , 'following' ] ) ) {
const showingReblogs = account . getIn ( [ 'relationship' , 'showing_reblogs' ] )
menu . push ( {
hideArrow : true ,
icon : 'repost' ,
title : intl . formatMessage ( showingReblogs ? messages . hideReposts : messages . showReposts , {
name : account . get ( 'username' )
} ) ,
onClick : this . handleRepostToggle ,
} )
2020-03-14 17:31:29 +00:00
}
2020-03-24 04:39:12 +00:00
const isMuting = account . getIn ( [ 'relationship' , 'muting' ] )
menu . push ( {
hideArrow : true ,
icon : 'audio-mute' ,
title : intl . formatMessage ( isMuting ? messages . unmute : messages . mute , {
name : account . get ( 'username' )
} ) ,
onClick : this . handleMute ,
} )
const isBlocking = account . getIn ( [ 'relationship' , 'blocking' ] )
menu . push ( {
hideArrow : true ,
icon : 'block' ,
title : intl . formatMessage ( isBlocking ? messages . unblock : messages . block , {
name : account . get ( 'username' )
} ) ,
onClick : this . handleBlock
} )
menu . push ( {
hideArrow : true ,
icon : 'report' ,
title : intl . formatMessage ( messages . report , { name : account . get ( 'username' ) } ) ,
onClick : this . handleReport
} )
2020-03-14 17:31:29 +00:00
if ( account . get ( 'acct' ) !== account . get ( 'username' ) ) {
const domain = account . get ( 'acct' ) . split ( '@' ) [ 1 ] ;
2020-03-24 04:39:12 +00:00
const isBlockingDomain = account . getIn ( [ 'relationship' , 'domain_blocking' ] )
menu . push ( {
hideArrow : true ,
icon : 'block' ,
title : intl . formatMessage ( isBlockingDomain ? messages . unblockDomain : messages . blockDomain , {
domain ,
} ) ,
2020-04-02 17:57:04 +01:00
onClick : isBlockingDomain ? this . handleUnblockDomain : this . handleBlockDomain ,
2020-03-24 04:39:12 +00:00
} )
2020-03-14 17:31:29 +00:00
}
2020-03-24 04:39:12 +00:00
menu . push ( {
hideArrow : true ,
icon : 'list' ,
title : intl . formatMessage ( messages . add _or _remove _from _list ) ,
onClick : this . handleAddToList
} )
menu . push ( {
hideArrow : true ,
icon : 'circle' ,
title : intl . formatMessage ( messages . add _or _remove _from _shortcuts ) ,
onClick : this . handleAddToShortcuts
} )
if ( isStaff ) {
menu . push ( {
hideArrow : true ,
icon : 'circle' ,
title : intl . formatMessage ( messages . admin _account ) ,
href : ` /admin/accounts/ ${ account . get ( 'id' ) } `
} )
2020-03-14 17:31:29 +00:00
}
2020-03-24 04:39:12 +00:00
return menu
2020-03-14 17:31:29 +00:00
}
2020-03-24 04:39:12 +00:00
handleShare = ( ) => {
// : todo :
}
handleFollow = ( ) => {
this . props . onFollow ( this . props . account ) ;
}
handleBlock = ( ) => {
this . props . onBlock ( this . props . account ) ;
}
handleOnMention = ( ) => {
this . props . onMention ( this . props . account ) ;
}
handleReport = ( ) => {
this . props . onReport ( this . props . account ) ;
}
handleRepostToggle = ( ) => {
this . props . onRepostToggle ( this . props . account ) ;
}
handleMute = ( ) => {
this . props . onMute ( this . props . account ) ;
}
handleBlockDomain = ( ) => {
2020-04-02 17:57:04 +01:00
const domain = this . props . account . get ( 'acct' ) . split ( '@' ) [ 1 ]
console . log ( "handleBlockDomain:" , domain )
2020-03-24 04:39:12 +00:00
// : todo : alert
2020-04-02 17:57:04 +01:00
if ( ! domain ) return
2020-03-24 04:39:12 +00:00
2020-04-02 17:57:04 +01:00
this . props . onBlockDomain ( domain )
2020-03-24 04:39:12 +00:00
}
handleUnblockDomain = ( ) => {
const domain = this . props . account . get ( 'acct' ) . split ( '@' ) [ 1 ] ;
// : todo : alert
if ( ! domain ) return ;
this . props . onUnblockDomain ( domain ) ;
}
handleAddToList = ( ) => {
this . props . onAddToList ( this . props . account ) ;
}
handleAddToShortcuts = ( ) => {
// : todo :
}
2020-02-28 15:20:47 +00:00
render ( ) {
2020-03-14 17:31:29 +00:00
const listItems = this . makeMenu ( )
2020-02-28 15:20:47 +00:00
return (
2020-03-24 04:39:12 +00:00
< PopoverLayout className = { _s . width250PX } >
2020-03-14 17:31:29 +00:00
< List
scrollKey = 'profile_options'
items = { listItems }
2020-04-07 02:53:23 +01:00
size = 'large'
2020-03-14 17:31:29 +00:00
/ >
2020-02-28 15:20:47 +00:00
< / P o p o v e r L a y o u t >
)
}
}