app/presenters/activity_presenter.rb

Summary

Maintainability
A
0 mins
Test Coverage
class ActivityPresenter
  include Presenter

  required_keys :object, :ctx

  def trackable
    @trackable ||= object.trackable
  end

  def owner
    @owner ||= object.owner
  end

  def name
    trackable.try(:name)
  end

  def url
    ctx.url_for trackable
  end

  def type
    ctx.object_type trackable
  end

  def avatar
    object_avatar trackable, !user_itself?
  end

  def owner_avatar
    object_avatar owner
  end

  def object_avatar(obj, allow_image = true)
    return ctx.image_tag obj.avatar.thumb.url if obj.try(:avatar) && allow_image

    case type
    when :map      then ctx.icon :globe
    when :geo_data then ctx.icon :'map-marker'
    when :user     then ctx.icon :user
    else ctx.icon :question
    end
  end

  def changes
    changeset = object.parameters[:changes]
    if changeset.nil? || changeset.empty?
      ""
    else
      ctx.icon("edit", changeset.keys.to_sentence).html_safe
    end
  end

  def time
    object.created_at
  end

  def time_ago
    ctx.t('time_ago', time: ctx.time_ago_in_words(time))
  end

  def event
    "<span class=\"event-type\">#{ event_type }</span> #{headline}".html_safe
  end

  def event_with_owner
    "#{ owner_link } <span class=\"event-type\">#{ event_type }</span> #{headline}".html_safe
  end

  def owner_link
    ctx.link_to(owner.name, ctx.url_for(owner), class: "event-owner").html_safe
  end

  def event_type
    ctx.t "activities.event.#{object.key.split('.').last}"
  end

  def user_itself?
    # using `owner_id` instead of `owner` to avoid unnecessary `includes(:owner)`
    type == :user && trackable.id == object.owner_id
  end

  def headline
    text = user_itself? ? ctx.t("profile") : name
    ctx.link_to(text, url, class: "trackable").html_safe
  end
end