Skip to content

Commit 5077db6

Browse files
committed
fix: detach current_context from current_org
1 parent ecf0c08 commit 5077db6

File tree

5 files changed

+85
-82
lines changed

5 files changed

+85
-82
lines changed

lib/algora/accounts/accounts.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@ defmodule Algora.Accounts do
370370
{:ok, Repo.preload(user, :identities, force: true)}
371371
end
372372

373+
def last_context(nil), do: "nil"
374+
373375
def last_context(%User{last_context: nil} = user) do
374376
orgs = Organizations.get_user_orgs(user)
375377

@@ -412,6 +414,15 @@ defmodule Algora.Accounts do
412414

413415
def last_context(%User{last_context: last_context}), do: last_context
414416

417+
def get_last_context_user(nil), do: nil
418+
419+
def get_last_context_user(%User{} = user) do
420+
case last_context(user) do
421+
"personal" -> user
422+
last_context -> get_user_by_handle(last_context)
423+
end
424+
end
425+
415426
def default_context, do: "personal"
416427

417428
def set_context(%User{} = user, "personal") do
@@ -434,6 +445,12 @@ defmodule Algora.Accounts do
434445
end
435446
end
436447

448+
def get_contexts(nil), do: []
449+
450+
def get_contexts(%User{} = user) do
451+
[user | Organizations.get_user_orgs(user)]
452+
end
453+
437454
defp get_flag(user), do: Algora.Misc.CountryEmojis.get(user.country, "🌎")
438455

439456
# TODO: implement this

lib/algora_web/components/core_components.ex

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -300,21 +300,34 @@ defmodule AlgoraWeb.CoreComponents do
300300
def context_selector(assigns) do
301301
~H"""
302302
<.dropdown2 id="dashboard-dropdown">
303-
<:img src={@current_user.avatar_url} alt={@current_user.handle} />
304-
<:title>{@current_user.name}</:title>
303+
<:img src={@current_context.avatar_url} alt={@current_context.handle} />
304+
<:title>{@current_context.name}</:title>
305305
306306
<:link
307-
:for={org <- Algora.Organizations.get_user_orgs(@current_user)}
308-
href={~p"/set_context/#{org.handle}"}
307+
:for={ctx <- @all_contexts}
308+
:if={@current_context.id != ctx.id}
309+
href={
310+
if ctx.id == @current_user.id,
311+
do: ~p"/set_context/personal",
312+
else: ~p"/set_context/#{ctx.handle}"
313+
}
309314
>
310-
<div class="flex items-center">
311-
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
312-
<div class="truncate">
313-
<div class="truncate font-semibold">{org.name}</div>
314-
<div class="truncate text-sm text-gray-500">@{org.handle}</div>
315+
<div class="flex items-center whitespace-nowrap">
316+
<img src={ctx.avatar_url} alt={ctx.name} class="mr-3 h-8 w-8 rounded-full" />
317+
<div>
318+
<div class="font-semibold">{ctx.name}</div>
319+
<div class="text-sm text-gray-500">@{ctx.handle}</div>
315320
</div>
316321
</div>
317322
</:link>
323+
<:link href={~p"/auth/logout"}>
324+
<div class="flex items-center whitespace-nowrap">
325+
<div class="mr-3 flex h-8 w-8 items-center justify-center">
326+
<.icon name="tabler-logout" class="h-5 w-5" />
327+
</div>
328+
<div class="font-semibold">Logout</div>
329+
</div>
330+
</:link>
318331
</.dropdown2>
319332
"""
320333
end

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

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -124,48 +124,11 @@
124124
assigns: %{current_user: @current_user}
125125
)}
126126
<div>
127-
<.dropdown2 id="dashboard-dropdown">
128-
<:img src={@current_org.avatar_url} alt={@current_org.handle} />
129-
<:title>{@current_org.name}</:title>
130-
131-
<:link href={~p"/set_context/personal"}>
132-
<div class="flex items-center whitespace-nowrap">
133-
<img
134-
src={@current_user.avatar_url}
135-
alt={@current_user.name}
136-
class="mr-3 h-8 w-8 rounded-full"
137-
/>
138-
<div>
139-
<div class="font-semibold">{@current_user.name}</div>
140-
<div class="text-sm text-gray-500">@{@current_user.handle}</div>
141-
</div>
142-
</div>
143-
</:link>
144-
<:link
145-
:for={
146-
org <-
147-
Algora.Organizations.get_user_orgs(@current_user)
148-
|> Enum.reject(&(&1.id == @current_org.id))
149-
}
150-
href={~p"/set_context/#{org.handle}"}
151-
>
152-
<div class="flex items-center whitespace-nowrap">
153-
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
154-
<div>
155-
<div class="font-semibold">{org.name}</div>
156-
<div class="text-sm text-gray-500">@{org.handle}</div>
157-
</div>
158-
</div>
159-
</:link>
160-
<:link href={~p"/auth/logout"}>
161-
<div class="flex items-center whitespace-nowrap">
162-
<div class="mr-3 flex h-8 w-8 items-center justify-center">
163-
<.icon name="tabler-logout" class="h-5 w-5" />
164-
</div>
165-
<div class="font-semibold">Logout</div>
166-
</div>
167-
</:link>
168-
</.dropdown2>
127+
<.context_selector
128+
current_user={@current_user}
129+
current_context={@current_context}
130+
all_contexts={@all_contexts}
131+
/>
169132
</div>
170133
<% else %>
171134
<.link

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

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -179,31 +179,11 @@
179179
)}
180180
</div>
181181
<div>
182-
<.dropdown2 id="dashboard-dropdown">
183-
<:img src={@current_user.avatar_url} alt={@current_user.handle} />
184-
<:title>{@current_user.name}</:title>
185-
186-
<:link
187-
:for={org <- Algora.Organizations.get_user_orgs(@current_user)}
188-
href={~p"/set_context/#{org.handle}"}
189-
>
190-
<div class="flex items-center">
191-
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
192-
<div class="truncate">
193-
<div class="truncate font-semibold">{org.name}</div>
194-
<div class="truncate text-sm text-gray-500">@{org.handle}</div>
195-
</div>
196-
</div>
197-
</:link>
198-
<:link href={~p"/auth/logout"}>
199-
<div class="flex items-center whitespace-nowrap">
200-
<div class="mr-3 flex h-8 w-8 items-center justify-center">
201-
<.icon name="tabler-logout" class="h-5 w-5" />
202-
</div>
203-
<div class="font-semibold">Logout</div>
204-
</div>
205-
</:link>
206-
</.dropdown2>
182+
<.context_selector
183+
current_user={@current_user}
184+
current_context={@current_context}
185+
all_contexts={@all_contexts}
186+
/>
207187
</div>
208188
<% else %>
209189
<.link

