defmodule AshHqWeb.Pages.Register do
@moduledoc "Log in page"
use Surface.LiveComponent
alias Surface.Components.{Form, LivePatch}
alias Surface.Components.Form.{
Checkbox,
ErrorTag,
Field,
Label,
PasswordInput,
Submit,
TextInput
}
alias AshHqWeb.Router.Helpers, as: Routes
data register_form, :map
def render(assigns) do
~F"""
"""
end
@impl true
def update(assigns, socket) do
{:ok, socket |> assign(assigns) |> assign_form()}
end
defp assign_form(socket) do
assign(socket,
register_form:
AshPhoenix.Form.for_create(
AshHq.Accounts.User,
:register,
as: "register",
api: AshHq.Accounts
)
)
end
@impl true
def handle_event("validate_register", %{"register" => params}, socket) do
{:noreply,
assign(socket,
register_form: AshPhoenix.Form.validate(socket.assigns.register_form, params)
)}
end
@impl true
def handle_event("register", %{"register" => params}, socket) do
params =
Map.put(
params,
"confirmation_url_fun",
&Routes.user_confirmation_url(AshHqWeb.Endpoint, :confirm, &1)
)
case AshPhoenix.Form.submit(socket.assigns.register_form, params: params) do
{:ok, user} ->
token = AshHqWeb.UserAuth.create_token_for_user(user)
{:noreply,
redirect(socket,
to:
Routes.user_session_path(AshHqWeb.Endpoint, :log_in, %{
"log_in" => %{
"token" => Base.url_encode64(token, padding: false),
"remember_me" => params["remember_me"] || "false"
}
})
)}
{:error, form} ->
{:noreply, assign(socket, register_form: form)}
end
end
end