123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- import React from 'react';
- import PropTypes from 'prop-types';
- import api from 'mastodon/api';
- import { injectIntl, defineMessages } from 'react-intl';
- import classNames from 'classnames';
- const messages = defineMessages({
- other: { id: 'report.categories.other', defaultMessage: 'Other' },
- spam: { id: 'report.categories.spam', defaultMessage: 'Spam' },
- violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' },
- });
- class Category extends React.PureComponent {
- static propTypes = {
- id: PropTypes.string.isRequired,
- text: PropTypes.string.isRequired,
- selected: PropTypes.bool,
- disabled: PropTypes.bool,
- onSelect: PropTypes.func,
- children: PropTypes.node,
- };
- handleClick = () => {
- const { id, disabled, onSelect } = this.props;
- if (!disabled) {
- onSelect(id);
- }
- };
- render () {
- const { id, text, disabled, selected, children } = this.props;
- return (
- <div tabIndex='0' role='button' className={classNames('report-reason-selector__category', { selected, disabled })} onClick={this.handleClick}>
- {selected && <input type='hidden' name='report[category]' value={id} />}
- <div className='report-reason-selector__category__label'>
- <span className={classNames('poll__input', { active: selected, disabled })} />
- {text}
- </div>
- {(selected && children) && (
- <div className='report-reason-selector__category__rules'>
- {children}
- </div>
- )}
- </div>
- );
- }
- }
- class Rule extends React.PureComponent {
- static propTypes = {
- id: PropTypes.string.isRequired,
- text: PropTypes.string.isRequired,
- selected: PropTypes.bool,
- disabled: PropTypes.bool,
- onToggle: PropTypes.func,
- };
- handleClick = () => {
- const { id, disabled, onToggle } = this.props;
- if (!disabled) {
- onToggle(id);
- }
- };
- render () {
- const { id, text, disabled, selected } = this.props;
- return (
- <div tabIndex='0' role='button' className={classNames('report-reason-selector__rule', { selected, disabled })} onClick={this.handleClick}>
- <span className={classNames('poll__input', { checkbox: true, active: selected, disabled })} />
- {selected && <input type='hidden' name='report[rule_ids][]' value={id} />}
- {text}
- </div>
- );
- }
- }
- export default @injectIntl
- class ReportReasonSelector extends React.PureComponent {
- static propTypes = {
- id: PropTypes.string.isRequired,
- category: PropTypes.string.isRequired,
- rule_ids: PropTypes.arrayOf(PropTypes.string),
- disabled: PropTypes.bool,
- intl: PropTypes.object.isRequired,
- };
- state = {
- category: this.props.category,
- rule_ids: this.props.rule_ids || [],
- rules: [],
- };
- componentDidMount() {
- api().get('/api/v1/instance').then(res => {
- this.setState({
- rules: res.data.rules,
- });
- }).catch(err => {
- console.error(err);
- });
- }
- _save = () => {
- const { id, disabled } = this.props;
- const { category, rule_ids } = this.state;
- if (disabled) {
- return;
- }
- api().put(`/api/v1/admin/reports/${id}`, {
- category,
- rule_ids,
- }).catch(err => {
- console.error(err);
- });
- };
- handleSelect = id => {
- this.setState({ category: id }, () => this._save());
- };
- handleToggle = id => {
- const { rule_ids } = this.state;
- if (rule_ids.includes(id)) {
- this.setState({ rule_ids: rule_ids.filter(x => x !== id ) }, () => this._save());
- } else {
- this.setState({ rule_ids: [...rule_ids, id] }, () => this._save());
- }
- };
- render () {
- const { disabled, intl } = this.props;
- const { rules, category, rule_ids } = this.state;
- return (
- <div className='report-reason-selector'>
- <Category id='other' text={intl.formatMessage(messages.other)} selected={category === 'other'} onSelect={this.handleSelect} disabled={disabled} />
- <Category id='spam' text={intl.formatMessage(messages.spam)} selected={category === 'spam'} onSelect={this.handleSelect} disabled={disabled} />
- <Category id='violation' text={intl.formatMessage(messages.violation)} selected={category === 'violation'} onSelect={this.handleSelect} disabled={disabled}>
- {rules.map(rule => <Rule key={rule.id} id={rule.id} text={rule.text} selected={rule_ids.includes(rule.id)} onToggle={this.handleToggle} disabled={disabled} />)}
- </Category>
- </div>
- );
- }
- }
|