72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { FormattedMessage } from 'react-intl';
|
|
|
|
import { isEqual } from 'lodash';
|
|
|
|
import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react';
|
|
import ReplyIcon from '@/material-icons/400-24px/reply-fill.svg?react';
|
|
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 mentionLabelRenderer: LabelRenderer = () => (
|
|
<FormattedMessage id='notification.label.mention' defaultMessage='Mention' />
|
|
);
|
|
|
|
const privateMentionLabelRenderer: LabelRenderer = () => (
|
|
<FormattedMessage
|
|
id='notification.label.private_mention'
|
|
defaultMessage='Private mention'
|
|
/>
|
|
);
|
|
|
|
const replyLabelRenderer: LabelRenderer = () => (
|
|
<FormattedMessage id='notification.label.reply' defaultMessage='Reply' />
|
|
);
|
|
|
|
const privateReplyLabelRenderer: LabelRenderer = () => (
|
|
<FormattedMessage
|
|
id='notification.label.private_reply'
|
|
defaultMessage='Private reply'
|
|
/>
|
|
);
|
|
|
|
export const NotificationMention: React.FC<{
|
|
notification: NotificationGroupMention;
|
|
unread: boolean;
|
|
}> = ({ notification, unread }) => {
|
|
const [isDirect, isReply] = useAppSelector((state) => {
|
|
const status = state.statuses.get(notification.statusId) as
|
|
| Status
|
|
| undefined;
|
|
|
|
if (!status) return [false, false] as const;
|
|
|
|
return [
|
|
status.get('visibility') === 'direct',
|
|
status.get('in_reply_to_account_id') === me,
|
|
] as const;
|
|
}, isEqual);
|
|
|
|
let labelRenderer = mentionLabelRenderer;
|
|
|
|
if (isReply && isDirect) labelRenderer = privateReplyLabelRenderer;
|
|
else if (isReply) labelRenderer = replyLabelRenderer;
|
|
else if (isDirect) labelRenderer = privateMentionLabelRenderer;
|
|
|
|
return (
|
|
<NotificationWithStatus
|
|
type='mention'
|
|
icon={isReply ? ReplyIcon : AlternateEmailIcon}
|
|
iconId='reply'
|
|
accountIds={notification.sampleAccountIds}
|
|
count={notification.notifications_count}
|
|
statusId={notification.statusId}
|
|
labelRenderer={labelRenderer}
|
|
unread={unread}
|
|
/>
|
|
);
|
|
};
|