diff --git a/app/javascript/flavours/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js
index 80c3b32808..333bc71f4d 100644
--- a/app/javascript/flavours/glitch/actions/reports.js
+++ b/app/javascript/flavours/glitch/actions/reports.js
@@ -1,89 +1,38 @@
import api from 'flavours/glitch/util/api';
-import { openModal, closeModal } from './modal';
-
-export const REPORT_INIT = 'REPORT_INIT';
-export const REPORT_CANCEL = 'REPORT_CANCEL';
+import { openModal } from './modal';
export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
export const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL';
-export const REPORT_STATUS_TOGGLE = 'REPORT_STATUS_TOGGLE';
-export const REPORT_COMMENT_CHANGE = 'REPORT_COMMENT_CHANGE';
-export const REPORT_FORWARD_CHANGE = 'REPORT_FORWARD_CHANGE';
+export const initReport = (account, status) => dispatch =>
+ dispatch(openModal('REPORT', {
+ accountId: account.get('id'),
+ statusId: status?.get('id'),
+ }));
-export function initReport(account, status) {
- return dispatch => {
- dispatch({
- type: REPORT_INIT,
- account,
- status,
- });
+export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
+ dispatch(submitReportRequest());
- dispatch(openModal('REPORT'));
- };
+ api(getState).post('/api/v1/reports', params).then(response => {
+ dispatch(submitReportSuccess(response.data));
+ if (onSuccess) onSuccess();
+ }).catch(error => {
+ dispatch(submitReportFail(error));
+ if (onFail) onFail();
+ });
};
-export function cancelReport() {
- return {
- type: REPORT_CANCEL,
- };
-};
+export const submitReportRequest = () => ({
+ type: REPORT_SUBMIT_REQUEST,
+});
-export function toggleStatusReport(statusId, checked) {
- return {
- type: REPORT_STATUS_TOGGLE,
- statusId,
- checked,
- };
-};
+export const submitReportSuccess = report => ({
+ type: REPORT_SUBMIT_SUCCESS,
+ report,
+});
-export function submitReport() {
- return (dispatch, getState) => {
- dispatch(submitReportRequest());
-
- api(getState).post('/api/v1/reports', {
- account_id: getState().getIn(['reports', 'new', 'account_id']),
- status_ids: getState().getIn(['reports', 'new', 'status_ids']),
- comment: getState().getIn(['reports', 'new', 'comment']),
- forward: getState().getIn(['reports', 'new', 'forward']),
- }).then(response => {
- dispatch(closeModal());
- dispatch(submitReportSuccess(response.data));
- }).catch(error => dispatch(submitReportFail(error)));
- };
-};
-
-export function submitReportRequest() {
- return {
- type: REPORT_SUBMIT_REQUEST,
- };
-};
-
-export function submitReportSuccess(report) {
- return {
- type: REPORT_SUBMIT_SUCCESS,
- report,
- };
-};
-
-export function submitReportFail(error) {
- return {
- type: REPORT_SUBMIT_FAIL,
- error,
- };
-};
-
-export function changeReportComment(comment) {
- return {
- type: REPORT_COMMENT_CHANGE,
- comment,
- };
-};
-
-export function changeReportForward(forward) {
- return {
- type: REPORT_FORWARD_CHANGE,
- forward,
- };
-};
+export const submitReportFail = error => ({
+ type: REPORT_SUBMIT_FAIL,
+ error,
+});
diff --git a/app/javascript/flavours/glitch/actions/rules.js b/app/javascript/flavours/glitch/actions/rules.js
new file mode 100644
index 0000000000..b95045e81a
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/rules.js
@@ -0,0 +1,27 @@
+import api from 'flavours/glitch/util/api';
+
+export const RULES_FETCH_REQUEST = 'RULES_FETCH_REQUEST';
+export const RULES_FETCH_SUCCESS = 'RULES_FETCH_SUCCESS';
+export const RULES_FETCH_FAIL = 'RULES_FETCH_FAIL';
+
+export const fetchRules = () => (dispatch, getState) => {
+ dispatch(fetchRulesRequest());
+
+ api(getState)
+ .get('/api/v1/instance').then(({ data }) => dispatch(fetchRulesSuccess(data.rules)))
+ .catch(err => dispatch(fetchRulesFail(err)));
+};
+
+const fetchRulesRequest = () => ({
+ type: RULES_FETCH_REQUEST,
+});
+
+const fetchRulesSuccess = rules => ({
+ type: RULES_FETCH_SUCCESS,
+ rules,
+});
+
+const fetchRulesFail = error => ({
+ type: RULES_FETCH_FAIL,
+ error,
+});
diff --git a/app/javascript/flavours/glitch/components/check.js b/app/javascript/flavours/glitch/components/check.js
new file mode 100644
index 0000000000..ee2ef1595a
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/check.js
@@ -0,0 +1,9 @@
+import React from 'react';
+
+const Check = () => (
+
+);
+
+export default Check;
diff --git a/app/javascript/flavours/glitch/features/report/category.js b/app/javascript/flavours/glitch/features/report/category.js
new file mode 100644
index 0000000000..ddbc825635
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/report/category.js
@@ -0,0 +1,93 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import Button from 'flavours/glitch/components/button';
+import Option from './components/option';
+
+const messages = defineMessages({
+ dislike: { id: 'report.reasons.dislike', defaultMessage: 'I don\'t like it' },
+ dislike_description: { id: 'report.reasons.dislike_description', defaultMessage: 'It is not something you want to see' },
+ spam: { id: 'report.reasons.spam', defaultMessage: 'It\'s spam' },
+ spam_description: { id: 'report.reasons.spam_description', defaultMessage: 'Malicious links, fake engagement, or repetetive replies' },
+ violation: { id: 'report.reasons.violation', defaultMessage: 'It violates server rules' },
+ violation_description: { id: 'report.reasons.violation_description', defaultMessage: 'You are aware that it breaks specific rules' },
+ other: { id: 'report.reasons.other', defaultMessage: 'It\'s something else' },
+ other_description: { id: 'report.reasons.other_description', defaultMessage: 'The issue does not fit into other categories' },
+ status: { id: 'report.category.title_status', defaultMessage: 'post' },
+ account: { id: 'report.category.title_account', defaultMessage: 'profile' },
+});
+
+export default @injectIntl
+class Category extends React.PureComponent {
+
+ static propTypes = {
+ onNextStep: PropTypes.func.isRequired,
+ category: PropTypes.string,
+ onChangeCategory: PropTypes.func.isRequired,
+ startedFrom: PropTypes.oneOf(['status', 'account']),
+ intl: PropTypes.object.isRequired,
+ };
+
+ handleNextClick = () => {
+ const { onNextStep, category } = this.props;
+
+ switch(category) {
+ case 'dislike':
+ onNextStep('thanks');
+ break;
+ case 'violation':
+ onNextStep('rules');
+ break;
+ default:
+ onNextStep('statuses');
+ break;
+ }
+ };
+
+ handleCategoryToggle = (value, checked) => {
+ const { onChangeCategory } = this.props;
+
+ if (checked) {
+ onChangeCategory(value);
+ }
+ };
+
+ render () {
+ const { category, startedFrom, intl } = this.props;
+
+ const options = [
+ 'dislike',
+ 'spam',
+ 'violation',
+ 'other',
+ ];
+
+ return (
+
+
+
+
+
+ {isRemote && (
+
{submitted ?
{submitted ?