defmodule AshHqWeb.Pages.LogIn do
@moduledoc "Log in page"
use Surface.LiveComponent
alias Surface.Components.{Form, LiveRedirect}
alias Surface.Components.Form.{
Checkbox,
ErrorTag,
Field,
HiddenInput,
Label,
PasswordInput,
Submit,
TextInput
}
alias AshHqWeb.Router.Helpers, as: Routes
data log_in_form, :map
data token, :string, default: nil
data trigger_action, :boolean, default: false
def render(assigns) do
~F"""
Register? |
Forgot Password?
"""
end
@impl true
def update(assigns, socket) do
{:ok, socket |> assign(assigns) |> assign_form()}
end
defp assign_form(socket) do
assign(socket,
log_in_form:
AshPhoenix.Form.for_read(
AshHq.Accounts.User,
:by_email_and_password,
as: "log_in",
api: AshHq.Accounts
)
)
end
@impl true
def handle_event("validate_log_in", %{"log_in" => params}, socket) do
{:noreply,
assign(socket,
log_in_form: AshPhoenix.Form.validate(socket.assigns.log_in_form, params)
)}
end
@impl true
def handle_event("log_in", %{"log_in" => params}, socket) do
case AshPhoenix.Form.submit(socket.assigns.log_in_form, params: params, read_one?: true) do
{:ok, nil} ->
{:noreply,
socket
|> put_flash(:error, "Invalid username or password")
|> push_redirect(to: Routes.app_view_path(AshHqWeb.Endpoint, :log_in))}
{:ok, user} ->
token = AshHqWeb.UserAuth.create_token_for_user(user)
{:noreply,
socket
|> assign(:trigger_action, true)
|> assign(:token, Base.url_encode64(token, padding: false))}
{:error, form} ->
{:noreply, assign(socket, log_in_form: form)}
end
end
end