From acce32cf1b021255459e0e4081e458858fa4c7ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Tue, 14 Dec 2021 17:00:20 +0100 Subject: [PATCH] Make approval buttons larger, require confirmation when deleting users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/actions/moderation.js | 22 +++++++++++++++++++ .../admin/components/unapproved_account.js | 14 +++++------- app/soapbox/locales/pl.json | 2 ++ app/styles/components/admin.scss | 6 +++-- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/app/soapbox/actions/moderation.js b/app/soapbox/actions/moderation.js index cb84803bd..52652978b 100644 --- a/app/soapbox/actions/moderation.js +++ b/app/soapbox/actions/moderation.js @@ -17,6 +17,8 @@ const messages = defineMessages({ userDeleted: { id: 'admin.users.user_deleted_message', defaultMessage: '@{acct} was deleted' }, deleteStatusPrompt: { id: 'confirmations.admin.delete_status.message', defaultMessage: 'You are about to delete a post by @{acct}. This action cannot be undone.' }, deleteStatusConfirm: { id: 'confirmations.admin.delete_status.confirm', defaultMessage: 'Delete post' }, + rejectUserPrompt: { id: 'confirmations.admin.reject_user.message', defaultMessage: 'You are about to reject @{acct} registration request. This action cannot be undone.' }, + rejectUserConfirm: { id: 'confirmations.admin.reject_user.confirm', defaultMessage: 'Reject @{name}' }, statusDeleted: { id: 'admin.statuses.status_deleted_message', defaultMessage: 'Post by @{acct} was deleted' }, markStatusSensitivePrompt: { id: 'confirmations.admin.mark_status_sensitive.message', defaultMessage: 'You are about to mark a post by @{acct} sensitive.' }, markStatusNotSensitivePrompt: { id: 'confirmations.admin.mark_status_not_sensitive.message', defaultMessage: 'You are about to mark a post by @{acct} not sensitive.' }, @@ -85,6 +87,26 @@ export function deleteUserModal(intl, accountId, afterConfirm = () => {}) { }; } +export function rejectUserModal(intl, accountId, afterConfirm = () => {}) { + return function(dispatch, getState) { + const state = getState(); + const acct = state.getIn(['accounts', accountId, 'acct']); + const name = state.getIn(['accounts', accountId, 'username']); + + dispatch(openModal('CONFIRM', { + message: intl.formatMessage(messages.rejectUserPrompt, { acct }), + confirm: intl.formatMessage(messages.rejectUserConfirm, { name }), + onConfirm: () => { + dispatch(deleteUsers([accountId])) + .then(() => { + afterConfirm(); + }) + .catch(() => {}); + }, + })); + }; +} + export function toggleStatusSensitivityModal(intl, statusId, sensitive, afterConfirm = () => {}) { return function(dispatch, getState) { const state = getState(); diff --git a/app/soapbox/features/admin/components/unapproved_account.js b/app/soapbox/features/admin/components/unapproved_account.js index 621ffbe4b..c63805b4b 100644 --- a/app/soapbox/features/admin/components/unapproved_account.js +++ b/app/soapbox/features/admin/components/unapproved_account.js @@ -5,9 +5,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; import IconButton from 'soapbox/components/icon_button'; -import { deleteUsers, approveUsers } from 'soapbox/actions/admin'; +import { approveUsers } from 'soapbox/actions/admin'; import { makeGetAccount } from 'soapbox/selectors'; import snackbar from 'soapbox/actions/snackbar'; +import { rejectUserModal } from '../../../actions/admin'; const messages = defineMessages({ approved: { id: 'admin.awaiting_approval.approved_message', defaultMessage: '{acct} was approved!' }, @@ -37,7 +38,6 @@ class UnapprovedAccount extends ImmutablePureComponent { handleApprove = () => { const { dispatch, intl, account } = this.props; - dispatch(approveUsers([account.get('id')])) .then(() => { const message = intl.formatMessage(messages.approved, { acct: `@${account.get('acct')}` }); @@ -49,12 +49,10 @@ class UnapprovedAccount extends ImmutablePureComponent { handleReject = () => { const { dispatch, intl, account } = this.props; - dispatch(deleteUsers([account.get('id')])) - .then(() => { - const message = intl.formatMessage(messages.rejected, { acct: `@${account.get('acct')}` }); - dispatch(snackbar.info(message)); - }) - .catch(() => {}); + dispatch(rejectUserModal(intl, account.get('id'), () => { + const message = intl.formatMessage(messages.rejected, { acct: `@${account.get('acct')}` }); + dispatch(snackbar.info(message)); + })); } render() { diff --git a/app/soapbox/locales/pl.json b/app/soapbox/locales/pl.json index 8aea88a1b..61059138c 100644 --- a/app/soapbox/locales/pl.json +++ b/app/soapbox/locales/pl.json @@ -252,6 +252,8 @@ "confirmations.admin.mark_status_not_sensitive.message": "Zamierzasz oznaczyć wpis {acct} jako niewrażliwy.", "confirmations.admin.mark_status_sensitive.confirm": "Oznacz wpis jako wrażliwy", "confirmations.admin.mark_status_sensitive.message": "Zamierzasz oznaczyć wpis {acct} jako wrażliwy.", + "confirmations.admin.reject_user.confirm": "Odrzuć @{name}", + "confirmations.admin.reject_user.message": "Zamierzasz odrzucić prośbę o rejestrację @{acct}. To działanie nie może zostać cofnięte.", "confirmations.block.block_and_report": "Zablokuj i zgłoś", "confirmations.block.confirm": "Zablokuj", "confirmations.block.message": "Czy na pewno chcesz zablokować {name}?", diff --git a/app/styles/components/admin.scss b/app/styles/components/admin.scss index 3f9ed12da..4e3b25f25 100644 --- a/app/styles/components/admin.scss +++ b/app/styles/components/admin.scss @@ -102,10 +102,12 @@ margin-left: auto; display: flex; flex-wrap: nowrap; + column-gap: 10px; padding-left: 20px; - button.icon-button:nth-child(n+2) { - padding-left: 10px; + .svg-icon { + height: 24px; + width: 24px; } } }