defmodule SsoBsnWeb.UserRegistrationLive do use SsoBsnWeb, :live_view alias SsoBsn.Accounts alias SsoBsn.Accounts.User def render(assigns) do ~H"""
<.header class="text-center"> Register for an account <:subtitle> Already registered? <.link navigate={~p"/users/log_in"} class="font-semibold text-brand hover:underline"> Sign in to your account now. <.simple_form for={@form} id="registration_form" phx-submit="save" phx-change="validate" phx-hook="registrationHook" phx-trigger-action={@trigger_submit} action={~p"/users/log_in?_action=registered"} method="post" > <.error :if={@check_errors}> Oops, something went wrong! Please check the errors below. <.input field={@form[:username]} type="text" label="Username" required /> <:actions> <.button phx-disable-with="Creating account..." class="w-full">Create an account
""" end def mount(_params, _session, socket) do changeset = Accounts.change_user_registration(%User{}) socket = socket |> assign(trigger_submit: false, check_errors: false) |> assign_form(changeset) {:ok, socket, temporary_assigns: [form: nil]} end def handle_event("save", %{"user" => user_params}, socket) do case Accounts.register_user(user_params) do {:ok, user} -> changeset = Accounts.change_user_registration(user) {challenge, challenge_client} = Accounts.registration_challenge(user) { :noreply, socket # |> assign(trigger_submit: true) |> assign_form(changeset) |> assign(user: user) |> assign(challenge: challenge) |> push_event("registration-challenge", challenge_client) } {:error, %Ecto.Changeset{} = changeset} -> {:noreply, socket |> assign(check_errors: true) |> assign_form(changeset)} end end def handle_event("validate", %{"user" => user_params}, socket) do changeset = Accounts.change_user_registration(%User{}, user_params) {:noreply, assign_form(socket, Map.put(changeset, :action, :validate))} end def handle_event("registration-complete", params, socket) do %{user: user, challenge: challenge} = socket.assigns case Accounts.register_key(user, challenge, params) do {:ok, _key} -> login_token = Accounts.generate_user_login_token(user) {:noreply, socket |> redirect(to: ~p"/users/log_in/#{login_token}")} {:error, error} -> {:noreply, socket |> put_flash(:error, "An error occured: #{inspect(error)}")} end end def handle_event("error", payload, socket), do: {:noreply, socket |> put_flash(:error, inspect(payload))} defp assign_form(socket, %Ecto.Changeset{} = changeset) do form = to_form(changeset, as: "user") if changeset.valid? do assign(socket, form: form, check_errors: false) else assign(socket, form: form) end end end