From 0f966209ca4a16dbf6f3163d0a29dc6740215b9f Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 20 Mar 2024 16:37:21 +0100 Subject: [PATCH] [Glitch] Add notifications of severed relationships Port 44bf7b812894f9c8d67cbfbb1a23b0091aa601c5 to glitch-soc Signed-off-by: Claire --- .../notifications/components/notification.jsx | 29 +++++++++ .../relationships_severance_event.jsx | 61 +++++++++++++++++++ .../flavours/glitch/reducers/notifications.js | 1 + 3 files changed, 91 insertions(+) create mode 100644 app/javascript/flavours/glitch/features/notifications/components/relationships_severance_event.jsx diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.jsx b/app/javascript/flavours/glitch/features/notifications/components/notification.jsx index 4aac5e8d6d..c0d0a30eeb 100644 --- a/app/javascript/flavours/glitch/features/notifications/components/notification.jsx +++ b/app/javascript/flavours/glitch/features/notifications/components/notification.jsx @@ -11,6 +11,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import LinkOffIcon from '@/material-icons/400-24px/link_off.svg?react'; import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; import { Icon } from 'flavours/glitch/components/icon'; @@ -22,10 +23,12 @@ import { WithRouterPropTypes } from 'flavours/glitch/utils/react_router'; import FollowRequestContainer from '../containers/follow_request_container'; import NotificationOverlayContainer from '../containers/overlay_container'; +import RelationshipsSeveranceEvent from './relationships_severance_event'; import Report from './report'; const messages = defineMessages({ follow: { id: 'notification.follow', defaultMessage: '{name} followed you' }, + severedRelationships: { id: 'notification.severed_relationships', defaultMessage: 'Relationships with {name} severed' }, adminSignUp: { id: 'notification.admin.sign_up', defaultMessage: '{name} signed up' }, adminReport: { id: 'notification.admin.report', defaultMessage: '{name} reported {target}' }, }); @@ -303,6 +306,30 @@ class Notification extends ImmutablePureComponent { ); } + renderRelationshipsSevered (notification) { + const { intl, unread } = this.props; + + if (!notification.get('event')) { + return null; + } + + return ( + +
+
+ + + + + +
+ + +
+
+ ); + } + renderAdminSignUp (notification, account, link) { const { intl, unread } = this.props; @@ -396,6 +423,8 @@ class Notification extends ImmutablePureComponent { return this.renderUpdate(notification); case 'poll': return this.renderPoll(notification); + case 'severed_relationships': + return this.renderRelationshipsSevered(notification); case 'admin.sign_up': return this.renderAdminSignUp(notification, account, link); case 'admin.report': diff --git a/app/javascript/flavours/glitch/features/notifications/components/relationships_severance_event.jsx b/app/javascript/flavours/glitch/features/notifications/components/relationships_severance_event.jsx new file mode 100644 index 0000000000..62da3102fb --- /dev/null +++ b/app/javascript/flavours/glitch/features/notifications/components/relationships_severance_event.jsx @@ -0,0 +1,61 @@ +import PropTypes from 'prop-types'; + +import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; + +import ImmutablePropTypes from 'react-immutable-proptypes'; + +import { RelativeTimestamp } from 'flavours/glitch/components/relative_timestamp'; + +// This needs to be kept in sync with app/models/relationship_severance_event.rb +const messages = defineMessages({ + account_suspension: { id: 'relationship_severance_notification.types.account_suspension', defaultMessage: 'Account has been suspended' }, + domain_block: { id: 'relationship_severance_notification.types.domain_block', defaultMessage: 'Domain has been suspended' }, + user_domain_block: { id: 'relationship_severance_notification.types.user_domain_block', defaultMessage: 'You blocked this domain' }, +}); + +const RelationshipsSeveranceEvent = ({ event, hidden }) => { + const intl = useIntl(); + + if (hidden || !event) { + return null; + } + + return ( +
+
+
+ + {' ยท '} + { event.get('purged') ? ( + + ) : ( + + )} +
+ {intl.formatMessage(messages[event.get('type')])} +
+ +
+ + + +
+
+
+ ); + +}; + +RelationshipsSeveranceEvent.propTypes = { + event: ImmutablePropTypes.map.isRequired, + hidden: PropTypes.bool, +}; + +export default RelationshipsSeveranceEvent; diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js index c6d70945ba..14862bef07 100644 --- a/app/javascript/flavours/glitch/reducers/notifications.js +++ b/app/javascript/flavours/glitch/reducers/notifications.js @@ -61,6 +61,7 @@ export const notificationToMap = (notification, markForDelete = false) => Immuta markedForDelete: markForDelete, status: notification.status ? notification.status.id : null, report: notification.report ? fromJS(notification.report) : null, + event: notification.event ? fromJS(notification.event) : null, }); const normalizeNotification = (state, notification, usePendingItems) => {