# 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
|