闭社主体 forked from https://github.com/tootsuite/mastodon
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.

71 lines
2.1 KiB

  1. import React from 'react';
  2. import { connect } from 'react-redux';
  3. import PropTypes from 'prop-types';
  4. import classNames from 'classnames';
  5. import { changeComposeSensitivity } from 'mastodon/actions/compose';
  6. import { injectIntl, defineMessages, FormattedMessage } from 'react-intl';
  7. const messages = defineMessages({
  8. marked: {
  9. id: 'compose_form.sensitive.marked',
  10. defaultMessage: '{count, plural, one {Media is marked as sensitive} other {Media is marked as sensitive}}',
  11. },
  12. unmarked: {
  13. id: 'compose_form.sensitive.unmarked',
  14. defaultMessage: '{count, plural, one {Media is not marked as sensitive} other {Media is not marked as sensitive}}',
  15. },
  16. });
  17. const mapStateToProps = state => ({
  18. active: state.getIn(['compose', 'sensitive']),
  19. disabled: state.getIn(['compose', 'spoiler']),
  20. mediaCount: state.getIn(['compose', 'media_attachments']).size,
  21. });
  22. const mapDispatchToProps = dispatch => ({
  23. onClick () {
  24. dispatch(changeComposeSensitivity());
  25. },
  26. });
  27. class SensitiveButton extends React.PureComponent {
  28. static propTypes = {
  29. active: PropTypes.bool,
  30. disabled: PropTypes.bool,
  31. mediaCount: PropTypes.number,
  32. onClick: PropTypes.func.isRequired,
  33. intl: PropTypes.object.isRequired,
  34. };
  35. render () {
  36. const { active, disabled, mediaCount, onClick, intl } = this.props;
  37. return (
  38. <div className='compose-form__sensitive-button'>
  39. <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked, { count: mediaCount })}>
  40. <input
  41. name='mark-sensitive'
  42. type='checkbox'
  43. checked={active}
  44. onChange={onClick}
  45. disabled={disabled}
  46. />
  47. <span className={classNames('checkbox', { active })} />
  48. <FormattedMessage
  49. id='compose_form.sensitive.hide'
  50. defaultMessage='{count, plural, one {Mark media as sensitive} other {Mark media as sensitive}}'
  51. values={{ count: mediaCount }}
  52. />
  53. </label>
  54. </div>
  55. );
  56. }
  57. }
  58. export default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SensitiveButton));