Skip to content

Commit a11f962

Browse files
committed
add User.{url,handle} functions to handle all types of users
1 parent c85c8d2 commit a11f962

24 files changed

+82
-59
lines changed

lib/algora/accounts/schemas/user.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,4 +299,11 @@ defmodule Algora.Accounts.User do
299299

300300
defp type_from_provider(:github, "Organization"), do: :organization
301301
defp type_from_provider(:github, _), do: :individual
302+
303+
def handle(%User{handle: handle}), do: handle
304+
def handle(%User{provider_login: handle}), do: handle
305+
306+
def url(%User{handle: handle, type: :individual}), do: "/@/#{handle}"
307+
def url(%User{handle: handle, type: :organization}), do: "/org/#{handle}"
308+
def url(%User{provider_login: handle}), do: "https://github.com/#{handle}"
302309
end

lib/algora/chat/chat.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ defmodule Algora.Chat do
22
@moduledoc false
33
import Ecto.Query
44

5+
alias Algora.Accounts.User
56
alias Algora.Chat.Message
67
alias Algora.Chat.Participant
78
alias Algora.Chat.Thread
@@ -11,7 +12,7 @@ defmodule Algora.Chat do
1112
Repo.transaction(fn ->
1213
{:ok, thread} =
1314
%Thread{}
14-
|> Thread.changeset(%{title: "#{user_1.handle} <> #{user_2.handle}"})
15+
|> Thread.changeset(%{title: "#{User.handle(user_1)} <> #{User.handle(user_2)}"})
1516
|> Repo.insert()
1617

1718
# Add participants

lib/algora_web/components/bounties.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ defmodule AlgoraWeb.Components.Bounties do
44

55
import AlgoraWeb.CoreComponents
66

7+
alias Algora.Accounts.User
8+
79
def bounties(assigns) do
810
~H"""
911
<div class="relative -mx-2 -mt-2 overflow-auto">
@@ -42,11 +44,11 @@ defmodule AlgoraWeb.Components.Bounties do
4244
<td class="px-2 py-2 pr-2 sm:px-6">
4345
<div class="flex justify-end -space-x-2">
4446
<%= for bounty <- Enum.take(ticket.top_bounties, 3) do %>
45-
<.link href={"https://github.com/#{bounty.owner.provider_login}"}>
47+
<.link navigate={User.url(bounty.owner)}>
4648
<.avatar class="h-8 w-8">
4749
<.avatar_image src={bounty.owner.avatar_url} />
4850
<.avatar_fallback>
49-
{String.slice(bounty.owner.provider_login, 0, 2)}
51+
{String.slice(User.handle(bounty.owner), 0, 2)}
5052
</.avatar_fallback>
5153
</.avatar>
5254
</.link>

lib/algora_web/components/layouts/org.html.heex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,13 @@
3535
<li>
3636
<.link
3737
class="flex justify-center p-2"
38-
navigate={~p"/@/#{user.handle}"}
39-
title={user.handle}
38+
navigate={Algora.Accounts.User.url(user)}
39+
title={Algora.Accounts.User.handle(user)}
4040
>
4141
<div class="relative inline-block">
4242
<div class="relative h-8 w-8 flex-shrink-0 overflow-hidden rounded-full">
4343
<img
44-
alt={user.handle}
44+
alt={Algora.Accounts.User.handle(user)}
4545
loading="lazy"
4646
decoding="async"
4747
src={user.avatar_url}

lib/algora_web/components/layouts/user.html.heex

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,15 @@
8888
<ul role="list" class="space-y-1">
8989
<%= for org <- @online_orgs do %>
9090
<li>
91-
<.link class="flex justify-center p-2" navigate={"/#{org.handle}"} title={org.handle}>
91+
<.link
92+
class="flex justify-center p-2"
93+
navigate={Algora.Accounts.User.url(org)}
94+
title={Algora.Accounts.User.handle(org)}
95+
>
9296
<div class="relative inline-block">
9397
<div class="relative h-8 w-8 flex-shrink-0 overflow-hidden rounded-full">
9498
<img
95-
alt={org.handle}
99+
alt={Algora.Accounts.User.handle(org)}
96100
loading="lazy"
97101
decoding="async"
98102
src={org.avatar_url}

lib/algora_web/live/chat_live.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule AlgoraWeb.ChatLive do
33
use AlgoraWeb, :live_view
44

55
alias Algora.Accounts
6+
alias Algora.Accounts.User
67

78
def mount(_params, _session, socket) do
89
# Get current user details
@@ -391,7 +392,7 @@ defmodule AlgoraWeb.ChatLive do
391392
<h3 class="mt-4 text-lg font-semibold">
392393
{@other_user.name} {@other_user.flag}
393394
</h3>
394-
<p class="text-sm text-muted-foreground">@{@other_user.handle}</p>
395+
<p class="text-sm text-muted-foreground">@{User.handle(@other_user)}</p>
395396
396397
<div class="-mx-1 mt-3 flex flex-wrap justify-center gap-1">
397398
<%= for tech <- Enum.take(@other_user.tech_stack || [], 3) do %>
@@ -443,7 +444,7 @@ defmodule AlgoraWeb.ChatLive do
443444
</div>
444445
445446
<div class="mt-auto p-4 text-center">
446-
<.button variant="outline" href={"/devs/#{@other_user.handle}"} class="w-full">
447+
<.button variant="outline" navigate={User.url(@other_user)} class="w-full">
447448
View Full Profile <.icon name="tabler-arrow-right" class="ml-2 h-4 w-4" />
448449
</.button>
449450
</div>

lib/algora_web/live/contract/view_live.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ defmodule AlgoraWeb.Contract.ViewLive do
22
@moduledoc false
33
use AlgoraWeb, :live_view
44

5+
alias Algora.Accounts.User
56
alias Algora.Chat
67
alias Algora.Contracts
78
alias Algora.Contracts.Contract
@@ -242,7 +243,7 @@ defmodule AlgoraWeb.Contract.ViewLive do
242243
<div>
243244
<div class="text-lg font-medium">{@contract.client.name}</div>
244245
<div class="text-sm text-muted-foreground">
245-
@{@contract.client.handle}
246+
@{User.handle(@contract.client)}
246247
</div>
247248
</div>
248249
</div>
@@ -278,7 +279,7 @@ defmodule AlgoraWeb.Contract.ViewLive do
278279
<div>
279280
<div class="text-lg font-medium">{@contract.contractor.name}</div>
280281
<div class="text-sm text-muted-foreground">
281-
@{@contract.contractor.handle}
282+
@{User.handle(@contract.contractor)}
282283
</div>
283284
</div>
284285
</div>

lib/algora_web/live/dev_live.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ defmodule AlgoraWeb.DevLive do
22
@moduledoc false
33
use AlgoraWeb, :live_view
44

5+
alias Algora.Accounts.User
6+
57
def mount(_params, _session, socket) do
68
project = %{
79
title: "Looking for an Elixir developer to build a real-time chat application",
@@ -778,7 +780,7 @@ defmodule AlgoraWeb.DevLive do
778780
{dev.name} {dev.flag}
779781
</div>
780782
<div class="truncate text-sm text-muted-foreground">
781-
@{dev.handle}
783+
@{User.handle(dev)}
782784
</div>
783785
</div>
784786
<div class="shrink-0 text-right">

lib/algora_web/live/job/create_live.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule AlgoraWeb.Job.CreateLive do
33
use AlgoraWeb, :live_view
44

55
alias Algora.Accounts
6+
alias Algora.Accounts.User
67

78
def mount(_params, session, socket) do
89
job = %{
@@ -77,7 +78,7 @@ defmodule AlgoraWeb.Job.CreateLive do
7778
<div class="flex justify-between">
7879
<div>
7980
<div class="font-semibold">{dev.name} {dev.flag}</div>
80-
<div class="text-sm text-gray-400">@{dev.handle}</div>
81+
<div class="text-sm text-gray-400">@{User.handle(dev)}</div>
8182
</div>
8283
<div class="flex flex-col items-end">
8384
<div class="text-gray-300">Earned</div>

lib/algora_web/live/leaderboard_live.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule AlgoraWeb.LeaderboardLive do
66
import Ecto.Query
77

88
alias Algora.Accounts
9+
alias Algora.Accounts.User
910
alias Algora.Misc.CountryEmojis
1011
alias Algora.Payments.Transaction
1112
alias Algora.Repo
@@ -67,7 +68,7 @@ defmodule AlgoraWeb.LeaderboardLive do
6768
</.avatar>
6869
<div>
6970
<div class="text-2xl font-semibold text-gray-100">{user.name}</div>
70-
<div class="text-lg font-medium text-gray-300">@{user.provider_login}</div>
71+
<div class="text-lg font-medium text-gray-300">@{User.handle(user)}</div>
7172
<div class="font-mono text-lg font-medium text-indigo-400">{user.id}</div>
7273
</div>
7374
</div>

0 commit comments

Comments
 (0)