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