import React from 'react' ;
import ImmutablePropTypes from 'react-immutable-proptypes' ;
import PropTypes from 'prop-types' ;
import Avatar from './avatar' ;
import DisplayName from './display_name' ;
import Permalink from './permalink' ;
import IconButton from './icon_button' ;
import { defineMessages , injectIntl } from 'react-intl' ;
import ImmutablePureComponent from 'react-immutable-pure-component' ;
const messages = defineMessages ( {
follow : { id : 'account.follow' , defaultMessage : 'Follow' } ,
unfollow : { id : 'account.unfollow' , defaultMessage : 'Unfollow' } ,
requested : { id : 'account.requested' , defaultMessage : 'Awaiting approval' } ,
unblock : { id : 'account.unblock' , defaultMessage : 'Unblock @{name}' } ,
unmute : { id : 'account.unmute' , defaultMessage : 'Unmute @{name}' } ,
mute _notifications : { id : 'account.mute_notifications' , defaultMessage : 'You are not currently muting notifications from @{name}. Click to mute notifications' } ,
unmute _notifications : { id : 'account.unmute_notifications' , defaultMessage : 'You are currently muting notifications from @{name}. Click to unmute notifications' } ,
} ) ;
@ injectIntl
export default class Account extends ImmutablePureComponent {
static propTypes = {
account : ImmutablePropTypes . map . isRequired ,
me : PropTypes . number . isRequired ,
onFollow : PropTypes . func . isRequired ,
onBlock : PropTypes . func . isRequired ,
onMute : PropTypes . func . isRequired ,
intl : PropTypes . object . isRequired ,
hidden : PropTypes . bool ,
} ;
handleFollow = ( ) => {
this . props . onFollow ( this . props . account ) ;
}
handleBlock = ( ) => {
this . props . onBlock ( this . props . account ) ;
}
handleMute = ( ) => {
this . props . onMute ( this . props . account ) ;
}
handleMuteNotifications = ( ) => {
this . props . onMuteNotifications ( this . props . account , true ) ;
}
handleUnmuteNotifications = ( ) => {
this . props . onMuteNotifications ( this . props . account , false ) ;
}
render ( ) {
const { account , me , intl , hidden } = this . props ;
if ( ! account ) {
return < div / > ;
}
if ( hidden ) {
return (
< div >
{ account . get ( 'display_name' ) }
{ account . get ( 'username' ) }
< / d i v >
) ;
}
let buttons ;
if ( account . get ( 'id' ) !== me && account . get ( 'relationship' , null ) !== null ) {
const following = account . getIn ( [ 'relationship' , 'following' ] ) ;
const requested = account . getIn ( [ 'relationship' , 'requested' ] ) ;
const blocking = account . getIn ( [ 'relationship' , 'blocking' ] ) ;
const muting = account . getIn ( [ 'relationship' , 'muting' ] ) ;
if ( requested ) {
buttons = < IconButton disabled icon = 'hourglass' title = { intl . formatMessage ( messages . requested ) } / > ;
} else if ( blocking ) {
buttons = < IconButton active icon = 'unlock-alt' title = { intl . formatMessage ( messages . unblock , { name : account . get ( 'username' ) } ) } onClick = { this . handleBlock } / > ;
} else if ( muting ) {
let hidingNotificationsButton ;
if ( muting . get ( 'notifications' ) ) {
hidingNotificationsButton = < IconButton active icon = 'bell' title = { intl . formatMessage ( messages . unmute _notifications , { name : account . get ( 'username' ) } ) } onClick = { this . handleUnmuteNotifications } / > ;
} else {
hidingNotificationsButton = < IconButton active icon = 'bell-slash' title = { intl . formatMessage ( messages . mute _notifications , { name : account . get ( 'username' ) } ) } onClick = { this . handleMuteNotifications } / > ;
}
buttons = (
< div >
< IconButton active icon = 'volume-up' title = { intl . formatMessage ( messages . unmute , { name : account . get ( 'username' ) } ) } onClick = { this . handleMute } / >
{ hidingNotificationsButton }
< / d i v >
) ;
} else {
buttons = < IconButton icon = { following ? 'user-times' : 'user-plus' } title = { intl . formatMessage ( following ? messages . unfollow : messages . follow ) } onClick = { this . handleFollow } active = { following } / > ;
}
}
return (
< div className = 'account' >
< div className = 'account__wrapper' >
< Permalink key = { account . get ( 'id' ) } className = 'account__display-name' href = { account . get ( 'url' ) } to = { ` /accounts/ ${ account . get ( 'id' ) } ` } >
< div className = 'account__avatar-wrapper' > < Avatar account = { account } size = { 36 } / > < / d i v >
< DisplayName account = { account } / >
< / P e r m a l i n k >
< div className = 'account__relationship' >
{ buttons }
< / d i v >
< / d i v >
< / d i v >
) ;
}
}