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"""
{#if @token} {/if}

Log In

{#if @log_in_form.submitted_once?}

Oops, something went wrong! Please check the errors below.

{/if}
{#if @log_in_form.submitted_once?} {/if}
{#if @log_in_form.submitted_once?} {/if}
{#if @log_in_form.submitted_once?} {/if}
Log In
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