2020-03-27 13:59:38 -07:00
'use strict' ;
2022-01-10 14:17:52 -08:00
import { List as ImmutableList , Map as ImmutableMap } from 'immutable' ;
2022-03-21 11:09:01 -07:00
import { debounce } from 'lodash' ;
2022-01-10 14:17:52 -08:00
import PropTypes from 'prop-types' ;
2020-03-27 13:59:38 -07:00
import React from 'react' ;
import ImmutablePropTypes from 'react-immutable-proptypes' ;
import ImmutablePureComponent from 'react-immutable-pure-component' ;
2022-03-21 11:09:01 -07:00
import InlineSVG from 'react-inlinesvg' ;
import { defineMessages , injectIntl } from 'react-intl' ;
2022-01-10 14:17:52 -08:00
import { connect } from 'react-redux' ;
2022-01-10 14:25:06 -08:00
2022-02-02 05:33:12 -08:00
import { openModal } from 'soapbox/actions/modals' ;
2022-01-10 14:17:52 -08:00
import Avatar from 'soapbox/components/avatar' ;
2022-01-24 15:37:12 -08:00
import Badge from 'soapbox/components/badge' ;
2022-01-10 14:17:52 -08:00
import StillImage from 'soapbox/components/still_image' ;
2022-03-21 13:29:33 -07:00
import { HStack , IconButton , Menu , MenuButton , MenuItem , MenuList , MenuLink , MenuDivider } from 'soapbox/components/ui' ;
2022-01-10 14:17:52 -08:00
import ActionButton from 'soapbox/features/ui/components/action_button' ;
2021-07-13 10:30:24 -07:00
import {
isStaff ,
isAdmin ,
isModerator ,
isLocal ,
2021-08-23 12:14:47 -07:00
isRemote ,
getDomain ,
2021-07-13 10:30:24 -07:00
} from 'soapbox/utils/accounts' ;
2021-09-13 10:29:34 -07:00
import { getFeatures } from 'soapbox/utils/features' ;
2020-03-27 13:59:38 -07:00
const messages = defineMessages ( {
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' } ,
2021-10-02 13:39:12 -07:00
chat : { id : 'account.chat' , defaultMessage : 'Chat with @{name}' } ,
2020-03-27 13:59:38 -07:00
direct : { id : 'account.direct' , defaultMessage : 'Direct message @{name}' } ,
unmute : { id : 'account.unmute' , defaultMessage : 'Unmute @{name}' } ,
block : { id : 'account.block' , defaultMessage : 'Block @{name}' } ,
2020-08-14 15:16:38 -07:00
unblock : { id : 'account.unblock' , defaultMessage : 'Unblock @{name}' } ,
2020-03-27 13:59:38 -07:00
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' } ,
blockDomain : { id : 'account.block_domain' , defaultMessage : 'Hide everything from {domain}' } ,
unblockDomain : { id : 'account.unblock_domain' , defaultMessage : 'Unhide {domain}' } ,
hideReblogs : { id : 'account.hide_reblogs' , defaultMessage : 'Hide reposts from @{name}' } ,
showReblogs : { id : 'account.show_reblogs' , defaultMessage : 'Show reposts from @{name}' } ,
preferences : { id : 'navigation_bar.preferences' , defaultMessage : 'Preferences' } ,
follow _requests : { id : 'navigation_bar.follow_requests' , defaultMessage : 'Follow requests' } ,
blocks : { id : 'navigation_bar.blocks' , defaultMessage : 'Blocked users' } ,
domain _blocks : { id : 'navigation_bar.domain_blocks' , defaultMessage : 'Hidden domains' } ,
mutes : { id : 'navigation_bar.mutes' , defaultMessage : 'Muted users' } ,
endorse : { id : 'account.endorse' , defaultMessage : 'Feature on profile' } ,
unendorse : { id : 'account.unendorse' , defaultMessage : 'Don\'t feature on profile' } ,
admin _account : { id : 'status.admin_account' , defaultMessage : 'Open moderation interface for @{name}' } ,
add _or _remove _from _list : { id : 'account.add_or_remove_from_list' , defaultMessage : 'Add or Remove from lists' } ,
2021-01-18 16:25:36 -08:00
deactivateUser : { id : 'admin.users.actions.deactivate_user' , defaultMessage : 'Deactivate @{name}' } ,
deleteUser : { id : 'admin.users.actions.delete_user' , defaultMessage : 'Delete @{name}' } ,
2021-03-15 19:50:16 -07:00
verifyUser : { id : 'admin.users.actions.verify_user' , defaultMessage : 'Verify @{name}' } ,
unverifyUser : { id : 'admin.users.actions.unverify_user' , defaultMessage : 'Unverify @{name}' } ,
2021-07-13 10:21:12 -07:00
promoteToAdmin : { id : 'admin.users.actions.promote_to_admin' , defaultMessage : 'Promote @{name} to an admin' } ,
promoteToModerator : { id : 'admin.users.actions.promote_to_moderator' , defaultMessage : 'Promote @{name} to a moderator' } ,
demoteToModerator : { id : 'admin.users.actions.demote_to_moderator' , defaultMessage : 'Demote @{name} to a moderator' } ,
demoteToUser : { id : 'admin.users.actions.demote_to_user' , defaultMessage : 'Demote @{name} to a regular user' } ,
2021-06-27 09:52:12 -07:00
subscribe : { id : 'account.subscribe' , defaultMessage : 'Subscribe to notifications from @{name}' } ,
unsubscribe : { id : 'account.unsubscribe' , defaultMessage : 'Unsubscribe to notifications from @{name}' } ,
2021-11-26 21:36:17 -08:00
suggestUser : { id : 'admin.users.actions.suggest_user' , defaultMessage : 'Suggest @{name}' } ,
unsuggestUser : { id : 'admin.users.actions.unsuggest_user' , defaultMessage : 'Unsuggest @{name}' } ,
2020-03-27 13:59:38 -07:00
} ) ;
2020-04-01 19:20:47 -07:00
const mapStateToProps = state => {
2020-04-18 13:22:40 -07:00
const me = state . get ( 'me' ) ;
2021-07-13 10:21:12 -07:00
const account = state . getIn ( [ 'accounts' , me ] ) ;
2021-09-13 10:29:34 -07:00
const instance = state . get ( 'instance' ) ;
const features = getFeatures ( instance ) ;
2021-07-13 10:21:12 -07:00
2020-04-01 19:20:47 -07:00
return {
2020-04-18 13:22:40 -07:00
me ,
2021-07-13 10:21:12 -07:00
meAccount : account ,
2021-09-13 10:29:34 -07:00
features ,
2020-04-01 19:20:47 -07:00
} ;
} ;
export default @ connect ( mapStateToProps )
@ injectIntl
2020-03-27 13:59:38 -07:00
class Header extends ImmutablePureComponent {
static propTypes = {
account : ImmutablePropTypes . map ,
2021-07-13 10:21:12 -07:00
meAccount : ImmutablePropTypes . map ,
2020-03-27 13:59:38 -07:00
identity _props : ImmutablePropTypes . list ,
intl : PropTypes . object . isRequired ,
username : PropTypes . string ,
2021-09-13 10:29:34 -07:00
features : PropTypes . object ,
2020-03-27 13:59:38 -07:00
} ;
state = {
isSmallScreen : ( window . innerWidth <= 895 ) ,
}
isStatusesPageActive = ( match , location ) => {
if ( ! match ) {
return false ;
}
return ! location . pathname . match ( /\/(followers|following|favorites|pins)\/?$/ ) ;
}
2020-06-17 18:42:30 -07:00
componentDidMount ( ) {
2020-03-27 13:59:38 -07:00
window . addEventListener ( 'resize' , this . handleResize , { passive : true } ) ;
}
2020-04-14 14:47:35 -07:00
componentWillUnmount ( ) {
2020-03-27 13:59:38 -07:00
window . removeEventListener ( 'resize' , this . handleResize ) ;
}
handleResize = debounce ( ( ) => {
this . setState ( { isSmallScreen : ( window . innerWidth <= 895 ) } ) ;
} , 5 , {
trailing : true ,
} ) ;
2021-05-01 13:02:27 -07:00
onAvatarClick = ( ) => {
const avatar _url = this . props . account . get ( 'avatar' ) ;
const avatar = ImmutableMap ( {
type : 'image' ,
preview _url : avatar _url ,
url : avatar _url ,
description : '' ,
} ) ;
this . props . dispatch ( openModal ( 'MEDIA' , { media : ImmutableList . of ( avatar ) , index : 0 } ) ) ;
}
handleAvatarClick = ( e ) => {
if ( e . button === 0 && ! ( e . ctrlKey || e . metaKey ) ) {
e . preventDefault ( ) ;
this . onAvatarClick ( ) ;
}
}
2021-08-27 13:52:14 -07:00
onHeaderClick = ( ) => {
const header _url = this . props . account . get ( 'header' ) ;
const header = ImmutableMap ( {
type : 'image' ,
preview _url : header _url ,
url : header _url ,
description : '' ,
} ) ;
this . props . dispatch ( openModal ( 'MEDIA' , { media : ImmutableList . of ( header ) , index : 0 } ) ) ;
}
handleHeaderClick = ( e ) => {
if ( e . button === 0 && ! ( e . ctrlKey || e . metaKey ) ) {
e . preventDefault ( ) ;
this . onHeaderClick ( ) ;
}
}
2021-10-15 07:45:03 -07:00
handleShare = ( ) => {
navigator . share ( {
text : ` @ ${ this . props . account . get ( 'acct' ) } ` ,
url : this . props . account . get ( 'url' ) ,
} ) . catch ( ( e ) => {
if ( e . name !== 'AbortError' ) console . error ( e ) ;
} ) ;
}
2020-03-27 13:59:38 -07:00
makeMenu ( ) {
2021-09-13 10:29:34 -07:00
const { account , intl , me , meAccount , features } = this . props ;
2020-03-27 13:59:38 -07:00
2021-08-03 10:10:42 -07:00
const menu = [ ] ;
2020-03-27 13:59:38 -07:00
if ( ! account || ! me ) {
return [ ] ;
}
if ( 'share' in navigator ) {
2021-11-04 12:54:28 -07:00
menu . push ( {
text : intl . formatMessage ( messages . share , { name : account . get ( 'username' ) } ) ,
action : this . handleShare ,
2022-03-21 11:09:01 -07:00
icon : require ( '@tabler/icons/icons/upload.svg' ) ,
2021-11-04 12:54:28 -07:00
} ) ;
2020-03-27 13:59:38 -07:00
menu . push ( null ) ;
}
if ( account . get ( 'id' ) === me ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . edit _profile ) ,
to : '/settings/profile' ,
icon : require ( '@tabler/icons/icons/user.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . preferences ) ,
2022-03-21 11:09:01 -07:00
to : '/settings' ,
2021-11-04 12:19:04 -07:00
icon : require ( '@tabler/icons/icons/settings.svg' ) ,
} ) ;
2022-03-21 11:09:01 -07:00
// menu.push(null);
// menu.push({
// text: intl.formatMessage(messages.follow_requests),
// to: '/follow_requests',
// icon: require('@tabler/icons/icons/user-plus.svg'),
// });
2020-03-27 13:59:38 -07:00
menu . push ( null ) ;
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . mutes ) ,
to : '/mutes' ,
icon : require ( '@tabler/icons/icons/circle-x.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . blocks ) ,
to : '/blocks' ,
icon : require ( '@tabler/icons/icons/ban.svg' ) ,
} ) ;
2022-03-21 11:09:01 -07:00
// menu.push({
// text: intl.formatMessage(messages.domain_blocks),
// to: '/domain_blocks',
// icon: require('@tabler/icons/icons/ban.svg'),
// });
2020-03-27 13:59:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . mention , { name : account . get ( 'username' ) } ) ,
action : this . props . onMention ,
2022-03-21 11:09:01 -07:00
icon : require ( '@tabler/icons/icons/at.svg' ) ,
2021-11-04 12:19:04 -07:00
} ) ;
2021-10-02 13:39:12 -07:00
2022-03-21 11:09:01 -07:00
// if (account.getIn(['pleroma', 'accepts_chat_messages'], false) === true) {
// menu.push({
// text: intl.formatMessage(messages.chat, { name: account.get('username') }),
// action: this.props.onChat,
// icon: require('@tabler/icons/icons/messages.svg'),
// });
// } else {
// menu.push({
// text: intl.formatMessage(messages.direct, { name: account.get('username') }),
// action: this.props.onDirect,
// icon: require('@tabler/icons/icons/mail.svg'),
// });
// }
2022-02-26 06:57:09 -08:00
2020-03-27 13:59:38 -07:00
if ( account . getIn ( [ 'relationship' , 'following' ] ) ) {
if ( account . getIn ( [ 'relationship' , 'showing_reblogs' ] ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . hideReblogs , { name : account . get ( 'username' ) } ) ,
action : this . props . onReblogToggle ,
icon : require ( '@tabler/icons/icons/repeat.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . showReblogs , { name : account . get ( 'username' ) } ) ,
action : this . props . onReblogToggle ,
icon : require ( '@tabler/icons/icons/repeat.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
}
2022-03-21 11:09:01 -07:00
if ( features . accountSubscriptions ) {
2021-09-18 13:03:38 -07:00
if ( account . getIn ( [ 'relationship' , 'subscribing' ] ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . unsubscribe , { name : account . get ( 'username' ) } ) ,
action : this . props . onSubscriptionToggle ,
icon : require ( '@tabler/icons/icons/bell.svg' ) ,
} ) ;
2021-09-18 13:03:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . subscribe , { name : account . get ( 'username' ) } ) ,
action : this . props . onSubscriptionToggle ,
icon : require ( '@tabler/icons/icons/bell-off.svg' ) ,
} ) ;
2021-09-18 13:03:38 -07:00
}
}
if ( features . lists ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . add _or _remove _from _list ) ,
action : this . props . onAddToList ,
icon : require ( '@tabler/icons/icons/list.svg' ) ,
} ) ;
2021-06-27 09:52:12 -07:00
}
2022-03-21 11:09:01 -07:00
// menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle });
2020-03-27 13:59:38 -07:00
menu . push ( null ) ;
2021-09-18 13:03:38 -07:00
} else if ( features . lists && features . unrestrictedLists ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . add _or _remove _from _list ) ,
action : this . props . onAddToList ,
icon : require ( '@tabler/icons/icons/list.svg' ) ,
} ) ;
2020-05-26 05:49:05 -07:00
}
2020-03-27 13:59:38 -07:00
if ( account . getIn ( [ 'relationship' , 'muting' ] ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . unmute , { name : account . get ( 'username' ) } ) ,
action : this . props . onMute ,
icon : require ( '@tabler/icons/icons/circle-x.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . mute , { name : account . get ( 'username' ) } ) ,
action : this . props . onMute ,
icon : require ( '@tabler/icons/icons/circle-x.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
}
if ( account . getIn ( [ 'relationship' , 'blocking' ] ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . unblock , { name : account . get ( 'username' ) } ) ,
action : this . props . onBlock ,
icon : require ( '@tabler/icons/icons/ban.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . block , { name : account . get ( 'username' ) } ) ,
action : this . props . onBlock ,
icon : require ( '@tabler/icons/icons/ban.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
}
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . report , { name : account . get ( 'username' ) } ) ,
action : this . props . onReport ,
icon : require ( '@tabler/icons/icons/flag.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
}
2021-08-23 12:14:47 -07:00
if ( isRemote ( account ) ) {
const domain = getDomain ( account ) ;
2020-03-27 13:59:38 -07:00
menu . push ( null ) ;
if ( account . getIn ( [ 'relationship' , 'domain_blocking' ] ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . unblockDomain , { domain } ) ,
action : this . props . onUnblockDomain ,
icon : require ( '@tabler/icons/icons/ban.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . blockDomain , { domain } ) ,
action : this . props . onBlockDomain ,
icon : require ( '@tabler/icons/icons/ban.svg' ) ,
} ) ;
2020-03-27 13:59:38 -07:00
}
}
2021-07-13 10:21:12 -07:00
if ( isStaff ( meAccount ) ) {
2020-03-27 13:59:38 -07:00
menu . push ( null ) ;
2021-07-13 10:21:12 -07:00
if ( isAdmin ( meAccount ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . admin _account , { name : account . get ( 'username' ) } ) ,
2022-03-21 13:29:33 -07:00
to : ` /pleroma/admin/#/users/ ${ account . id } / ` ,
newTab : true ,
2022-02-26 04:32:54 -08:00
icon : require ( '@tabler/icons/icons/gavel.svg' ) ,
2021-11-04 12:19:04 -07:00
} ) ;
2021-07-13 10:21:12 -07:00
}
2022-01-03 09:10:58 -08:00
if ( account . get ( 'id' ) !== me && isLocal ( account ) && isAdmin ( meAccount ) ) {
2021-07-13 10:30:24 -07:00
if ( isAdmin ( account ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . demoteToModerator , { name : account . get ( 'username' ) } ) ,
action : this . props . onPromoteToModerator ,
icon : require ( '@tabler/icons/icons/arrow-up-circle.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . demoteToUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onDemoteToUser ,
icon : require ( '@tabler/icons/icons/arrow-down-circle.svg' ) ,
} ) ;
2021-07-13 10:30:24 -07:00
} else if ( isModerator ( account ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . promoteToAdmin , { name : account . get ( 'username' ) } ) ,
action : this . props . onPromoteToAdmin ,
icon : require ( '@tabler/icons/icons/arrow-up-circle.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . demoteToUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onDemoteToUser ,
icon : require ( '@tabler/icons/icons/arrow-down-circle.svg' ) ,
} ) ;
2021-07-13 10:30:24 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . promoteToAdmin , { name : account . get ( 'username' ) } ) ,
action : this . props . onPromoteToAdmin ,
icon : require ( '@tabler/icons/icons/arrow-up-circle.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . promoteToModerator , { name : account . get ( 'username' ) } ) ,
action : this . props . onPromoteToModerator ,
icon : require ( '@tabler/icons/icons/arrow-up-circle.svg' ) ,
} ) ;
2021-07-13 10:30:24 -07:00
}
2021-07-13 10:21:12 -07:00
}
2021-03-15 19:50:16 -07:00
2022-02-27 20:25:23 -08:00
if ( account . get ( 'verified' ) ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . unverifyUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onUnverifyUser ,
icon : require ( '@tabler/icons/icons/check.svg' ) ,
} ) ;
2021-03-15 19:50:16 -07:00
} else {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . verifyUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onVerifyUser ,
icon : require ( '@tabler/icons/icons/check.svg' ) ,
} ) ;
2021-03-15 19:50:16 -07:00
}
2022-01-03 09:10:58 -08:00
if ( features . suggestionsV2 && isAdmin ( meAccount ) ) {
2021-11-26 21:53:50 -08:00
if ( account . getIn ( [ 'pleroma' , 'is_suggested' ] ) ) {
menu . push ( {
text : intl . formatMessage ( messages . unsuggestUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onUnsuggestUser ,
icon : require ( '@tabler/icons/icons/user-x.svg' ) ,
} ) ;
} else {
menu . push ( {
text : intl . formatMessage ( messages . suggestUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onSuggestUser ,
icon : require ( '@tabler/icons/icons/user-check.svg' ) ,
} ) ;
}
2021-11-26 21:36:17 -08:00
}
2021-03-15 19:57:24 -07:00
if ( account . get ( 'id' ) !== me ) {
2021-11-04 12:19:04 -07:00
menu . push ( {
text : intl . formatMessage ( messages . deactivateUser , { name : account . get ( 'username' ) } ) ,
action : this . props . onDeactivateUser ,
icon : require ( '@tabler/icons/icons/user-off.svg' ) ,
} ) ;
menu . push ( {
text : intl . formatMessage ( messages . deleteUser , { name : account . get ( 'username' ) } ) ,
icon : require ( '@tabler/icons/icons/user-minus.svg' ) ,
} ) ;
2021-03-15 19:57:24 -07:00
}
2020-03-27 13:59:38 -07:00
}
return menu ;
}
makeInfo ( ) {
2022-03-21 11:09:01 -07:00
const { account , intl , me } = this . props ;
2020-03-27 13:59:38 -07:00
2021-08-03 10:10:42 -07:00
const info = [ ] ;
2020-03-27 13:59:38 -07:00
if ( ! account || ! me ) return info ;
if ( me !== account . get ( 'id' ) && account . getIn ( [ 'relationship' , 'followed_by' ] ) ) {
2022-03-21 11:09:01 -07:00
info . push (
< Badge
key = 'followed_by'
slug = 'opaque'
title = { intl . formatMessage ( { id : 'account.follows_you' , defaultMessage : 'Follows you' } ) }
/ > ,
) ;
2020-03-27 13:59:38 -07:00
} else if ( me !== account . get ( 'id' ) && account . getIn ( [ 'relationship' , 'blocking' ] ) ) {
2022-03-21 11:09:01 -07:00
info . push (
< Badge
key = 'blocked'
slug = 'opaque'
title = { intl . formatMessage ( { id : 'account.blocked' , defaultMessage : 'Blocked' } ) }
/ > ,
) ;
2020-03-27 13:59:38 -07:00
}
if ( me !== account . get ( 'id' ) && account . getIn ( [ 'relationship' , 'muting' ] ) ) {
2022-03-21 11:09:01 -07:00
info . push (
< Badge
key = 'muted'
slug = 'opaque'
title = { intl . formatMessage ( { id : 'account.muted' , defaultMessage : 'Muted' } ) }
/ > ,
) ;
2020-03-27 13:59:38 -07:00
} else if ( me !== account . get ( 'id' ) && account . getIn ( [ 'relationship' , 'domain_blocking' ] ) ) {
2022-03-21 11:09:01 -07:00
info . push (
< Badge
key = 'domain_blocked'
slug = 'opaque'
title = { intl . formatMessage ( { id : 'account.domain_blocked' , defaultMessage : 'Domain hidden' } ) }
/ > ,
) ;
2020-03-27 13:59:38 -07:00
}
return info ;
2021-08-03 12:22:51 -07:00
}
2020-03-27 13:59:38 -07:00
2021-10-13 11:23:07 -07:00
renderMessageButton ( ) {
2021-10-13 11:55:02 -07:00
const { intl , account , me } = this . props ;
2021-10-13 11:23:07 -07:00
if ( ! me || ! account || account . get ( 'id' ) === me ) {
return null ;
}
const canChat = account . getIn ( [ 'pleroma' , 'accepts_chat_messages' ] , false ) === true ;
if ( canChat ) {
2021-10-13 11:55:02 -07:00
return (
< IconButton
src = { require ( '@tabler/icons/icons/messages.svg' ) }
onClick = { this . props . onChat }
title = { intl . formatMessage ( messages . chat , { name : account . get ( 'username' ) } ) }
/ >
) ;
2021-10-13 11:23:07 -07:00
} else {
2021-10-13 11:55:02 -07:00
return (
< IconButton
src = { require ( '@tabler/icons/icons/mail.svg' ) }
onClick = { this . props . onDirect }
title = { intl . formatMessage ( messages . direct , { name : account . get ( 'username' ) } ) }
2022-03-21 11:09:01 -07:00
className = 'text-primary-700 bg-primary-100 hover:bg-primary-200 p-2'
iconClassName = 'w-5 h-5'
2021-10-13 11:55:02 -07:00
/ >
) ;
2021-10-13 11:23:07 -07:00
}
}
2021-12-01 12:08:44 -08:00
renderShareButton ( ) {
const { intl , account , me } = this . props ;
const canShare = 'share' in navigator ;
if ( ! ( account && me && account . get ( 'id' ) === me && canShare ) ) {
return null ;
}
return (
< IconButton
2022-03-21 11:09:01 -07:00
src = { require ( '@tabler/icons/icons/upload.svg' ) }
2021-12-01 12:08:44 -08:00
onClick = { this . handleShare }
title = { intl . formatMessage ( messages . share , { name : account . get ( 'username' ) } ) }
2022-03-21 11:09:01 -07:00
className = 'text-primary-700 bg-primary-100 hover:bg-primary-200 p-2'
iconClassName = 'w-5 h-5'
2021-12-01 12:08:44 -08:00
/ >
) ;
}
2020-04-14 14:47:35 -07:00
render ( ) {
2022-03-21 11:09:01 -07:00
const { account , me } = this . props ;
2020-03-27 13:59:38 -07:00
if ( ! account ) {
return (
2022-03-21 11:09:01 -07:00
< div className = '-mt-4 -mx-4' >
< div >
< div className = 'relative h-32 w-full lg:h-48 md:rounded-t-xl bg-gray-200' / >
< / d i v >
< div className = 'px-4 sm:px-6' >
< div className = '-mt-12 flex items-end space-x-5' >
< div className = 'flex relative' >
< div
className = 'h-24 w-24 bg-gray-400 rounded-full ring-4 ring-white'
/ >
2021-10-06 09:15:32 -07:00
< / d i v >
2020-03-27 13:59:38 -07:00
< / d i v >
< / d i v >
< / d i v >
) ;
}
const info = this . makeInfo ( ) ;
const menu = this . makeMenu ( ) ;
2021-07-13 13:24:39 -07:00
const header = account . get ( 'header' , '' ) ;
2020-03-27 13:59:38 -07:00
2022-03-21 11:09:01 -07:00
// NOTE: Removing Subscription element
// {features.accountSubscriptions && <div className='account__header__subscribe'>
// <SubscriptionButton account={account} />
// </div>}
2021-10-06 09:15:32 -07:00
2020-03-27 13:59:38 -07:00
return (
2022-03-21 11:09:01 -07:00
< div className = '-mt-4 -mx-4' >
< div >
< div className = 'relative h-32 w-full lg:h-48 md:rounded-t-xl bg-gray-200' >
{ header && (
< a href = { account . get ( 'header' ) } onClick = { this . handleHeaderClick } target = '_blank' >
< StillImage
src = { account . get ( 'header' ) }
alt = 'Profile Header'
className = 'absolute inset-0 object-cover md:rounded-t-xl'
/ >
< / a >
) }
2021-09-14 04:55:52 -07:00
2022-03-21 11:09:01 -07:00
< div className = 'absolute top-2 left-2' >
< HStack alignItems = 'center' space = { 1 } >
{ info }
< / H S t a c k >
< / d i v >
< / d i v >
2020-03-27 13:59:38 -07:00
< / d i v >
2022-03-21 11:09:01 -07:00
< div className = 'px-4 sm:px-6' >
< div className = '-mt-12 flex items-end space-x-5' >
< div className = 'flex' >
< a href = { account . get ( 'avatar' ) } onClick = { this . handleAvatarClick } target = '_blank' >
< Avatar
account = { account }
className = 'h-24 w-24 rounded-full ring-4 ring-white'
/ >
2021-10-06 09:15:32 -07:00
< / a >
2021-10-07 19:39:03 -07:00
< / d i v >
2022-03-21 11:09:01 -07:00
< div className = 'mt-6 sm:flex-1 sm:min-w-0 sm:flex sm:items-center sm:justify-end sm:space-x-6 sm:pb-1' >
< div className = 'mt-10 flex justify-stretch flex-row space-y-0 space-x-2' >
{ me && (
< Menu >
< MenuButton
as = { IconButton }
src = { require ( '@tabler/icons/icons/dots.svg' ) }
className = 'text-primary-700 bg-primary-100 hover:bg-primary-200 p-2'
iconClassName = 'w-5 h-5'
/ >
< MenuList >
{ menu . map ( ( menuItem , idx ) => {
if ( typeof menuItem ? . text === 'undefined' ) {
return < MenuDivider key = { idx } / > ;
} else {
2022-03-21 13:29:33 -07:00
const Comp = menuItem . action ? MenuItem : MenuLink ;
// TODO: Add `as: Link` once React Router is upgraded.
const itemProps = menuItem . action ? { onSelect : menuItem . action } : { to : menuItem . to , target : menuItem . newTab ? '_blank' : '_self' } ;
2022-03-21 11:09:01 -07:00
return (
2022-03-21 13:29:33 -07:00
< Comp key = { idx } { ... itemProps } className = 'group' >
2022-03-21 11:09:01 -07:00
< div className = 'flex items-center' >
< InlineSVG src = { menuItem . icon } className = 'mr-3 h-5 w-5 text-gray-400 group-hover:text-gray-500' / >
< div className = 'truncate' > { menuItem . text } < / d i v >
< / d i v >
2022-03-21 13:29:33 -07:00
< / C o m p >
2022-03-21 11:09:01 -07:00
) ;
}
} ) }
< / M e n u L i s t >
< / M e n u >
) }
{ this . renderShareButton ( ) }
{ /* {this.renderMessageButton()} */ }
< ActionButton account = { account } / >
2020-03-27 13:59:38 -07:00
< / d i v >
2020-08-30 19:15:02 -07:00
< / d i v >
2020-03-27 13:59:38 -07:00
< / d i v >
< / d i v >
< / d i v >
) ;
}
}