cherry-pick emoji reaction changes
This commit is contained in:
parent
738433e46a
commit
19491d2032
18 changed files with 111 additions and 18 deletions
|
@ -139,6 +139,7 @@ const excludeTypesFromFilter = filter => {
|
|||
'follow',
|
||||
'follow_request',
|
||||
'favourite',
|
||||
'reaction',
|
||||
'reblog',
|
||||
'mention',
|
||||
'poll',
|
||||
|
|
|
@ -726,6 +726,7 @@ class Status extends ImmutablePureComponent {
|
|||
if (this.props.prepend && account) {
|
||||
const notifKind = {
|
||||
favourite: 'favourited',
|
||||
reaction: 'reacted',
|
||||
reblog: 'boosted',
|
||||
reblogged_by: 'boosted',
|
||||
status: 'posted',
|
||||
|
|
|
@ -56,6 +56,14 @@ export default class StatusPrepend extends React.PureComponent {
|
|||
values={{ name : link }}
|
||||
/>
|
||||
);
|
||||
case 'reaction':
|
||||
return (
|
||||
<FormattedMessage
|
||||
id='notification.reaction'
|
||||
defaultMessage='{name} reacted to your post'
|
||||
values={{ name: link }}
|
||||
/>
|
||||
);
|
||||
case 'reblog':
|
||||
return (
|
||||
<FormattedMessage
|
||||
|
@ -110,6 +118,9 @@ export default class StatusPrepend extends React.PureComponent {
|
|||
case 'favourite':
|
||||
iconId = 'star';
|
||||
break;
|
||||
case 'reaction':
|
||||
iconId = 'plus';
|
||||
break;
|
||||
case 'featured':
|
||||
iconId = 'thumb-tack';
|
||||
break;
|
||||
|
|
|
@ -18,7 +18,6 @@ export default class StatusReactionsBar extends ImmutablePureComponent {
|
|||
static propTypes = {
|
||||
statusId: PropTypes.string.isRequired,
|
||||
reactions: ImmutablePropTypes.list.isRequired,
|
||||
reactionLimit: PropTypes.number.isRequired,
|
||||
addReaction: PropTypes.func.isRequired,
|
||||
removeReaction: PropTypes.func.isRequired,
|
||||
emojiMap: ImmutablePropTypes.map.isRequired,
|
||||
|
|
|
@ -116,6 +116,17 @@ export default class ColumnSettings extends React.PureComponent {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div role='group' aria-labelledby='notifications-reaction'>
|
||||
<span id='notifications-reaction' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reaction' defaultMessage='Reactions:' /></span>
|
||||
|
||||
<div className='column-settings__pillbar'>
|
||||
<PillBarButton disabled={browserPermission === 'denied'} prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reaction']} onChange={onChange} label={alertStr} />
|
||||
{showPushSettings && <PillBarButton prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reaction']} onChange={this.onPushChange} label={pushStr} />}
|
||||
<PillBarButton prefix='notifications' settings={settings} settingPath={['shows', 'reaction']} onChange={onChange} label={showStr} />
|
||||
<PillBarButton prefix='notifications' settings={settings} settingPath={['sounds', 'reaction']} onChange={onChange} label={soundStr} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div role='group' aria-labelledby='notifications-mention'>
|
||||
<span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import Icon from 'flavours/glitch/components/icon';
|
|||
const tooltips = defineMessages({
|
||||
mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },
|
||||
favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },
|
||||
reactions: { id: 'notifications.filter.reactions', defaultMessage: 'Reactions' },
|
||||
boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },
|
||||
polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },
|
||||
follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },
|
||||
|
@ -74,6 +75,13 @@ class FilterBar extends React.PureComponent {
|
|||
>
|
||||
<Icon id='star' fixedWidth />
|
||||
</button>
|
||||
<button
|
||||
className={selectedFilter === 'reaction' ? 'active' : ''}
|
||||
onClick={this.onClick('reaction')}
|
||||
title={intl.formatMessage(tooltips.reactions)}
|
||||
>
|
||||
<Icon id='plus' fixedWidth />
|
||||
</button>
|
||||
<button
|
||||
className={selectedFilter === 'reblog' ? 'active' : ''}
|
||||
onClick={this.onClick('reblog')}
|
||||
|
|
|
@ -155,6 +155,28 @@ export default class Notification extends ImmutablePureComponent {
|
|||
unread={this.props.unread}
|
||||
/>
|
||||
);
|
||||
case 'reaction':
|
||||
return (
|
||||
<StatusContainer
|
||||
containerId={notification.get('id')}
|
||||
hidden={hidden}
|
||||
id={notification.get('status')}
|
||||
account={notification.get('account')}
|
||||
prepend='reaction'
|
||||
muted
|
||||
notification={notification}
|
||||
onMoveDown={onMoveDown}
|
||||
onMoveUp={onMoveUp}
|
||||
onMention={onMention}
|
||||
getScrollPosition={getScrollPosition}
|
||||
updateScrollBottom={updateScrollBottom}
|
||||
cachedMediaWidth={this.props.cachedMediaWidth}
|
||||
cacheMediaWidth={this.props.cacheMediaWidth}
|
||||
onUnmount={this.props.onUnmount}
|
||||
withDismiss
|
||||
unread={this.props.unread}
|
||||
/>
|
||||
);
|
||||
case 'reblog':
|
||||
return (
|
||||
<StatusContainer
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
import inherited from 'mastodon/locales/de.json';
|
||||
|
||||
const messages = {
|
||||
// No translations available.
|
||||
'notification.reaction': '{name} hat auf deinen Beitrag reagiert',
|
||||
'notifications.column_settings.reaction': 'Reaktionen:',
|
||||
|
||||
'tooltips.reactions': 'Reaktionen',
|
||||
};
|
||||
|
||||
export default Object.assign({}, inherited, messages);
|
||||
|
|
|
@ -147,7 +147,9 @@ const messages = {
|
|||
'home.column_settings.show_direct': 'Show DMs',
|
||||
|
||||
'notification.markForDeletion': 'Mark for deletion',
|
||||
'notification.reaction': '{name} reacted to your post',
|
||||
'notifications.clear': 'Clear all my notifications',
|
||||
'notifications.column_settings.reaction': 'Reactions:',
|
||||
'notifications.marked_clear_confirmation': 'Are you sure you want to permanently clear all selected notifications?',
|
||||
'notifications.marked_clear': 'Clear selected notifications',
|
||||
|
||||
|
@ -187,6 +189,8 @@ const messages = {
|
|||
'keyboard_shortcuts.bookmark': 'to bookmark',
|
||||
'keyboard_shortcuts.toggle_collapse': 'to collapse/uncollapse toots',
|
||||
'keyboard_shortcuts.secondary_toot': 'to send toot using secondary privacy setting',
|
||||
|
||||
'tooltips.reactions': 'Reactions',
|
||||
};
|
||||
|
||||
export default Object.assign({}, inherited, messages);
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
import inherited from 'mastodon/locales/fr.json';
|
||||
|
||||
const messages = {
|
||||
// No translations available.
|
||||
'notification.reaction': '{name} a réagi·e à votre message',
|
||||
'notifications.column_settings.reaction': 'Réactions:',
|
||||
|
||||
'tooltips.reactions': 'Réactions',
|
||||
};
|
||||
|
||||
export default Object.assign({}, inherited, messages);
|
||||
|
|
|
@ -37,6 +37,7 @@ const initialState = ImmutableMap({
|
|||
follow: false,
|
||||
follow_request: false,
|
||||
favourite: false,
|
||||
reaction: false,
|
||||
reblog: false,
|
||||
mention: false,
|
||||
poll: false,
|
||||
|
@ -60,6 +61,7 @@ const initialState = ImmutableMap({
|
|||
follow_request: false,
|
||||
favourite: true,
|
||||
reblog: true,
|
||||
reaction: true,
|
||||
mention: true,
|
||||
poll: true,
|
||||
status: true,
|
||||
|
@ -73,6 +75,7 @@ const initialState = ImmutableMap({
|
|||
follow_request: false,
|
||||
favourite: true,
|
||||
reblog: true,
|
||||
reaction: true,
|
||||
mention: true,
|
||||
poll: true,
|
||||
status: true,
|
||||
|
|
|
@ -19,12 +19,13 @@ class Notification < ApplicationRecord
|
|||
include Paginable
|
||||
|
||||
LEGACY_TYPE_CLASS_MAP = {
|
||||
'Mention' => :mention,
|
||||
'Status' => :reblog,
|
||||
'Follow' => :follow,
|
||||
'FollowRequest' => :follow_request,
|
||||
'Favourite' => :favourite,
|
||||
'Poll' => :poll,
|
||||
'Mention' => :mention,
|
||||
'Status' => :reblog,
|
||||
'Follow' => :follow,
|
||||
'FollowRequest' => :follow_request,
|
||||
'Favourite' => :favourite,
|
||||
'StatusReaction' => :reaction,
|
||||
'Poll' => :poll,
|
||||
}.freeze
|
||||
|
||||
TYPES = %i(
|
||||
|
@ -34,6 +35,7 @@ class Notification < ApplicationRecord
|
|||
follow
|
||||
follow_request
|
||||
favourite
|
||||
reaction
|
||||
poll
|
||||
update
|
||||
admin.sign_up
|
||||
|
@ -45,6 +47,7 @@ class Notification < ApplicationRecord
|
|||
reblog: [status: :reblog],
|
||||
mention: [mention: :status],
|
||||
favourite: [favourite: :status],
|
||||
reaction: [status_reaction: :status],
|
||||
poll: [poll: :status],
|
||||
update: :status,
|
||||
'admin.report': [report: :target_account],
|
||||
|
@ -54,13 +57,14 @@ class Notification < ApplicationRecord
|
|||
belongs_to :from_account, class_name: 'Account', optional: true
|
||||
belongs_to :activity, polymorphic: true, optional: true
|
||||
|
||||
belongs_to :mention, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :status, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :follow, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :follow_request, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :favourite, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :poll, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :report, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :mention, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :status, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :follow, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :follow_request, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :favourite, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :poll, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :report, foreign_key: 'activity_id', optional: true
|
||||
belongs_to :status_reaction, foreign_key: 'activity_id', optional: true
|
||||
|
||||
validates :type, inclusion: { in: TYPES }
|
||||
|
||||
|
@ -78,6 +82,8 @@ class Notification < ApplicationRecord
|
|||
status&.reblog
|
||||
when :favourite
|
||||
favourite&.status
|
||||
when :reaction
|
||||
status_reaction&.status
|
||||
when :mention
|
||||
mention&.status
|
||||
when :poll
|
||||
|
@ -129,6 +135,8 @@ class Notification < ApplicationRecord
|
|||
notification.status.reblog = cached_status
|
||||
when :favourite
|
||||
notification.favourite.status = cached_status
|
||||
when :reaction
|
||||
notification.reaction.status = cached_status
|
||||
when :mention
|
||||
notification.mention.status = cached_status
|
||||
when :poll
|
||||
|
@ -140,6 +148,8 @@ class Notification < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
alias reaction status_reaction
|
||||
|
||||
after_initialize :set_from_account
|
||||
before_validation :set_from_account
|
||||
|
||||
|
@ -149,7 +159,7 @@ class Notification < ApplicationRecord
|
|||
return unless new_record?
|
||||
|
||||
case activity_type
|
||||
when 'Status', 'Follow', 'Favourite', 'FollowRequest', 'Poll', 'Report'
|
||||
when 'Status', 'Follow', 'Favourite', 'StatusReaction', 'FollowRequest', 'Poll', 'Report'
|
||||
self.from_account_id = activity&.account_id
|
||||
when 'Mention'
|
||||
self.from_account_id = activity&.status&.account_id
|
||||
|
|
|
@ -12,7 +12,7 @@ class REST::NotificationSerializer < ActiveModel::Serializer
|
|||
end
|
||||
|
||||
def status_type?
|
||||
[:favourite, :reblog, :status, :mention, :poll, :update].include?(object.type)
|
||||
[:favourite, :reaction, :reblog, :status, :mention, :poll, :update].include?(object.type)
|
||||
end
|
||||
|
||||
def report_type?
|
||||
|
|
|
@ -14,6 +14,7 @@ class StatusReactionService < BaseService
|
|||
|
||||
json = Oj.dump(serialize_payload(reaction, ActivityPub::EmojiReactionSerializer))
|
||||
if status.account.local?
|
||||
NotifyService.new.call(status.account, :reaction, reaction)
|
||||
ActivityPub::RawDistributionWorker.perform_async(json, status.account.id)
|
||||
else
|
||||
ActivityPub::DeliveryWorker.perform_async(json, reaction.account_id, status.account.inbox_url)
|
||||
|
|
|
@ -1285,6 +1285,10 @@ de:
|
|||
body: 'Dein Beitrag wurde von %{name} favorisiert:'
|
||||
subject: "%{name} hat deinen Beitrag favorisiert"
|
||||
title: Neue Favorisierung
|
||||
reaction:
|
||||
body: '%{name} hat auf deinen Beitrag reagiert:'
|
||||
subject: '%{name} hat auf deinen Beitrag reagiert'
|
||||
title: Neue Reaktion
|
||||
follow:
|
||||
body: "%{name} folgt dir jetzt!"
|
||||
subject: "%{name} folgt dir jetzt"
|
||||
|
|
|
@ -1292,6 +1292,10 @@ en:
|
|||
body: 'Your post was favourited by %{name}:'
|
||||
subject: "%{name} favourited your post"
|
||||
title: New favourite
|
||||
reaction:
|
||||
body: '%{name} reacted to your post:'
|
||||
subject: '%{name} reacted to your post'
|
||||
title: New reaction
|
||||
follow:
|
||||
body: "%{name} is now following you!"
|
||||
subject: "%{name} is now following you"
|
||||
|
|
|
@ -707,6 +707,10 @@ en_GB:
|
|||
body: 'Your status was favourited by %{name}:'
|
||||
subject: "%{name} favourited your status"
|
||||
title: New favourite
|
||||
reaction:
|
||||
body: '%{name} reacted on your post with %{reaction}:'
|
||||
subject: '%{name} reacted on your post'
|
||||
title: New reaction
|
||||
follow:
|
||||
body: "%{name} is now following you!"
|
||||
subject: "%{name} is now following you"
|
||||
|
|
|
@ -1285,6 +1285,10 @@ fr:
|
|||
body: "%{name} a ajouté votre message à ses favoris :"
|
||||
subject: "%{name} a ajouté votre message à ses favoris"
|
||||
title: Nouveau favori
|
||||
reaction:
|
||||
body: '%{name} a réagi·e à votre message:'
|
||||
subject: '%{name} a réagi·e à votre message'
|
||||
title: Nouvelle réaction
|
||||
follow:
|
||||
body: "%{name} vous suit !"
|
||||
subject: "%{name} vous suit"
|
||||
|
|
Loading…
Reference in a new issue