170 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# 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
 |