lib/algora_web/controllers/user_auth.ex

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,21 @@ defmodule AlgoraWeb.UserAuth do
1212
def on_mount(:current_user, _params, session, socket) do
1313
case session do
1414
%{"user_id" => user_id} ->
15-
{:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> Accounts.get_user(user_id) end)}
15+
case socket.assigns[:current_user] do
16+
%Accounts.User{} = _user ->
17+
{:cont, socket}
18+
19+
nil ->
20+
current_user = Accounts.get_user(user_id)
21+
current_context = Accounts.get_last_context_user(current_user)
22+
all_contexts = Accounts.get_contexts(current_user)
23+
24+
{:cont,
25+
socket
26+
|> Phoenix.Component.assign(:current_user, current_user)
27+
|> Phoenix.Component.assign(:current_context, current_context)
28+
|> Phoenix.Component.assign(:all_contexts, all_contexts)}
29+
end
1630

1731
%{} ->
1832
{:cont, Phoenix.Component.assign(socket, :current_user, nil)}
@@ -22,7 +36,11 @@ defmodule AlgoraWeb.UserAuth do
2236
def on_mount(:ensure_authenticated, _params, session, socket) do
2337
case get_authenticated_user(session, socket) do
2438
{:ok, user} ->
25-
{:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> user end)}
39+
{:cont,
40+
socket
41+
|> Phoenix.Component.assign_new(:current_user, fn -> user end)
42+
|> Phoenix.Component.assign_new(:current_context, fn -> Accounts.get_last_context_user(user) end)
43+
|> Phoenix.Component.assign_new(:all_contexts, fn -> Accounts.get_contexts(user) end)}
2644

2745
{:error, :unauthenticated} ->
2846
{:halt, redirect_require_login(socket)}
@@ -36,7 +54,11 @@ defmodule AlgoraWeb.UserAuth do
3654
raise(AlgoraWeb.NotFoundError)
3755
end
3856

39-
{:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> user end)}
57+
{:cont,
58+
socket
59+
|> Phoenix.Component.assign_new(:current_user, fn -> user end)
60+
|> Phoenix.Component.assign_new(:current_context, fn -> Accounts.get_last_context_user(user) end)
61+
|> Phoenix.Component.assign_new(:all_contexts, fn -> Accounts.get_contexts(user) end)}
4062

4163
{:error, :unauthenticated} ->
4264
{:halt, redirect_require_login(socket)}
@@ -48,7 +70,7 @@ defmodule AlgoraWeb.UserAuth do
4870
%{"user_id" => user_id} ->
4971
new_socket = Phoenix.Component.assign_new(socket, :current_user, fn -> Accounts.get_user!(user_id) end)
5072

51-
case new_socket.assigns.current_user do
73+
case new_socket.assigns[:current_user] do
5274
%Accounts.User{} = user ->
5375
{:ok, user}
5476

@@ -94,7 +116,11 @@ defmodule AlgoraWeb.UserAuth do
94116
end
95117

96118
def put_current_user(conn, user) do
97-
conn = assign(conn, :current_user, user)
119+
conn =
120+
conn
121+
|> assign(:current_user, user)
122+
|> assign(:current_context, Accounts.get_last_context_user(user))
123+
|> assign(:all_contexts, Accounts.get_contexts(user))
98124

99125
conn
100126
|> renew_session()
@@ -130,7 +156,11 @@ defmodule AlgoraWeb.UserAuth do
130156
def fetch_current_user(conn, _opts) do
131157
user_id = get_session(conn, :user_id)
132158
user = user_id && Accounts.get_user(user_id)
133-
assign(conn, :current_user, user)
159+
160+
conn
161+
|> assign(:current_user, user)
162+
|> assign(:current_context, Accounts.get_last_context_user(user))
163+
|> assign(:all_contexts, Accounts.get_contexts(user))
134164
end
135165

136166
@doc """

0 commit comments

Comments
 (0)