From 95c4ba4234b97482d13c9258348f44e5fb62b63e Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 31 Dec 2020 17:54:08 -0600 Subject: [PATCH] Reports: allow deactivating a user --- app/soapbox/actions/admin.js | 17 ++++++++ .../features/admin/components/report.js | 41 +++++++++++++++++-- app/styles/components/admin.scss | 6 ++- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/app/soapbox/actions/admin.js b/app/soapbox/actions/admin.js index a6b38f962..3592b20bc 100644 --- a/app/soapbox/actions/admin.js +++ b/app/soapbox/actions/admin.js @@ -24,6 +24,10 @@ export const ADMIN_USERS_APPROVE_REQUEST = 'ADMIN_USERS_APPROVE_REQUEST'; export const ADMIN_USERS_APPROVE_SUCCESS = 'ADMIN_USERS_APPROVE_SUCCESS'; export const ADMIN_USERS_APPROVE_FAIL = 'ADMIN_USERS_APPROVE_FAIL'; +export const ADMIN_USERS_DEACTIVATE_REQUEST = 'ADMIN_USERS_DEACTIVATE_REQUEST'; +export const ADMIN_USERS_DEACTIVATE_SUCCESS = 'ADMIN_USERS_DEACTIVATE_SUCCESS'; +export const ADMIN_USERS_DEACTIVATE_FAIL = 'ADMIN_USERS_DEACTIVATE_FAIL'; + export function fetchConfig() { return (dispatch, getState) => { dispatch({ type: ADMIN_CONFIG_FETCH_REQUEST }); @@ -76,6 +80,19 @@ export function fetchUsers(params) { }; } +export function deactivateUsers(nicknames) { + return (dispatch, getState) => { + dispatch({ type: ADMIN_USERS_DEACTIVATE_REQUEST, nicknames }); + return api(getState) + .patch('/api/pleroma/admin/users/deactivate', { nicknames }) + .then(({ data: { users } }) => { + dispatch({ type: ADMIN_USERS_DEACTIVATE_SUCCESS, users, nicknames }); + }).catch(error => { + dispatch({ type: ADMIN_USERS_DEACTIVATE_FAIL, error, nicknames }); + }); + }; +} + export function deleteUsers(nicknames) { return (dispatch, getState) => { dispatch({ type: ADMIN_USERS_DELETE_REQUEST, nicknames }); diff --git a/app/soapbox/features/admin/components/report.js b/app/soapbox/features/admin/components/report.js index 0365e3cf2..d0161f441 100644 --- a/app/soapbox/features/admin/components/report.js +++ b/app/soapbox/features/admin/components/report.js @@ -1,21 +1,53 @@ import React from 'react'; +import { connect } from 'react-redux'; import ImmutablePureComponent from 'react-immutable-pure-component'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { FormattedMessage } from 'react-intl'; +import { injectIntl, FormattedMessage, defineMessages } from 'react-intl'; import Avatar from 'soapbox/components/avatar'; +import DropdownMenu from 'soapbox/containers/dropdown_menu_container'; +import { deactivateUsers } from 'soapbox/actions/admin'; +import snackbar from 'soapbox/actions/snackbar'; -export default class Report extends ImmutablePureComponent { +const messages = defineMessages({ + deactivateUser: { id: 'admin.reports.actions.deactivate_user', defaultMessage: 'Deactivate {acct}' }, + deactivated: { id: 'admin.reports.deactivated_message', defaultMessage: '{acct} was deactivated' }, +}); + +export default @connect() +@injectIntl +class Report extends ImmutablePureComponent { static propTypes = { report: ImmutablePropTypes.map.isRequired, }; + makeMenu = () => { + const { intl, report } = this.props; + + return [{ + text: intl.formatMessage(messages.deactivateUser, { acct: `@${report.getIn(['account', 'acct'])}` }), + action: this.handleDeactivateUser, + }]; + } + + handleDeactivateUser = () => { + const { intl, dispatch, report } = this.props; + const nickname = report.getIn(['account', 'acct']); + dispatch(deactivateUsers([nickname])).then(() => { + const message = intl.formatMessage(messages.deactivated, { acct: nickname }); + dispatch(snackbar.success(message)); + }).catch(() => {}); + } + render() { const { report } = this.props; + const menu = this.makeMenu(); return (
- +
+ +

— @{report.getIn(['actor', 'acct'])}

+
+ +
); } diff --git a/app/styles/components/admin.scss b/app/styles/components/admin.scss index 4942144b6..a46265c67 100644 --- a/app/styles/components/admin.scss +++ b/app/styles/components/admin.scss @@ -126,7 +126,7 @@ border-bottom: 1px solid var(--brand-color--faint); &__content { - padding-left: 16px; + padding: 0 16px; } &__title { @@ -140,4 +140,8 @@ font-size: 12px; } } + + &__actions { + margin-left: auto; + } }