diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx index f8d646b07..b7cd99511 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_mention.tsx @@ -2,26 +2,33 @@ import { FormattedMessage } from 'react-intl'; import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import ReplyIcon from '@/material-icons/400-24px/reply-fill.svg?react'; -import type { StatusVisibility } from 'mastodon/api_types/statuses'; +import { me } from 'mastodon/initial_state'; import type { NotificationGroupMention } from 'mastodon/models/notification_group'; +import type { Status } from 'mastodon/models/status'; import { useAppSelector } from 'mastodon/store'; import type { LabelRenderer } from './notification_group_with_status'; import { NotificationWithStatus } from './notification_with_status'; -const labelRenderer: LabelRenderer = (values) => ( +const mentionLabelRenderer: LabelRenderer = () => ( + +); + +const privateMentionLabelRenderer: LabelRenderer = () => ( ); -const privateMentionLabelRenderer: LabelRenderer = (values) => ( +const replyLabelRenderer: LabelRenderer = () => ( + +); + +const privateReplyLabelRenderer: LabelRenderer = () => ( ); @@ -29,27 +36,30 @@ export const NotificationMention: React.FC<{ notification: NotificationGroupMention; unread: boolean; }> = ({ notification, unread }) => { - const statusVisibility = useAppSelector( - (state) => - state.statuses.getIn([ - notification.statusId, - 'visibility', - ]) as StatusVisibility, - ); + const [isDirect, isReply] = useAppSelector((state) => { + const status = state.statuses.get(notification.statusId) as Status; + + return [ + status.get('visibility') === 'direct', + status.get('in_reply_to_account_id') === me, + ] as const; + }); + + let labelRenderer = mentionLabelRenderer; + + if (isReply && isDirect) labelRenderer = privateReplyLabelRenderer; + else if (isReply) labelRenderer = replyLabelRenderer; + else if (isDirect) labelRenderer = privateMentionLabelRenderer; return ( ); diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 8db48c1a2..86afa7cd0 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -482,7 +482,11 @@ "notification.favourite": "{name} favorited your post", "notification.follow": "{name} followed you", "notification.follow_request": "{name} has requested to follow you", - "notification.mention": "{name} mentioned you", + "notification.label.mention": "Mention", + "notification.label.private_mention": "Private mention", + "notification.label.private_reply": "Private reply", + "notification.label.reply": "Reply", + "notification.mention": "Mention", "notification.moderation-warning.learn_more": "Learn more", "notification.moderation_warning": "You have received a moderation warning", "notification.moderation_warning.action_delete_statuses": "Some of your posts have been removed.", @@ -494,7 +498,6 @@ "notification.moderation_warning.action_suspend": "Your account has been suspended.", "notification.own_poll": "Your poll has ended", "notification.poll": "A poll you voted in has ended", - "notification.private_mention": "{name} privately mentioned you", "notification.reblog": "{name} boosted your post", "notification.relationships_severance_event": "Lost connections with {name}", "notification.relationships_severance_event.account_suspension": "An admin from {from} has suspended {target}, which means you can no longer receive updates from them or interact with them.",