Turn user avatar into a link to their profile

This commit is contained in:
MareStare 2025-03-10 21:05:31 +00:00
parent 6f4709e1e4
commit 34aa6f96fd
7 changed files with 38 additions and 37 deletions

View file

@ -1,6 +1,6 @@
.profile-top
.profile-top__avatar
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, conn: @conn
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, conn: @conn, no_profile_link: true
.profile-top__name-and-links
div
h1 Your avatar

View file

@ -73,7 +73,7 @@ header.header
.dropdown.header__dropdown
a.header__link.header__link-user href=~p"/profiles/#{@current_user}"
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, class: "avatar--28px"
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @current_user}, class: "avatar--28px", no_profile_link: true
span.header__link-user__dropdown-arrow.hide-mobile data-click-preventdefault="true"
nav.dropdown__content.dropdown__content-right.hide-mobile.js-burger-links
a.header__link href=~p"/profiles/#{@current_user}"

View file

@ -1,6 +1,6 @@
.profile-top
.profile-top__avatar
- avatar = render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @user}, class: "avatar--125px"
- avatar = render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: @user}, class: "avatar--125px", no_profile_link: true
= if current?(@user, @conn.assigns.current_user) do
= link avatar, to: ~p"/avatar/edit?#{[profile: true]}", title: "Change avatar"
- else

View file

@ -2,7 +2,7 @@ h1 Staff
.block.block--fixed.block--warning
h3 Do you wish to submit a report?
p
strong>
strong>
' Do
em not
' PM staff members with your reports. Instead, if you think something breaks
@ -38,7 +38,7 @@ h1 Staff
.staff-block__user-card
.staff-block__avatar
a.profile-block href=~p"/profiles/#{user}"
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: user}, class: "avatar--125px"
= render PhilomenaWeb.UserAttributionView, "_user_avatar.html", object: %{user: user}, class: "avatar--125px", no_profile_link: true
p
b = user.name
.staff-block__info

View file

@ -1,4 +1 @@
= if !!@object.user and !anonymous?(@object) do
= user_avatar(@object, assigns[:class] || "avatar--100px")
- else
= anonymous_avatar(anonymous_name(@object), assigns[:class] || "avatar--100px")
= user_avatar(@object, class: assigns[:class], no_profile_link: assigns[:no_profile_link])

View file

@ -1,2 +1,2 @@
= if !!@object.user do
= user_avatar(@object, assigns[:class] || "avatar--100px")
= user_avatar(@object, class: assigns[:class], no_profile_link: assigns[:no_profile_link])

View file

@ -5,18 +5,21 @@ defmodule PhilomenaWeb.UserAttributionView do
alias PhilomenaWeb.AvatarGeneratorView
def anonymous?(object) do
Attribution.anonymous?(object)
# This function may accept objects that don't have `Attribution` implemented.
not is_nil(Attribution.impl_for(object)) and Attribution.anonymous?(object)
end
def anonymous_user?(object), do: is_nil(object.user) or anonymous?(object)
def name(object) do
case is_nil(object.user) or anonymous?(object) do
case anonymous_user?(object) do
true -> anonymous_name(object)
_false -> object.user.name
end
end
def avatar_url(object) do
case is_nil(object.user) or anonymous?(object) do
case anonymous_user?(object) do
true -> anonymous_avatar_url(anonymous_name(object))
_false -> user_avatar_url(object)
end
@ -40,39 +43,40 @@ defmodule PhilomenaWeb.UserAttributionView do
end
end
def anonymous_avatar(name, class \\ "avatar--100px") do
class = Enum.join(["image-constrained", class], " ")
def user_avatar(object, opts \\ []) do
class = Keyword.get(opts, :class) || "avatar--100px"
no_profile_link = Keyword.get(opts, :no_profile_link) || false
content_tag :div, class: class do
AvatarGeneratorView.generated_avatar(name)
end
anon = anonymous_user?(object)
content =
if anon or is_nil(object.user.avatar) do
AvatarGeneratorView.generated_avatar(name(object))
else
img_tag(avatar_url_root() <> "/" <> object.user.avatar)
end
{tag, attrs} =
if anon or no_profile_link do
{:div, []}
else
{:a, href: ~p"/profiles/#{object.user}"}
end
attrs = Keyword.put(attrs, :class, "image-constrained #{class}")
content_tag(tag, content, attrs)
end
def user_avatar(object, class \\ "avatar--100px")
def user_avatar(%{user: nil} = object, class),
do: anonymous_avatar(anonymous_name(object), class)
def user_avatar(%{user: %{avatar: nil}} = object, class),
do: anonymous_avatar(object.user.name, class)
def user_avatar(%{user: %{avatar: avatar}}, class) do
class = Enum.join(["image-constrained", class], " ")
content_tag :div, class: class do
img_tag(avatar_url_root() <> "/" <> avatar)
end
end
def user_avatar_url(%{user: %{avatar: nil}} = object) do
defp user_avatar_url(%{user: %{avatar: nil}} = object) do
anonymous_avatar_url(object.user.name)
end
def user_avatar_url(%{user: %{avatar: avatar}}) do
defp user_avatar_url(%{user: %{avatar: avatar}}) do
avatar_url_root() <> "/" <> avatar
end
def anonymous_avatar_url(name) do
defp anonymous_avatar_url(name) do
svg =
name
|> AvatarGeneratorView.generated_avatar()