Add in-app notifications for moderation actions/warnings (#30065)
This commit is contained in:
parent
0ec061aa8f
commit
4ef0b48b95
13 changed files with 188 additions and 21 deletions
|
@ -0,0 +1,78 @@
|
|||
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
|
||||
|
||||
import WarningIcon from '@/material-icons/400-24px/warning-fill.svg?react';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
|
||||
// This needs to be kept in sync with app/models/account_warning.rb
|
||||
const messages = defineMessages({
|
||||
none: {
|
||||
id: 'notification.moderation_warning.action_none',
|
||||
defaultMessage: 'Your account has received a moderation warning.',
|
||||
},
|
||||
disable: {
|
||||
id: 'notification.moderation_warning.action_disable',
|
||||
defaultMessage: 'Your account has been disabled.',
|
||||
},
|
||||
mark_statuses_as_sensitive: {
|
||||
id: 'notification.moderation_warning.action_mark_statuses_as_sensitive',
|
||||
defaultMessage: 'Some of your posts have been marked as sensitive.',
|
||||
},
|
||||
delete_statuses: {
|
||||
id: 'notification.moderation_warning.action_delete_statuses',
|
||||
defaultMessage: 'Some of your posts have been removed.',
|
||||
},
|
||||
sensitive: {
|
||||
id: 'notification.moderation_warning.action_sensitive',
|
||||
defaultMessage: 'Your posts will be marked as sensitive from now on.',
|
||||
},
|
||||
silence: {
|
||||
id: 'notification.moderation_warning.action_silence',
|
||||
defaultMessage: 'Your account has been limited.',
|
||||
},
|
||||
suspend: {
|
||||
id: 'notification.moderation_warning.action_suspend',
|
||||
defaultMessage: 'Your account has been suspended.',
|
||||
},
|
||||
});
|
||||
|
||||
interface Props {
|
||||
action:
|
||||
| 'none'
|
||||
| 'disable'
|
||||
| 'mark_statuses_as_sensitive'
|
||||
| 'delete_statuses'
|
||||
| 'sensitive'
|
||||
| 'silence'
|
||||
| 'suspend';
|
||||
id: string;
|
||||
hidden: boolean;
|
||||
}
|
||||
|
||||
export const ModerationWarning: React.FC<Props> = ({ action, id, hidden }) => {
|
||||
const intl = useIntl();
|
||||
|
||||
if (hidden) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<a
|
||||
href={`/disputes/strikes/${id}`}
|
||||
target='_blank'
|
||||
rel='noopener noreferrer'
|
||||
className='notification__moderation-warning'
|
||||
>
|
||||
<Icon id='warning' icon={WarningIcon} />
|
||||
|
||||
<div className='notification__moderation-warning__content'>
|
||||
<p>{intl.formatMessage(messages[action])}</p>
|
||||
<span className='link-button'>
|
||||
<FormattedMessage
|
||||
id='notification.moderation-warning.learn_more'
|
||||
defaultMessage='Learn more'
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
};
|
|
@ -26,6 +26,7 @@ import { WithRouterPropTypes } from 'mastodon/utils/react_router';
|
|||
|
||||
import FollowRequestContainer from '../containers/follow_request_container';
|
||||
|
||||
import { ModerationWarning } from './moderation_warning';
|
||||
import { RelationshipsSeveranceEvent } from './relationships_severance_event';
|
||||
import Report from './report';
|
||||
|
||||
|
@ -40,6 +41,7 @@ const messages = defineMessages({
|
|||
adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' },
|
||||
adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' },
|
||||
relationshipsSevered: { id: 'notification.relationships_severance_event', defaultMessage: 'Lost connections with {name}' },
|
||||
moderationWarning: { id: 'notification.moderation_warning', defaultMessage: 'Your have received a moderation warning' },
|
||||
});
|
||||
|
||||
const notificationForScreenReader = (intl, message, timestamp) => {
|
||||
|
@ -383,6 +385,27 @@ class Notification extends ImmutablePureComponent {
|
|||
);
|
||||
}
|
||||
|
||||
renderModerationWarning (notification) {
|
||||
const { intl, unread, hidden } = this.props;
|
||||
const warning = notification.get('moderation_warning');
|
||||
|
||||
if (!warning) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<HotKeys handlers={this.getHandlers()}>
|
||||
<div className={classNames('notification notification-moderation-warning focusable', { unread })} tabIndex={0} aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.moderationWarning), notification.get('created_at'))}>
|
||||
<ModerationWarning
|
||||
action={warning.get('action')}
|
||||
id={warning.get('id')}
|
||||
hidden={hidden}
|
||||
/>
|
||||
</div>
|
||||
</HotKeys>
|
||||
);
|
||||
}
|
||||
|
||||
renderAdminSignUp (notification, account, link) {
|
||||
const { intl, unread } = this.props;
|
||||
|
||||
|
@ -456,6 +479,8 @@ class Notification extends ImmutablePureComponent {
|
|||
return this.renderPoll(notification, account);
|
||||
case 'severed_relationships':
|
||||
return this.renderRelationshipsSevered(notification);
|
||||
case 'moderation_warning':
|
||||
return this.renderModerationWarning(notification);
|
||||
case 'admin.sign_up':
|
||||
return this.renderAdminSignUp(notification, account, link);
|
||||
case 'admin.report':
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue