64 lines
1.8 KiB
Elixir
64 lines
1.8 KiB
Elixir
defmodule Web.UserRegistrationLive do
|
|
@moduledoc false
|
|
use Web, :live_view
|
|
|
|
alias Core.Accounts
|
|
|
|
def mount(_params, _session, socket) do
|
|
changeset = Accounts.change_user_registration(%Schema.User{})
|
|
|
|
socket =
|
|
socket
|
|
|> assign(trigger_submit: false)
|
|
|> assign_form(changeset)
|
|
|
|
{:ok, socket, temporary_assigns: [form: nil], layout: false}
|
|
end
|
|
|
|
def handle_event("save", %{"user" => user_params}, socket) do
|
|
socket =
|
|
case Accounts.register_user(user_params) do
|
|
{:ok, user} ->
|
|
changeset = Accounts.change_user_registration(user)
|
|
socket |> assign(trigger_submit: true) |> assign_form(changeset)
|
|
|
|
{:error, %Ecto.Changeset{} = changeset} ->
|
|
assign_form(socket, changeset)
|
|
end
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
def handle_event("validate", %{"user" => user_params}, socket) do
|
|
changeset = Accounts.change_user_registration(%Schema.User{}, user_params)
|
|
{:noreply, assign_form(socket, Map.put(changeset, :action, :validate))}
|
|
end
|
|
|
|
def render(assigns) do
|
|
~H"""
|
|
<div class="mx-auto max-w-sm">
|
|
<header class="text-center">finish installation</header>
|
|
|
|
<.form
|
|
for={@form}
|
|
id="registration_form"
|
|
phx-submit="save"
|
|
phx-change="validate"
|
|
phx-trigger-action={@trigger_submit}
|
|
action={~p"/admin/users/log_in?_action=registered"}
|
|
method="post"
|
|
>
|
|
<.input field={@form[:username]} type="text" label="username" />
|
|
<.input field={@form[:password]} type="password" label="password" />
|
|
<.button type="submit">create administrator</.button>
|
|
</.form>
|
|
</div>
|
|
"""
|
|
end
|
|
|
|
defp assign_form(socket, %Ecto.Changeset{} = changeset) do
|
|
form = to_form(changeset, as: "user")
|
|
|
|
assign(socket, form: form)
|
|
end
|
|
end
|