The code powering m.abunchtell.com https://m.abunchtell.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

73 lines
2.8 KiB

  1. import PureRenderMixin from 'react-addons-pure-render-mixin';
  2. import IconButton from '../../../components/icon_button';
  3. import ImmutablePropTypes from 'react-immutable-proptypes';
  4. import DropdownMenu from '../../../components/dropdown_menu';
  5. import { defineMessages, injectIntl } from 'react-intl';
  6. const messages = defineMessages({
  7. delete: { id: 'status.delete', defaultMessage: 'Delete' },
  8. mention: { id: 'status.mention', defaultMessage: 'Mention' },
  9. reply: { id: 'status.reply', defaultMessage: 'Reply' },
  10. reblog: { id: 'status.reblog', defaultMessage: 'Reblog' },
  11. favourite: { id: 'status.favourite', defaultMessage: 'Favourite' }
  12. });
  13. const ActionBar = React.createClass({
  14. propTypes: {
  15. status: ImmutablePropTypes.map.isRequired,
  16. onReply: React.PropTypes.func.isRequired,
  17. onReblog: React.PropTypes.func.isRequired,
  18. onFavourite: React.PropTypes.func.isRequired,
  19. onDelete: React.PropTypes.func.isRequired,
  20. onMention: React.PropTypes.func.isRequired,
  21. me: React.PropTypes.number.isRequired
  22. },
  23. mixins: [PureRenderMixin],
  24. handleReplyClick () {
  25. this.props.onReply(this.props.status);
  26. },
  27. handleReblogClick () {
  28. this.props.onReblog(this.props.status);
  29. },
  30. handleFavouriteClick () {
  31. this.props.onFavourite(this.props.status);
  32. },
  33. handleDeleteClick () {
  34. this.props.onDelete(this.props.status);
  35. },
  36. handleMentionClick () {
  37. this.props.onMention(this.props.status.get('account'));
  38. },
  39. render () {
  40. const { status, me, intl } = this.props;
  41. let menu = [];
  42. if (me === status.getIn(['account', 'id'])) {
  43. menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
  44. } else {
  45. menu.push({ text: intl.formatMessage(messages.mention), action: this.handleMentionClick });
  46. }
  47. return (
  48. <div style={{ background: '#2f3441', display: 'flex', flexDirection: 'row', borderTop: '1px solid #363c4b', borderBottom: '1px solid #363c4b', padding: '10px 0' }}>
  49. <div style={{ flex: '1 1 auto', textAlign: 'center' }}><IconButton title={intl.formatMessage(messages.reply)} icon='reply' onClick={this.handleReplyClick} /></div>
  50. <div style={{ flex: '1 1 auto', textAlign: 'center' }}><IconButton disabled={status.get('visibility') === 'private'} active={status.get('reblogged')} title={intl.formatMessage(messages.reblog)} icon='retweet' onClick={this.handleReblogClick} /></div>
  51. <div style={{ flex: '1 1 auto', textAlign: 'center' }}><IconButton active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} activeStyle={{ color: '#ca8f04' }} /></div>
  52. <div style={{ flex: '1 1 auto', textAlign: 'center' }}><DropdownMenu size={18} icon='ellipsis-h' items={menu} /></div>
  53. </div>
  54. );
  55. }
  56. });
  57. export default injectIntl(ActionBar);