diff --git a/app/javascript/mastodon/api_types/notifications.ts b/app/javascript/mastodon/api_types/notifications.ts index 190d8c83966..69fd17a2563 100644 --- a/app/javascript/mastodon/api_types/notifications.ts +++ b/app/javascript/mastodon/api_types/notifications.ts @@ -13,6 +13,7 @@ export const allNotificationTypes = [ 'favourite', 'reblog', 'mention', + 'quote', 'poll', 'status', 'update', @@ -28,6 +29,7 @@ export type NotificationWithStatusType = | 'reblog' | 'status' | 'mention' + | 'quote' | 'poll' | 'update'; diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index b38e5da1594..ced09881a43 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -8,9 +8,9 @@ import { Link, withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; - import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import FormatQuoteIcon from '@/material-icons/400-24px/format_quote.svg?react'; import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; @@ -42,6 +42,7 @@ const messages = defineMessages({ 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: 'You have received a moderation warning' }, + quote: { id: 'notification.label.quote', defaultMessage: '{name} quoted your post'} }); const notificationForScreenReader = (intl, message, timestamp) => { @@ -251,6 +252,36 @@ class Notification extends ImmutablePureComponent { ); } + renderQuote (notification, link) { + const { intl, unread } = this.props; + + return ( + +
+
+ + + + + +
+ +
+
+ ); + } + renderStatus (notification, link) { const { intl, unread, status } = this.props; @@ -467,6 +498,8 @@ class Notification extends ImmutablePureComponent { return this.renderFollowRequest(notification, account, link); case 'mention': return this.renderMention(notification); + case 'quote': + return this.renderQuote(notification); case 'favourite': return this.renderFavourite(notification, link); case 'reblog': diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx index f0f2139ad21..eba39e17b7a 100644 --- a/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_group.tsx @@ -15,6 +15,7 @@ import { NotificationFollowRequest } from './notification_follow_request'; import { NotificationMention } from './notification_mention'; import { NotificationModerationWarning } from './notification_moderation_warning'; import { NotificationPoll } from './notification_poll'; +import { NotificationQuote } from './notification_quote'; import { NotificationReblog } from './notification_reblog'; import { NotificationSeveredRelationships } from './notification_severed_relationships'; import { NotificationStatus } from './notification_status'; @@ -91,6 +92,11 @@ export const NotificationGroup: React.FC<{ ); break; + case 'quote': + content = ( + + ); + break; case 'follow': content = ( diff --git a/app/javascript/mastodon/features/notifications_v2/components/notification_quote.tsx b/app/javascript/mastodon/features/notifications_v2/components/notification_quote.tsx new file mode 100644 index 00000000000..595bed806c6 --- /dev/null +++ b/app/javascript/mastodon/features/notifications_v2/components/notification_quote.tsx @@ -0,0 +1,33 @@ +import { FormattedMessage } from 'react-intl'; + +import FormatQuoteIcon from '@/material-icons/400-24px/format_quote.svg?react'; +import type { NotificationGroupQuote } from 'mastodon/models/notification_group'; + +import type { LabelRenderer } from './notification_group_with_status'; +import { NotificationWithStatus } from './notification_with_status'; + +const quoteLabelRenderer: LabelRenderer = (displayName) => ( + +); + +export const NotificationQuote: React.FC<{ + notification: NotificationGroupQuote; + unread: boolean; +}> = ({ notification, unread }) => { + return ( + + ); +}; diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 329ac90589e..c91516695b0 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -600,6 +600,7 @@ "notification.label.mention": "Mention", "notification.label.private_mention": "Private mention", "notification.label.private_reply": "Private reply", + "notification.label.quote": "{name} quoted your post", "notification.label.reply": "Reply", "notification.mention": "Mention", "notification.mentioned_you": "{name} mentioned you", diff --git a/app/javascript/mastodon/models/notification_group.ts b/app/javascript/mastodon/models/notification_group.ts index d98e755aa2c..9394cbbed88 100644 --- a/app/javascript/mastodon/models/notification_group.ts +++ b/app/javascript/mastodon/models/notification_group.ts @@ -36,6 +36,7 @@ export type NotificationGroupFavourite = export type NotificationGroupReblog = BaseNotificationWithStatus<'reblog'>; export type NotificationGroupStatus = BaseNotificationWithStatus<'status'>; export type NotificationGroupMention = BaseNotificationWithStatus<'mention'>; +export type NotificationGroupQuote = BaseNotificationWithStatus<'quote'>; export type NotificationGroupPoll = BaseNotificationWithStatus<'poll'>; export type NotificationGroupUpdate = BaseNotificationWithStatus<'update'>; export type NotificationGroupFollow = BaseNotification<'follow'>; @@ -87,6 +88,7 @@ export type NotificationGroup = | NotificationGroupReblog | NotificationGroupStatus | NotificationGroupMention + | NotificationGroupQuote | NotificationGroupPoll | NotificationGroupUpdate | NotificationGroupFollow @@ -137,6 +139,7 @@ export function createNotificationGroupFromJSON( case 'reblog': case 'status': case 'mention': + case 'quote': case 'poll': case 'update': { const { status_id: statusId, ...groupWithoutStatus } = group; @@ -209,6 +212,7 @@ export function createNotificationGroupFromNotificationJSON( case 'reblog': case 'status': case 'mention': + case 'quote': case 'poll': case 'update': return { diff --git a/app/javascript/material-icons/400-24px/format_quote-fill.svg b/app/javascript/material-icons/400-24px/format_quote-fill.svg new file mode 100644 index 00000000000..f4afa3ed17f --- /dev/null +++ b/app/javascript/material-icons/400-24px/format_quote-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/javascript/material-icons/400-24px/format_quote.svg b/app/javascript/material-icons/400-24px/format_quote.svg new file mode 100644 index 00000000000..c354385ea93 --- /dev/null +++ b/app/javascript/material-icons/400-24px/format_quote.svg @@ -0,0 +1 @@ + \ No newline at end of file