status_check_box.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import ImmutablePropTypes from 'react-immutable-proptypes';
  4. import StatusContent from 'mastodon/components/status_content';
  5. import Avatar from 'mastodon/components/avatar';
  6. import DisplayName from 'mastodon/components/display_name';
  7. import RelativeTimestamp from 'mastodon/components/relative_timestamp';
  8. import Option from './option';
  9. import MediaAttachments from 'mastodon/components/media_attachments';
  10. import { injectIntl, defineMessages } from 'react-intl';
  11. import Icon from 'mastodon/components/icon';
  12. const messages = defineMessages({
  13. public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },
  14. unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },
  15. private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },
  16. direct_short: { id: 'privacy.direct.short', defaultMessage: 'Mentioned people only' },
  17. });
  18. export default @injectIntl
  19. class StatusCheckBox extends React.PureComponent {
  20. static propTypes = {
  21. id: PropTypes.string.isRequired,
  22. status: ImmutablePropTypes.map.isRequired,
  23. checked: PropTypes.bool,
  24. onToggle: PropTypes.func.isRequired,
  25. intl: PropTypes.object.isRequired,
  26. };
  27. handleStatusesToggle = (value, checked) => {
  28. const { onToggle } = this.props;
  29. onToggle(value, checked);
  30. };
  31. render () {
  32. const { status, checked, intl } = this.props;
  33. if (status.get('reblog')) {
  34. return null;
  35. }
  36. const visibilityIconInfo = {
  37. 'public': { icon: 'globe', text: intl.formatMessage(messages.public_short) },
  38. 'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.unlisted_short) },
  39. 'private': { icon: 'lock', text: intl.formatMessage(messages.private_short) },
  40. 'direct': { icon: 'at', text: intl.formatMessage(messages.direct_short) },
  41. };
  42. const visibilityIcon = visibilityIconInfo[status.get('visibility')];
  43. const labelComponent = (
  44. <div className='status-check-box__status poll__option__text'>
  45. <div className='detailed-status__display-name'>
  46. <div className='detailed-status__display-avatar'>
  47. <Avatar account={status.get('account')} size={46} />
  48. </div>
  49. <div>
  50. <DisplayName account={status.get('account')} /> · <span className='status__visibility-icon'><Icon id={visibilityIcon.icon} title={visibilityIcon.text} /></span> <RelativeTimestamp timestamp={status.get('created_at')} />
  51. </div>
  52. </div>
  53. <StatusContent status={status} />
  54. <MediaAttachments status={status} />
  55. </div>
  56. );
  57. return (
  58. <Option
  59. name='status_ids'
  60. value={status.get('id')}
  61. checked={checked}
  62. onToggle={this.handleStatusesToggle}
  63. label={status.get('search_index')}
  64. labelComponent={labelComponent}
  65. multiple
  66. />
  67. );
  68. }
  69. }