defmodule PhoenixKitWeb.Users.RegistrationLive do use PhoenixKitWeb, :live_view alias PhoenixKit.Admin.Presence alias PhoenixKit.Settings alias PhoenixKit.Users.Auth alias PhoenixKit.Users.Auth.User def render(assigns) do ~H"""

{@project_title} Create account

<.form for={@form} id="registration_form" phx-submit="save" phx-change="validate" phx-trigger-action={@trigger_submit} action="/phoenix_kit/users/log-in?_action=registered" method="post" >
Account Information
Oops, something went wrong! Please check the errors below.

Please enter a valid email address

Password must be at least 8 characters long

Already have an account? <.link navigate="/phoenix_kit/users/log-in" class="font-semibold text-primary hover:underline" > Sign in
Development mode: Check <.link href="/dev/mailbox" class="font-semibold underline">mailbox for confirmation emails
""" end def mount(_params, session, socket) do # Track anonymous visitor session if connected?(socket) do session_id = session["live_socket_id"] || generate_session_id() Presence.track_anonymous(session_id, %{ connected_at: DateTime.utc_now(), ip_address: get_connect_info(socket, :peer_data) |> extract_ip_address(), user_agent: get_connect_info(socket, :user_agent), current_page: "/phoenix_kit/users/register" }) end # Get project title from settings project_title = Settings.get_setting("project_title", "PhoenixKit") changeset = Auth.change_user_registration(%User{}) socket = socket |> assign(trigger_submit: false, check_errors: false) |> assign(project_title: project_title) |> assign_form(changeset) {:ok, socket, temporary_assigns: [form: nil]} end def handle_event("save", %{"user" => user_params}, socket) do case Auth.register_user(user_params) do {:ok, user} -> {:ok, _} = Auth.deliver_user_confirmation_instructions( user, &"/phoenix_kit/users/confirm/#{&1}" ) changeset = Auth.change_user_registration(user) {:noreply, socket |> assign(trigger_submit: true) |> assign_form(changeset)} {: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 = Auth.change_user_registration(%User{}, user_params) {:noreply, assign_form(socket, Map.put(changeset, :action, :validate))} end 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 defp show_dev_notice? do case Application.get_env(:phoenix_kit, PhoenixKit.Mailer)[:adapter] do Swoosh.Adapters.Local -> true _ -> false end end defp generate_session_id do :crypto.strong_rand_bytes(16) |> Base.encode64() end defp extract_ip_address(nil), do: "unknown" defp extract_ip_address(%{address: {a, b, c, d}}), do: "#{a}.#{b}.#{c}.#{d}" defp extract_ip_address(%{address: address}), do: to_string(address) defp extract_ip_address(_), do: "unknown" end