]> cat aescling's git repositories - mastodon.git/blob - app/javascript/mastodon/features/account/components/action_bar.js
Improve eslint rules (#3147)
[mastodon.git] / app / javascript / mastodon / features / account / components / action_bar.js
1 import React from 'react';
2 import ImmutablePropTypes from 'react-immutable-proptypes';
3 import PropTypes from 'prop-types';
4 import DropdownMenu from '../../../components/dropdown_menu';
5 import Link from 'react-router/lib/Link';
6 import { defineMessages, injectIntl, FormattedMessage, FormattedNumber } from 'react-intl';
7
8 const messages = defineMessages({
9 mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' },
10 edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
11 unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
12 unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
13 unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
14 block: { id: 'account.block', defaultMessage: 'Block @{name}' },
15 mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
16 follow: { id: 'account.follow', defaultMessage: 'Follow' },
17 report: { id: 'account.report', defaultMessage: 'Report @{name}' },
18 media: { id: 'account.media', defaultMessage: 'Media' },
19 disclaimer: { id: 'account.disclaimer', defaultMessage: 'This user is from another instance. This number may be larger.' },
20 blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },
21 unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },
22 });
23
24 class ActionBar extends React.PureComponent {
25
26 static propTypes = {
27 account: ImmutablePropTypes.map.isRequired,
28 me: PropTypes.number.isRequired,
29 onFollow: PropTypes.func,
30 onBlock: PropTypes.func.isRequired,
31 onMention: PropTypes.func.isRequired,
32 onReport: PropTypes.func.isRequired,
33 onMute: PropTypes.func.isRequired,
34 onBlockDomain: PropTypes.func.isRequired,
35 onUnblockDomain: PropTypes.func.isRequired,
36 intl: PropTypes.object.isRequired,
37 };
38
39 render () {
40 const { account, me, intl } = this.props;
41
42 let menu = [];
43 let extraInfo = '';
44
45 menu.push({ text: intl.formatMessage(messages.mention, { name: account.get('username') }), action: this.props.onMention });
46 menu.push(null);
47 menu.push({ text: intl.formatMessage(messages.media), to: `/accounts/${account.get('id')}/media` });
48 menu.push(null);
49
50 if (account.get('id') === me) {
51 menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
52 } else {
53 if (account.getIn(['relationship', 'muting'])) {
54 menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute });
55 } else {
56 menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.props.onMute });
57 }
58
59 if (account.getIn(['relationship', 'blocking'])) {
60 menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock });
61 } else {
62 menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.props.onBlock });
63 }
64
65 menu.push({ text: intl.formatMessage(messages.report, { name: account.get('username') }), action: this.props.onReport });
66 }
67
68 if (account.get('acct') !== account.get('username')) {
69 const domain = account.get('acct').split('@')[1];
70 extraInfo = <abbr title={intl.formatMessage(messages.disclaimer)}>*</abbr>;
71
72 menu.push(null);
73
74 if (account.getIn(['relationship', 'domain_blocking'])) {
75 menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain });
76 } else {
77 menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.props.onBlockDomain });
78 }
79 }
80
81 return (
82 <div className='account__action-bar'>
83 <div className='account__action-bar-dropdown'>
84 <DropdownMenu items={menu} icon='bars' size={24} direction="right" />
85 </div>
86
87 <div className='account__action-bar-links'>
88 <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}`}>
89 <span><FormattedMessage id='account.posts' defaultMessage='Posts' /></span>
90 <strong><FormattedNumber value={account.get('statuses_count')} /> {extraInfo}</strong>
91 </Link>
92
93 <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/following`}>
94 <span><FormattedMessage id='account.follows' defaultMessage='Follows' /></span>
95 <strong><FormattedNumber value={account.get('following_count')} /> {extraInfo}</strong>
96 </Link>
97
98 <Link className='account__action-bar__tab' to={`/accounts/${account.get('id')}/followers`}>
99 <span><FormattedMessage id='account.followers' defaultMessage='Followers' /></span>
100 <strong><FormattedNumber value={account.get('followers_count')} /> {extraInfo}</strong>
101 </Link>
102 </div>
103 </div>
104 );
105 }
106
107 }
108
109 export default injectIntl(ActionBar);
This page took 0.152487 seconds and 4 git commands to generate.