diff --git a/lib/algora/accounts/accounts.ex b/lib/algora/accounts/accounts.ex
index 0c75523b8..8b02fb92f 100644
--- a/lib/algora/accounts/accounts.ex
+++ b/lib/algora/accounts/accounts.ex
@@ -370,6 +370,8 @@ defmodule Algora.Accounts do
{:ok, Repo.preload(user, :identities, force: true)}
end
+ def last_context(nil), do: "nil"
+
def last_context(%User{last_context: nil} = user) do
orgs = Organizations.get_user_orgs(user)
@@ -412,6 +414,15 @@ defmodule Algora.Accounts do
def last_context(%User{last_context: last_context}), do: last_context
+ def get_last_context_user(nil), do: nil
+
+ def get_last_context_user(%User{} = user) do
+ case last_context(user) do
+ "personal" -> user
+ last_context -> get_user_by_handle(last_context)
+ end
+ end
+
def default_context, do: "personal"
def set_context(%User{} = user, "personal") do
@@ -434,6 +445,12 @@ defmodule Algora.Accounts do
end
end
+ def get_contexts(nil), do: []
+
+ def get_contexts(%User{} = user) do
+ [user | Organizations.get_user_orgs(user)]
+ end
+
defp get_flag(user), do: Algora.Misc.CountryEmojis.get(user.country, "🌎")
# TODO: implement this
diff --git a/lib/algora_web/components/core_components.ex b/lib/algora_web/components/core_components.ex
index ecf95ef47..9040a7fcf 100644
--- a/lib/algora_web/components/core_components.ex
+++ b/lib/algora_web/components/core_components.ex
@@ -300,21 +300,34 @@ defmodule AlgoraWeb.CoreComponents do
def context_selector(assigns) do
~H"""
<.dropdown2 id="dashboard-dropdown">
- <:img src={@current_user.avatar_url} alt={@current_user.handle} />
- <:title>{@current_user.name}
+ <:img src={@current_context.avatar_url} alt={@current_context.handle} />
+ <:title>{@current_context.name}
<:link
- :for={org <- Algora.Organizations.get_user_orgs(@current_user)}
- href={~p"/set_context/#{org.handle}"}
+ :for={ctx <- @all_contexts}
+ :if={@current_context.id != ctx.id}
+ href={
+ if ctx.id == @current_user.id,
+ do: ~p"/set_context/personal",
+ else: ~p"/set_context/#{ctx.handle}"
+ }
>
-
-

-
-
{org.name}
-
@{org.handle}
+
+

+
+
{ctx.name}
+
@{ctx.handle}
+ <:link href={~p"/auth/logout"}>
+
+
+ <.icon name="tabler-logout" class="h-5 w-5" />
+
+
Logout
+
+
"""
end
diff --git a/lib/algora_web/components/layouts/org.html.heex b/lib/algora_web/components/layouts/org.html.heex
index d180792c7..a6ecb32e0 100644
--- a/lib/algora_web/components/layouts/org.html.heex
+++ b/lib/algora_web/components/layouts/org.html.heex
@@ -124,48 +124,11 @@
assigns: %{current_user: @current_user}
)}
- <.dropdown2 id="dashboard-dropdown">
- <:img src={@current_org.avatar_url} alt={@current_org.handle} />
- <:title>{@current_org.name}
-
- <:link href={~p"/set_context/personal"}>
-
-

-
-
{@current_user.name}
-
@{@current_user.handle}
-
-
-
- <:link
- :for={
- org <-
- Algora.Organizations.get_user_orgs(@current_user)
- |> Enum.reject(&(&1.id == @current_org.id))
- }
- href={~p"/set_context/#{org.handle}"}
- >
-
-

-
-
{org.name}
-
@{org.handle}
-
-
-
- <:link href={~p"/auth/logout"}>
-
-
- <.icon name="tabler-logout" class="h-5 w-5" />
-
-
Logout
-
-
-
+ <.context_selector
+ current_user={@current_user}
+ current_context={@current_context}
+ all_contexts={@all_contexts}
+ />
<% else %>
<.link
diff --git a/lib/algora_web/components/layouts/user.html.heex b/lib/algora_web/components/layouts/user.html.heex
index 93f4e754a..9f4b6e8f0 100644
--- a/lib/algora_web/components/layouts/user.html.heex
+++ b/lib/algora_web/components/layouts/user.html.heex
@@ -179,31 +179,11 @@
)}
- <.dropdown2 id="dashboard-dropdown">
- <:img src={@current_user.avatar_url} alt={@current_user.handle} />
- <:title>{@current_user.name}
-
- <:link
- :for={org <- Algora.Organizations.get_user_orgs(@current_user)}
- href={~p"/set_context/#{org.handle}"}
- >
-
-

