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.name}
-
@{org.handle}
+
+ {ctx.name} +
+
{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.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.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.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 """