feat: add userdata for profile button #170

This commit is contained in:
Simon 2025-09-29 15:34:00 +02:00
parent 6033e33622
commit e3dd333e89
Signed by: simon
GPG key ID: 40E7A58C4AA1EDB2
15 changed files with 41 additions and 24 deletions

View file

@ -14,7 +14,8 @@ defmodule MvWeb.Layouts do
embed_templates "layouts/*" embed_templates "layouts/*"
@doc """ @doc """
Renders the app layout Renders the app layout. Can be used with or without a current_user.
When current_user is present, it will show the navigation bar.
## Examples ## Examples
@ -22,18 +23,25 @@ defmodule MvWeb.Layouts do
<h1>Content</h1> <h1>Content</h1>
</Layout.app> </Layout.app>
<Layouts.app flash={@flash} current_user={@current_user}>
<h1>Authenticated Content</h1>
</Layout.app>
""" """
attr :flash, :map, required: true, doc: "the map of flash messages" attr :flash, :map, required: true, doc: "the map of flash messages"
attr :current_user, :map, default: nil, doc: "the current user, if authenticated"
attr :current_scope, :map, attr :current_scope, :map,
default: nil, default: nil,
doc: "the current [scope](https://hexdocs.pm/phoenix/scopes.html)" doc: "the current [scope](https://hexdocs.pm/phoenix/scopes.html)"
slot :inner_block, required: true slot :inner_block, required: true
def app(assigns) do def app(assigns) do
~H""" ~H"""
<.navbar /> <%= if @current_user do %>
<.navbar current_user={@current_user} />
<% end %>
<main class="px-4 py-20 sm:px-6 lg:px-16"> <main class="px-4 py-20 sm:px-6 lg:px-16">
<div class="mx-auto max-full space-y-4"> <div class="mx-auto max-full space-y-4">
{render_slot(@inner_block)} {render_slot(@inner_block)}
@ -44,6 +52,7 @@ defmodule MvWeb.Layouts do
""" """
end end
@doc """ @doc """
Shows the flash group with standard titles and content. Shows the flash group with standard titles and content.

View file

@ -4,6 +4,9 @@ defmodule MvWeb.Layouts.Navbar do
""" """
use Phoenix.Component use Phoenix.Component
use Gettext, backend: MvWeb.Gettext use Gettext, backend: MvWeb.Gettext
use MvWeb, :verified_routes
attr :current_user, :map, required: true, doc: "The current user - navbar is only shown when user is present"
def navbar(assigns) do def navbar(assigns) do
~H""" ~H"""
@ -65,12 +68,14 @@ defmodule MvWeb.Layouts.Navbar do
class="menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-2 shadow" class="menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-2 shadow"
> >
<li> <li>
<a> <.link navigate={~p"/users/#{@current_user.id}"}>
{gettext("Profil")} {gettext("Profil")}
</a> </.link>
</li> </li>
<li><a>{gettext("Settings")}</a></li> <li><a>{gettext("Settings")}</a></li>
<li><a href="sign-out">{gettext("Logout")}</a></li> <li>
<.link href={~p"/sign-out"}>{gettext("Logout")}</.link>
</li>
</ul> </ul>
</div> </div>
</div> </div>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.MemberLive.Form do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{@page_title} {@page_title}
<:subtitle> <:subtitle>

View file

@ -1,4 +1,4 @@
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{gettext("Members")} {gettext("Members")}
<:actions> <:actions>

View file

@ -5,7 +5,7 @@ defmodule MvWeb.MemberLive.Show do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{@member.first_name} {@member.last_name} {@member.first_name} {@member.last_name}
<:subtitle>{gettext("This is a member record from your database.")}</:subtitle> <:subtitle>{gettext("This is a member record from your database.")}</:subtitle>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyLive.Form do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{@page_title} {@page_title}
<:subtitle>{gettext("Use this form to manage property records in your database.")}</:subtitle> <:subtitle>{gettext("Use this form to manage property records in your database.")}</:subtitle>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyLive.Index do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
Listing Properties Listing Properties
<:actions> <:actions>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyLive.Show do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
Property {@property.id} Property {@property.id}
<:subtitle>This is a property record from your database.</:subtitle> <:subtitle>This is a property record from your database.</:subtitle>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyTypeLive.Form do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{@page_title} {@page_title}
<:subtitle> <:subtitle>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyTypeLive.Index do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
Listing Property types Listing Property types
<:actions> <:actions>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.PropertyTypeLive.Show do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
Property type {@property_type.id} Property type {@property_type.id}
<:subtitle>This is a property_type record from your database.</:subtitle> <:subtitle>This is a property_type record from your database.</:subtitle>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.UserLive.Form do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{@page_title} {@page_title}
<:subtitle>{gettext("Use this form to manage user records in your database.")}</:subtitle> <:subtitle>{gettext("Use this form to manage user records in your database.")}</:subtitle>

View file

@ -1,4 +1,4 @@
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{gettext("Listing Users")} {gettext("Listing Users")}
<:actions> <:actions>

View file

@ -4,7 +4,7 @@ defmodule MvWeb.UserLive.Show do
@impl true @impl true
def render(assigns) do def render(assigns) do
~H""" ~H"""
<Layouts.app flash={@flash}> <Layouts.app flash={@flash} current_user={@current_user}>
<.header> <.header>
{gettext("User")} {@user.email} {gettext("User")} {@user.email}
<:subtitle>{gettext("This is a user record from your database.")}</:subtitle> <:subtitle>{gettext("This is a user record from your database.")}</:subtitle>

View file

@ -28,11 +28,14 @@ defmodule MvWeb.LiveUserAuth do
end end
end end
def on_mount(:live_user_required, _params, _session, socket) do def on_mount(:live_user_required, _params, session, socket) do
if socket.assigns[:current_user] do socket = AshAuthentication.Phoenix.LiveSession.assign_new_resources(socket, session)
{:cont, socket}
else case socket.assigns do
{:halt, Phoenix.LiveView.redirect(socket, to: ~p"/sign-in")} %{current_user: %{} = user} ->
{:cont, assign(socket, :current_user, user)}
_ ->
{:halt, Phoenix.LiveView.redirect(socket, to: ~p"/sign-in")}
end end
end end