sharetribe/sharetribe

View on GitHub
app/view_utils/person_view_utils.rb

Summary

Maintainability
A
25 mins
Test Coverage
module PersonViewUtils
  module_function

  # This method is an adapter to `display_name` method.
  # Makes the use easier by allowing Person and Community models as parameters
  def person_display_name(person, community)
    person_display_names(person, community).join(" ")
  end

  def person_display_names(person, community)
    person_display_names_for_type(person, community.name_display_type)
  end

  def person_display_name_for_type(person, name_display_type)
    person_display_names_for_type(person, name_display_type).join(" ")
  end

  def person_display_names_for_type(person, name_display_type)
    if person.nil?
      names(
        first_name: nil,
        last_name: nil,
        display_name: nil,
        username: nil,
        name_display_type: nil,
        is_deleted: true,
        deleted_user_text: I18n.translate("common.removed_user"),
        banned: nil,
        banned_text: I18n.translate("common.banned_user")
      )
    else
      names(
        first_name: person.given_name,
        last_name: person.family_name,
        display_name: person.display_name,
        username: person.username,
        name_display_type: name_display_type,
        is_deleted: person.deleted?,
        deleted_user_text: I18n.translate("common.removed_user"),
        banned: person.banned?,
        banned_text: I18n.translate("common.banned_user")
      )
    end
  end

  # This is another adapter to `display_name`.
  # It accepts person entity
  def person_entity_display_name(person_entity, name_display_type)
    person_entity_display_names(person_entity, name_display_type).join(" ")
  end

  def person_entity_display_names(person_entity, name_display_type)
    if person_entity.nil?
      names(
        first_name: nil,
        last_name: nil,
        display_name: nil,
        username: nil,
        name_display_type: name_display_type,
        is_deleted: true,
        deleted_user_text: I18n.translate("common.removed_user"),
        banned: nil,
        banned_text: I18n.translate("common.banned_user")
      )
    else
      names(
        first_name: person_entity[:first_name],
        last_name: person_entity[:last_name],
        display_name: person_entity[:display_name],
        username: person_entity[:username],
        name_display_type: name_display_type,
        is_deleted: person_entity[:is_deleted],
        deleted_user_text: I18n.translate("common.removed_user"),
        banned: person_entity[:is_banned],
        banned_text: I18n.translate("common.banned_user")
      )
    end
  end

  def names(
        first_name:,
        last_name:,
        display_name:,
        username:,
        name_display_type:,
        is_deleted:,
        deleted_user_text:,
        banned:,
        banned_text:
        )
    name_present = first_name.present?
    display_name_present = display_name.present?

    full_name = case [is_deleted, name_present, display_name_present, name_display_type]
                when matches([true])
                  [deleted_user_text]
                when matches([__, __, true])
                  [display_name]
                when matches([__, true, __, "first_name_with_initial"])
                  first_name_with_initial(first_name, last_name)
                when matches([__, true, __, "first_name_only"])
                  [first_name]
                when matches([__, true, __, "full_name"])
                  full_name(first_name, last_name)
                when matches([__, true])
                  first_name_with_initial(first_name, last_name)
                else
                  [username]
                end

    full_name << banned_text if banned && !is_deleted
    full_name
  end

  def display_name(
        first_name:,
        last_name:,
        display_name:,
        username:,
        name_display_type:,
        is_deleted:,
        deleted_user_text:,
        banned:,
        banned_text:
        )
    names(first_name: first_name,
          last_name: last_name,
          display_name: display_name,
          username: username,
          name_display_type: name_display_type,
          is_deleted: is_deleted,
          deleted_user_text: deleted_user_text,
          banned: banned,
          banned_text: banned_text).join(" ")
  end

  def full_name(first_name, last_name)
    [first_name.to_s, last_name.to_s]
  end

  def first_name_with_initial(first_name, last_name)
    if last_name.present?
      [first_name.to_s, last_name[0, 1].to_s]
    else
      [first_name]
    end
  end
end