Skip to content

Commit 9cc669b

Browse files
authored
Distinguish repeated signup submissions (#6606)
* feat: distinguish repeated signup submissions * fix: avoid CE warning for EE-only test helper * fix: limit signup error tracking values
1 parent 66d2daa commit 9cc669b

2 files changed

Lines changed: 49 additions & 6 deletions

File tree

lib/plausible_web/live/register_form.ex

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ defmodule PlausibleWeb.Live.RegisterForm do
1010
alias Plausible.Teams
1111
alias PlausibleWeb.Layouts
1212

13+
@signup_error_categories %{
14+
name: "name",
15+
email: "email",
16+
password: "password"
17+
}
18+
1319
def mount(params, _session, socket) do
1420
socket =
1521
socket
@@ -50,6 +56,7 @@ defmodule PlausibleWeb.Live.RegisterForm do
5056
captcha_error: nil,
5157
password_strength: Auth.User.password_strength(changeset),
5258
disable_submit: false,
59+
signup_previous_error: nil,
5360
trigger_submit: false,
5461
heading: heading,
5562
subtitle: subtitle
@@ -95,7 +102,7 @@ defmodule PlausibleWeb.Live.RegisterForm do
95102
id="register-form"
96103
class="flex flex-col gap-y-6"
97104
action={Routes.auth_path(@socket, :login)}
98-
onsubmit={form_submit_event(@invitation)}
105+
onsubmit={form_submit_event(@invitation, @signup_previous_error)}
99106
phx-change="validate"
100107
phx-submit="register"
101108
phx-trigger-action={@trigger_submit}
@@ -172,11 +179,13 @@ defmodule PlausibleWeb.Live.RegisterForm do
172179
end
173180

174181
on_ee do
175-
defp form_submit_event(invitation) do
176-
"window.plausible('Signup#{if invitation, do: " via invitation"}')"
182+
defp form_submit_event(invitation, previous_error) do
183+
options = Jason.encode!(%{"props" => %{"previous_error" => previous_error || "none"}})
184+
185+
"window.plausible('Signup#{if invitation, do: " via invitation"}', #{options})"
177186
end
178187
else
179-
defp form_submit_event(_), do: ""
188+
defp form_submit_event(_, _), do: ""
180189
end
181190

182191
defp name_input(assigns) do
@@ -273,8 +282,10 @@ defmodule PlausibleWeb.Live.RegisterForm do
273282
end
274283

275284
defp captcha_failed(socket) do
285+
error = "Please complete the captcha to register"
286+
276287
socket
277-
|> assign(:captcha_error, "Please complete the captcha to register")
288+
|> assign(captcha_error: error, signup_previous_error: "captcha")
278289
|> PlausibleWeb.Components.Captcha.reset()
279290
end
280291

@@ -293,13 +304,23 @@ defmodule PlausibleWeb.Live.RegisterForm do
293304
{:error, changeset} ->
294305
socket =
295306
socket
296-
|> assign(form: to_form(Map.put(changeset, :action, :validate)))
307+
|> assign(
308+
form: to_form(Map.put(changeset, :action, :validate)),
309+
signup_previous_error: signup_error(changeset)
310+
)
297311
|> PlausibleWeb.Components.Captcha.reset()
298312

299313
{:noreply, socket}
300314
end
301315
end
302316

317+
defp signup_error(changeset) do
318+
case List.first(changeset.errors) do
319+
{field, _error} -> Map.get(@signup_error_categories, field, "unknown")
320+
nil -> "unknown"
321+
end
322+
end
323+
303324
defp do_add_user(user, opts) do
304325
case Repo.insert(user) do
305326
{:ok, user} ->

test/plausible_web/live/register_form_test.exs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ defmodule PlausibleWeb.Live.RegisterFormTest do
5050

5151
lv = get_liveview(conn, "/register")
5252

53+
on_ee do
54+
html = render(lv)
55+
assert_signup_tracking(html, "none")
56+
end
57+
5358
type_into_input(lv, "user[name]", "Mary Sue")
5459
type_into_input(lv, "user[email]", "mary.sue@plausible.test")
5560
type_into_input(lv, "user[password]", "very-long-and-very-secret-123")
@@ -93,6 +98,10 @@ defmodule PlausibleWeb.Live.RegisterFormTest do
9398
assert html =~ "Please complete the captcha to register"
9499
assert_push_event(lv, "reset-frc-captcha", %{})
95100

101+
on_ee do
102+
assert_signup_tracking(html, "captcha")
103+
end
104+
96105
refute Repo.one(User)
97106
end
98107

@@ -111,6 +120,10 @@ defmodule PlausibleWeb.Live.RegisterFormTest do
111120

112121
assert html =~ "has already been taken"
113122
assert_push_event(lv, "reset-frc-captcha", %{})
123+
124+
on_ee do
125+
assert_signup_tracking(html, "email")
126+
end
114127
end
115128
end
116129

@@ -279,6 +292,15 @@ defmodule PlausibleWeb.Live.RegisterFormTest do
279292
|> render_change(%{id => text})
280293
end
281294

295+
on_ee do
296+
defp assert_signup_tracking(html, previous_error_category) do
297+
options = Jason.encode!(%{"props" => %{"previous_error" => previous_error_category}})
298+
299+
assert text_of_attr(html, "#register-form", "onsubmit") ==
300+
"window.plausible('Signup', #{options})"
301+
end
302+
end
303+
282304
defp mock_captcha_success() do
283305
mock_captcha(true)
284306
end

0 commit comments

Comments
 (0)