registration.ex (2665B)
1 defmodule DailyTrackerWeb.UserLive.Registration do 2 use DailyTrackerWeb, :live_view 3 4 alias DailyTracker.Accounts 5 alias DailyTracker.Accounts.User 6 7 @impl true 8 def render(assigns) do 9 ~H""" 10 <Layouts.app flash={@flash} current_scope={@current_scope}> 11 <div class="mx-auto max-w-sm"> 12 <div class="text-center"> 13 <.header> 14 Register for an account 15 <:subtitle> 16 Already registered? 17 <.link navigate={~p"/users/log-in"} class="font-semibold text-brand hover:underline"> 18 Log in 19 </.link> 20 to your account now. 21 </:subtitle> 22 </.header> 23 </div> 24 25 <.form for={@form} id="registration_form" phx-submit="save" phx-change="validate"> 26 <.input 27 field={@form[:email]} 28 type="email" 29 label="Email" 30 autocomplete="username" 31 spellcheck="false" 32 required 33 phx-mounted={JS.focus()} 34 /> 35 36 <.button phx-disable-with="Creating account..." class="btn btn-primary w-full"> 37 Create an account 38 </.button> 39 </.form> 40 </div> 41 </Layouts.app> 42 """ 43 end 44 45 @impl true 46 def mount(_params, _session, %{assigns: %{current_scope: %{user: user}}} = socket) 47 when not is_nil(user) do 48 {:ok, redirect(socket, to: DailyTrackerWeb.UserAuth.signed_in_path(socket))} 49 end 50 51 def mount(_params, _session, socket) do 52 changeset = Accounts.change_user_email(%User{}, %{}, validate_unique: false) 53 54 {:ok, assign_form(socket, changeset), temporary_assigns: [form: nil]} 55 end 56 57 @impl true 58 def handle_event("save", %{"user" => user_params}, socket) do 59 case Accounts.register_user(user_params) do 60 {:ok, user} -> 61 {:ok, _} = 62 Accounts.deliver_login_instructions( 63 user, 64 &url(~p"/users/log-in/#{&1}") 65 ) 66 67 {:noreply, 68 socket 69 |> put_flash( 70 :info, 71 "An email was sent to #{user.email}, please access it to confirm your account." 72 ) 73 |> push_navigate(to: ~p"/users/log-in")} 74 75 {:error, %Ecto.Changeset{} = changeset} -> 76 {:noreply, assign_form(socket, changeset)} 77 end 78 end 79 80 def handle_event("validate", %{"user" => user_params}, socket) do 81 changeset = Accounts.change_user_email(%User{}, user_params, validate_unique: false) 82 {:noreply, assign_form(socket, Map.put(changeset, :action, :validate))} 83 end 84 85 defp assign_form(socket, %Ecto.Changeset{} = changeset) do 86 form = to_form(changeset, as: "user") 87 assign(socket, form: form) 88 end 89 end