-
-
{org.name}
-
@{org.handle}
-
-
-
- <:link href={~p"/auth/logout"}>
-
-
- <.icon name="tabler-logout" class="h-5 w-5" />
-
-
Logout
-
-
-
+ <.context_selector
+ current_user={@current_user}
+ current_context={@current_context}
+ all_contexts={@all_contexts}
+ />
<% else %>
<.link
diff --git a/lib/algora_web/controllers/user_auth.ex b/lib/algora_web/controllers/user_auth.ex
index 151683168..1739f1484 100644
--- a/lib/algora_web/controllers/user_auth.ex
+++ b/lib/algora_web/controllers/user_auth.ex
@@ -12,7 +12,21 @@ defmodule AlgoraWeb.UserAuth do
def on_mount(:current_user, _params, session, socket) do
case session do
%{"user_id" => user_id} ->
- {:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> Accounts.get_user(user_id) end)}
+ case socket.assigns[:current_user] do
+ %Accounts.User{} = _user ->
+ {:cont, socket}
+
+ nil ->
+ current_user = Accounts.get_user(user_id)
+ current_context = Accounts.get_last_context_user(current_user)
+ all_contexts = Accounts.get_contexts(current_user)
+
+ {:cont,
+ socket
+ |> Phoenix.Component.assign(:current_user, current_user)
+ |> Phoenix.Component.assign(:current_context, current_context)
+ |> Phoenix.Component.assign(:all_contexts, all_contexts)}
+ end
%{} ->
{:cont, Phoenix.Component.assign(socket, :current_user, nil)}
@@ -22,7 +36,11 @@ defmodule AlgoraWeb.UserAuth do
def on_mount(:ensure_authenticated, _params, session, socket) do
case get_authenticated_user(session, socket) do
{:ok, user} ->
- {:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> user end)}
+ {:cont,
+ socket
+ |> Phoenix.Component.assign_new(:current_user, fn -> user end)
+ |> Phoenix.Component.assign_new(:current_context, fn -> Accounts.get_last_context_user(user) end)
+ |> Phoenix.Component.assign_new(:all_contexts, fn -> Accounts.get_contexts(user) end)}
{:error, :unauthenticated} ->
{:halt, redirect_require_login(socket)}
@@ -36,7 +54,11 @@ defmodule AlgoraWeb.UserAuth do
raise(AlgoraWeb.NotFoundError)
end
- {:cont, Phoenix.Component.assign_new(socket, :current_user, fn -> user end)}
+ {:cont,
+ socket
+ |> Phoenix.Component.assign_new(:current_user, fn -> user end)
+ |> Phoenix.Component.assign_new(:current_context, fn -> Accounts.get_last_context_user(user) end)
+ |> Phoenix.Component.assign_new(:all_contexts, fn -> Accounts.get_contexts(user) end)}
{:error, :unauthenticated} ->
{:halt, redirect_require_login(socket)}
@@ -48,7 +70,7 @@ defmodule AlgoraWeb.UserAuth do
%{"user_id" => user_id} ->
new_socket = Phoenix.Component.assign_new(socket, :current_user, fn -> Accounts.get_user!(user_id) end)
- case new_socket.assigns.current_user do
+ case new_socket.assigns[:current_user] do
%Accounts.User{} = user ->
{:ok, user}
@@ -94,7 +116,11 @@ defmodule AlgoraWeb.UserAuth do
end
def put_current_user(conn, user) do
- conn = assign(conn, :current_user, user)
+ conn =
+ conn
+ |> assign(:current_user, user)
+ |> assign(:current_context, Accounts.get_last_context_user(user))
+ |> assign(:all_contexts, Accounts.get_contexts(user))
conn
|> renew_session()
@@ -130,7 +156,11 @@ defmodule AlgoraWeb.UserAuth do
def fetch_current_user(conn, _opts) do
user_id = get_session(conn, :user_id)
user = user_id && Accounts.get_user(user_id)
- assign(conn, :current_user, user)
+
+ conn
+ |> assign(:current_user, user)
+ |> assign(:current_context, Accounts.get_last_context_user(user))
+ |> assign(:all_contexts, Accounts.get_contexts(user))
end
@doc """