Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions lib/algora/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
31 changes: 22 additions & 9 deletions lib/algora_web/components/core_components.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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}</:title>
<:img src={@current_context.avatar_url} alt={@current_context.handle} />
<:title>{@current_context.name}</:title>

<: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}"
}
>
<div class="flex items-center">
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
<div class="truncate">
<div class="truncate font-semibold">{org.name}</div>
<div class="truncate text-sm text-gray-500">@{org.handle}</div>
<div class="flex items-center whitespace-nowrap">
<img src={ctx.avatar_url} alt={ctx.name} class="mr-3 h-8 w-8 rounded-full" />
<div>
<div class="font-semibold">{ctx.name}</div>
<div class="text-sm text-gray-500">@{ctx.handle}</div>
</div>
</div>
</:link>
<:link href={~p"/auth/logout"}>
<div class="flex items-center whitespace-nowrap">
<div class="mr-3 flex h-8 w-8 items-center justify-center">
<.icon name="tabler-logout" class="h-5 w-5" />
</div>
<div class="font-semibold">Logout</div>
</div>
</:link>
</.dropdown2>
"""
end
Expand Down
47 changes: 5 additions & 42 deletions lib/algora_web/components/layouts/org.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -124,48 +124,11 @@
assigns: %{current_user: @current_user}
)}
<div>
<.dropdown2 id="dashboard-dropdown">
<:img src={@current_org.avatar_url} alt={@current_org.handle} />
<:title>{@current_org.name}</:title>

<:link href={~p"/set_context/personal"}>
<div class="flex items-center whitespace-nowrap">
<img
src={@current_user.avatar_url}
alt={@current_user.name}
class="mr-3 h-8 w-8 rounded-full"
/>
<div>
<div class="font-semibold">{@current_user.name}</div>
<div class="text-sm text-gray-500">@{@current_user.handle}</div>
</div>
</div>
</:link>
<:link
:for={
org <-
Algora.Organizations.get_user_orgs(@current_user)
|> Enum.reject(&(&1.id == @current_org.id))
}
href={~p"/set_context/#{org.handle}"}
>
<div class="flex items-center whitespace-nowrap">
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
<div>
<div class="font-semibold">{org.name}</div>
<div class="text-sm text-gray-500">@{org.handle}</div>
</div>
</div>
</:link>
<:link href={~p"/auth/logout"}>
<div class="flex items-center whitespace-nowrap">
<div class="mr-3 flex h-8 w-8 items-center justify-center">
<.icon name="tabler-logout" class="h-5 w-5" />
</div>
<div class="font-semibold">Logout</div>
</div>
</:link>
</.dropdown2>
<.context_selector
current_user={@current_user}
current_context={@current_context}
all_contexts={@all_contexts}
/>
</div>
<% else %>
<.link
Expand Down
30 changes: 5 additions & 25 deletions lib/algora_web/components/layouts/user.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -179,31 +179,11 @@
)}
</div>
<div>
<.dropdown2 id="dashboard-dropdown">
<:img src={@current_user.avatar_url} alt={@current_user.handle} />
<:title>{@current_user.name}</:title>

<:link
:for={org <- Algora.Organizations.get_user_orgs(@current_user)}
href={~p"/set_context/#{org.handle}"}
>
<div class="flex items-center">
<img src={org.avatar_url} alt={org.name} class="mr-3 h-8 w-8 rounded-full" />
<div class="truncate">
<div class="truncate font-semibold">{org.name}</div>
<div class="truncate text-sm text-gray-500">@{org.handle}</div>
</div>
</div>
</:link>
<:link href={~p"/auth/logout"}>
<div class="flex items-center whitespace-nowrap">
<div class="mr-3 flex h-8 w-8 items-center justify-center">
<.icon name="tabler-logout" class="h-5 w-5" />
</div>
<div class="font-semibold">Logout</div>
</div>
</:link>
</.dropdown2>
<.context_selector
current_user={@current_user}
current_context={@current_context}
all_contexts={@all_contexts}
/>
</div>
<% else %>
<.link
Expand Down
42 changes: 36 additions & 6 deletions lib/algora_web/controllers/user_auth.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)}
Expand All @@ -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)}
Expand All @@ -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)}
Expand All @@ -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}

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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 """
Expand Down