You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
3.8 KiB
169 lines
3.8 KiB
# frozen_string_literal: true |
|
|
|
class Web::NotificationSerializer < ActiveModel::Serializer |
|
include RoutingHelper |
|
include StreamEntriesHelper |
|
|
|
class DataSerializer < ActiveModel::Serializer |
|
include RoutingHelper |
|
include StreamEntriesHelper |
|
include ActionView::Helpers::SanitizeHelper |
|
|
|
attributes :content, :nsfw, :url, :actions, |
|
:access_token, :message, :dir |
|
|
|
def content |
|
decoder.decode(strip_tags(body)) |
|
end |
|
|
|
def dir |
|
rtl?(body) ? 'rtl' : 'ltr' |
|
end |
|
|
|
def nsfw |
|
return if object.target_status.nil? |
|
object.target_status.spoiler_text.presence |
|
end |
|
|
|
def url |
|
case object.type |
|
when :mention |
|
web_url("statuses/#{object.target_status.id}") |
|
when :follow |
|
web_url("accounts/#{object.from_account.id}") |
|
when :favourite |
|
web_url("statuses/#{object.target_status.id}") |
|
when :reblog |
|
web_url("statuses/#{object.target_status.id}") |
|
end |
|
end |
|
|
|
def actions |
|
return @actions if defined?(@actions) |
|
|
|
@actions = [] |
|
|
|
if object.type == :mention |
|
@actions << expand_action if collapsed? |
|
@actions << favourite_action |
|
@actions << reblog_action if rebloggable? |
|
end |
|
|
|
@actions |
|
end |
|
|
|
def access_token |
|
return if actions.empty? |
|
current_push_subscription.access_token |
|
end |
|
|
|
def message |
|
I18n.t('push_notifications.group.title') |
|
end |
|
|
|
private |
|
|
|
def body |
|
case object.type |
|
when :mention |
|
object.target_status.text |
|
when :follow |
|
object.from_account.note |
|
when :favourite |
|
object.target_status.text |
|
when :reblog |
|
object.target_status.text |
|
end |
|
end |
|
|
|
def decoder |
|
@decoder ||= HTMLEntities.new |
|
end |
|
|
|
def expand_action |
|
{ |
|
title: I18n.t('push_notifications.mention.action_expand'), |
|
icon: full_asset_url('web-push-icon_expand.png', skip_pipeline: true), |
|
todo: 'expand', |
|
action: 'expand', |
|
} |
|
end |
|
|
|
def favourite_action |
|
{ |
|
title: I18n.t('push_notifications.mention.action_favourite'), |
|
icon: full_asset_url('web-push-icon_favourite.png', skip_pipeline: true), |
|
todo: 'request', |
|
method: 'POST', |
|
action: "/api/v1/statuses/#{object.target_status.id}/favourite", |
|
} |
|
end |
|
|
|
def reblog_action |
|
{ |
|
title: I18n.t('push_notifications.mention.action_boost'), |
|
icon: full_asset_url('web-push-icon_reblog.png', skip_pipeline: true), |
|
todo: 'request', |
|
method: 'POST', |
|
action: "/api/v1/statuses/#{object.target_status.id}/reblog", |
|
} |
|
end |
|
|
|
def collapsed? |
|
!object.target_status.nil? && (object.target_status.sensitive? || object.target_status.spoiler_text.present?) |
|
end |
|
|
|
def rebloggable? |
|
!object.target_status.nil? && !object.target_status.hidden? |
|
end |
|
end |
|
|
|
attributes :title, :image, :badge, :tag, |
|
:timestamp, :icon |
|
|
|
has_one :data, serializer: DataSerializer |
|
|
|
def title |
|
case object.type |
|
when :mention |
|
I18n.t('push_notifications.mention.title', name: name) |
|
when :follow |
|
I18n.t('push_notifications.follow.title', name: name) |
|
when :favourite |
|
I18n.t('push_notifications.favourite.title', name: name) |
|
when :reblog |
|
I18n.t('push_notifications.reblog.title', name: name) |
|
end |
|
end |
|
|
|
def image |
|
return if object.target_status.nil? || object.target_status.media_attachments.empty? |
|
full_asset_url(object.target_status.media_attachments.first.file.url(:small)) |
|
end |
|
|
|
def badge |
|
full_asset_url('badge.png', skip_pipeline: true) |
|
end |
|
|
|
def tag |
|
object.id |
|
end |
|
|
|
def timestamp |
|
object.created_at |
|
end |
|
|
|
def icon |
|
object.from_account.avatar_static_url |
|
end |
|
|
|
def data |
|
object |
|
end |
|
|
|
private |
|
|
|
def name |
|
display_name(object.from_account) |
|
end |
|
end
|
|
|