Current section
Files
Jump to
Current section
Files
templates/session_hooks/assign_user.ex
defmodule <%= inspect @web_pascal_case %>.SessionHooks.AssignUser do
@moduledoc """
Session hook for setting the `@current_user` assign on the socket.
If a **valid** `user_id` or `user_token` is set in the session, the user will be assigned, otherwise `@current_user` will be `nil`.
## Example
```
# router.ex
alias MyApp.SessionHooks.AssignUser
...
live_session :default, on_mount: [AssignUser] do
scope "/", MyAppWeb do
pipe_through :browser
live "/sign-in", AuthenticationLive
end
end
```
"""
alias <%= inspect @app_pascal_case %>.Identity
alias <%= inspect @app_pascal_case %>.Identity.User
alias Phoenix.LiveView.Socket
import Phoenix.Component
@spec on_mount(atom(), map(), map(), Socket.t()) :: {:cont, Socket.t()} | {:halt, Socket.t()}
def on_mount(:default, _params, _session, %{assigns: %{current_user: %User{}}} = socket) do
{:cont, socket}
end
def on_mount(:default, _params, %{"user_id" => user_id}, socket) do
case Identity.get(user_id) do
{:ok, %User{} = user} ->
{
:cont,
socket
|> assign(:current_user, user)
}
_ ->
{
:cont,
socket
|> assign(:current_user, nil)
}
end
end
def on_mount(:default, _params, %{"user_token" => user_token}, socket) do
case Identity.get_by_token(user_token) do
{:ok, %User{} = user} ->
{
:cont,
socket
|> assign(:current_user, user)
}
_ ->
{
:cont,
socket
|> assign(:current_user, nil)
}
end
end
def on_mount(:default, _params, _session, socket) do
{
:cont,
socket
|> assign(:current_user, nil)
}
end
end