1 import React
from 'react';
2 import ImmutablePropTypes
from 'react-immutable-proptypes';
3 import PropTypes
from 'prop-types';
4 import IconButton
from './icon_button';
5 import DropdownMenu
from './dropdown_menu';
6 import { defineMessages
, injectIntl
} from 'react-intl';
8 const messages
= defineMessages({
9 delete: { id: 'status.delete', defaultMessage: 'Delete' },
10 mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },
11 mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' },
12 block: { id: 'account.block', defaultMessage: 'Block @{name}' },
13 reply: { id: 'status.reply', defaultMessage: 'Reply' },
14 replyAll: { id: 'status.replyAll', defaultMessage: 'Reply to thread' },
15 reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
16 cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
17 favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
18 open: { id: 'status.open', defaultMessage: 'Expand this status' },
19 report: { id: 'status.report', defaultMessage: 'Report @{name}' },
20 muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
21 unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
24 class StatusActionBar
extends React
.PureComponent
{
26 static contextTypes
= {
27 router: PropTypes
.object
,
31 status: ImmutablePropTypes
.map
.isRequired
,
32 onReply: PropTypes
.func
,
33 onFavourite: PropTypes
.func
,
34 onReblog: PropTypes
.func
,
35 onDelete: PropTypes
.func
,
36 onMention: PropTypes
.func
,
37 onMute: PropTypes
.func
,
38 onBlock: PropTypes
.func
,
39 onReport: PropTypes
.func
,
40 onMuteConversation: PropTypes
.func
,
41 me: PropTypes
.number
.isRequired
,
42 withDismiss: PropTypes
.bool
,
43 intl: PropTypes
.object
.isRequired
,
46 handleReplyClick
= () => {
47 this.props
.onReply(this.props
.status
, this.context
.router
);
50 handleFavouriteClick
= () => {
51 this.props
.onFavourite(this.props
.status
);
54 handleReblogClick
= (e
) => {
55 this.props
.onReblog(this.props
.status
, e
);
58 handleDeleteClick
= () => {
59 this.props
.onDelete(this.props
.status
);
62 handleMentionClick
= () => {
63 this.props
.onMention(this.props
.status
.get('account'), this.context
.router
);
66 handleMuteClick
= () => {
67 this.props
.onMute(this.props
.status
.get('account'));
70 handleBlockClick
= () => {
71 this.props
.onBlock(this.props
.status
.get('account'));
75 this.context
.router
.push(`/statuses/${this.props.status.get('id')}`);
78 handleReport
= () => {
79 this.props
.onReport(this.props
.status
);
80 this.context
.router
.push('/report');
83 handleConversationMuteClick
= () => {
84 this.props
.onMuteConversation(this.props
.status
);
88 const { status
, me
, intl
, withDismiss
} = this.props
;
89 const reblogDisabled
= status
.get('visibility') === 'private' || status
.get('visibility') === 'direct';
90 const mutingConversation
= status
.get('muted');
93 let reblogIcon
= 'retweet';
97 menu
.push({ text: intl
.formatMessage(messages
.open
), action: this.handleOpen
});
101 menu
.push({ text: intl
.formatMessage(mutingConversation
? messages
.unmuteConversation : messages
.muteConversation
), action: this.handleConversationMuteClick
});
105 if (status
.getIn(['account', 'id']) === me
) {
106 menu
.push({ text: intl
.formatMessage(messages
.delete), action: this.handleDeleteClick
});
108 menu
.push({ text: intl
.formatMessage(messages
.mention
, { name: status
.getIn(['account', 'username']) }), action: this.handleMentionClick
});
110 menu
.push({ text: intl
.formatMessage(messages
.mute
, { name: status
.getIn(['account', 'username']) }), action: this.handleMuteClick
});
111 menu
.push({ text: intl
.formatMessage(messages
.block
, { name: status
.getIn(['account', 'username']) }), action: this.handleBlockClick
});
112 menu
.push({ text: intl
.formatMessage(messages
.report
, { name: status
.getIn(['account', 'username']) }), action: this.handleReport
});
115 if (status
.get('visibility') === 'direct') {
116 reblogIcon
= 'envelope';
117 } else if (status
.get('visibility') === 'private') {
121 if (status
.get('in_reply_to_id', null) === null) {
123 replyTitle
= intl
.formatMessage(messages
.reply
);
125 replyIcon
= "reply-all";
126 replyTitle
= intl
.formatMessage(messages
.replyAll
);
130 <div className
='status__action-bar'>
131 <div className
='status__action-bar-button-wrapper'><IconButton title
={replyTitle
} icon
={replyIcon
} onClick
={this.handleReplyClick
} /></div>
132 <div className
='status__action-bar-button-wrapper'><IconButton disabled
={reblogDisabled
} active
={status
.get('reblogged')} title
={reblogDisabled
? intl
.formatMessage(messages
.cannot_reblog
) : intl
.formatMessage(messages
.reblog
)} icon
={reblogIcon
} onClick
={this.handleReblogClick
} /></div>
133 <div className
='status__action-bar-button-wrapper'><IconButton animate
={true} active
={status
.get('favourited')} title
={intl
.formatMessage(messages
.favourite
)} icon
='star' onClick
={this.handleFavouriteClick
} className
='star-icon' /></div>
135 <div className
='status__action-bar-dropdown'>
136 <DropdownMenu items
={menu
} icon
='ellipsis-h' size
={18} direction
="right" ariaLabel
="More"/>
144 export default injectIntl(StatusActionBar
);