| 
									
										
										
										
											2017-09-01 13:35:23 +02:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Web::NotificationSerializer < ActiveModel::Serializer | 
					
						
							| 
									
										
										
										
											2017-09-02 10:03:21 +09:00
										 |  |  |   include RoutingHelper | 
					
						
							| 
									
										
										
										
											2017-09-01 13:35:23 +02:00
										 |  |  |   include StreamEntriesHelper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class DataSerializer < ActiveModel::Serializer | 
					
						
							|  |  |  |     include RoutingHelper | 
					
						
							|  |  |  |     include StreamEntriesHelper | 
					
						
							|  |  |  |     include ActionView::Helpers::SanitizeHelper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     attributes :content, :nsfw, :url, :actions, | 
					
						
							| 
									
										
										
										
											2017-09-01 20:50:42 +02:00
										 |  |  |                :access_token, :message, :dir | 
					
						
							| 
									
										
										
										
											2017-09-01 13:35:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-01 20:50:42 +02:00
										 |  |  |   attributes :title, :image, :badge, :tag, | 
					
						
							| 
									
										
										
										
											2017-09-01 13:35:23 +02:00
										 |  |  |              :timestamp, :icon | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-02 23:50:42 +09:00
										 |  |  |   has_one :data, serializer: DataSerializer | 
					
						
							| 
									
										
										
										
											2017-09-01 13:35:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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 |