gitlab-org--gitlab-foss/app/components/pajamas/avatar_component.rb

70 lines
1.9 KiB
Ruby

# frozen_string_literal: true
module Pajamas
class AvatarComponent < Pajamas::Component
include Gitlab::Utils::StrongMemoize
# @param record [User, Project, Group]
# @param alt [String] text for the alt tag
# @param class [String] custom CSS class(es)
# @param size [Integer] size in pixel
# @param [Hash] avatar_options
def initialize(record, alt: nil, class: "", size: 64, avatar_options: {})
@record = record
@alt = alt
@class = binding.local_variable_get(:class)
@size = filter_attribute(size.to_i, SIZE_OPTIONS, default: 64)
@avatar_options = avatar_options
end
SIZE_OPTIONS = [16, 24, 32, 48, 64, 96].freeze
private
def avatar_classes
classes = ["gl-avatar", "gl-avatar-s#{@size}", @class]
classes.push("gl-avatar-circle") if @record.is_a?(User)
unless src
classes.push("gl-avatar-identicon")
classes.push("gl-avatar-identicon-bg#{((@record.id || 0) % 7) + 1}")
end
classes.join(' ')
end
def src
strong_memoize(:src) do
if @record.is_a?(User)
# Users show a gravatar instead of an identicon. Also avatars of
# blocked users are only shown if the current_user is an admin.
# To not duplicate this logic, we are using existing helpers here.
current_user = begin
helpers.current_user
rescue StandardError
nil
end
helpers.avatar_icon_for_user(@record, @size, current_user: current_user)
elsif @record.try(:avatar_url)
"#{@record.avatar_url}?width=#{@size}"
end
end
end
def srcset
return unless src
retina_src = src.gsub(/(?<=width=)#{@size}+/, (@size * 2).to_s)
"#{src} 1x, #{retina_src} 2x"
end
def alt
@alt || @record.name
end
def initial
@record.name[0, 1].upcase
end
end
end