diff --git a/src/actions/admin.ts b/src/actions/admin.ts index 0bfe1ed3f..e6c3f5225 100644 --- a/src/actions/admin.ts +++ b/src/actions/admin.ts @@ -270,6 +270,14 @@ const fetchUsers = (filters: string[] = [], page = 1, query?: string | null, pag } }; +const revokeName = (accountId: string, reportId?: string) => + (dispatch: AppDispatch, getState: () => RootState) => + api(getState) + .post(`/api/v1/admin/accounts/${accountId}/action`, { + type: 'revoke_name', + report_id: reportId, + }); + const deactivateMastodonUsers = (accountIds: string[], reportId?: string) => (dispatch: AppDispatch, getState: () => RootState) => Promise.all(accountIds.map(accountId => { @@ -631,6 +639,7 @@ export { deleteUser, approveUser, rejectUser, + revokeName, deleteStatus, toggleStatusSensitivity, tagUsers, diff --git a/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx b/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx index 76ea614d9..12fd96e17 100644 --- a/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx +++ b/src/features/ui/components/modals/account-moderation-modal/account-moderation-modal.tsx @@ -1,7 +1,7 @@ import React, { ChangeEventHandler, useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; -import { setBadges as saveBadges } from 'soapbox/actions/admin'; +import { revokeName, setBadges as saveBadges } from 'soapbox/actions/admin'; import { deactivateUserModal, deleteUserModal } from 'soapbox/actions/moderation'; import { useAccount } from 'soapbox/api/hooks'; import { useSuggest, useVerify } from 'soapbox/api/hooks/admin'; @@ -25,6 +25,7 @@ const messages = defineMessages({ userSuggested: { id: 'admin.users.user_suggested_message', defaultMessage: '@{acct} was suggested' }, userUnsuggested: { id: 'admin.users.user_unsuggested_message', defaultMessage: '@{acct} was unsuggested' }, badgesSaved: { id: 'admin.users.badges_saved_message', defaultMessage: 'Custom badges updated.' }, + revokedName: { id: 'admin.users.revoked_name_message', defaultMessage: 'Name revoked.' }, }); interface IAccountModerationModal { @@ -88,6 +89,12 @@ const AccountModerationModal: React.FC = ({ onClose, ac dispatch(deactivateUserModal(intl, account.id)); }; + const handleRevokeName = () => { + dispatch(revokeName(account.id)) + .then(() => toast.success(intl.formatMessage(messages.revokedName))) + .catch(() => {}); + }; + const handleDelete = () => { dispatch(deleteUserModal(intl, account.id)); }; @@ -151,6 +158,13 @@ const AccountModerationModal: React.FC = ({ onClose, ac + {features.revokeName && ( + } + onClick={handleRevokeName} + /> + )} + } onClick={handleDeactivate} diff --git a/src/locales/en.json b/src/locales/en.json index 0886b831d..0785a7df0 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -74,6 +74,7 @@ "account_moderation_modal.fields.badges": "Custom badges", "account_moderation_modal.fields.deactivate": "Deactivate account", "account_moderation_modal.fields.delete": "Delete account", + "account_moderation_modal.fields.revoke_name": "Revoke name", "account_moderation_modal.fields.suggested": "Suggested in people to follow", "account_moderation_modal.fields.verified": "Verified account", "account_moderation_modal.info.id": "ID: {id}", @@ -183,6 +184,7 @@ "admin.users.actions.promote_to_moderator_message": "@{acct} was promoted to a moderator", "admin.users.badges_saved_message": "Custom badges updated.", "admin.users.remove_donor_message": "@{acct} was removed as a donor", + "admin.users.revoked_name_message": "Name revoked.", "admin.users.set_donor_message": "@{acct} was set as a donor", "admin.users.user_deactivated_message": "@{acct} was deactivated", "admin.users.user_deleted_message": "@{acct} was deleted", @@ -642,6 +644,10 @@ "edit_federation.save": "Save", "edit_federation.success": "{host} federation was updated", "edit_federation.unlisted": "Force posts unlisted", + "edit_identity.names_title": "Names", + "edit_identity.pending_names_title": "Requested Names", + "edit_identity.reason_placeholder": "Why do you want this name?", + "edit_identity.request": "Request", "edit_password.header": "Change Password", "edit_profile.error": "Profile update failed", "edit_profile.fields.accepts_email_list_label": "Subscribe to newsletter", diff --git a/src/utils/features.ts b/src/utils/features.ts index b5aa122be..b411de57c 100644 --- a/src/utils/features.ts +++ b/src/utils/features.ts @@ -944,6 +944,9 @@ const getInstanceFeatures = (instance: Instance) => { */ resetPassword: v.software === PLEROMA, + /** Admin can revoke the user's identity (without deleting their account). */ + revokeName: v.software === DITTO, + /** * Ability to post statuses in Markdown, BBCode, and HTML. * @see POST /api/v1/statuses