daily-tracker

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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