From 66802bfa7abaaf75fc1866c615289e4104cc8dd6 Mon Sep 17 00:00:00 2001 From: SimpleTest Date: Wed, 22 Jul 2026 01:55:55 +0300 Subject: [PATCH] Make handover code entry visible and verifiable --- .../live/request_live/show.ex | 18 +++++++++++- .../live/mutual_aid_live_test.exs | 28 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/who_need_help_web/live/request_live/show.ex b/lib/who_need_help_web/live/request_live/show.ex index fbf5aae..4288507 100644 --- a/lib/who_need_help_web/live/request_live/show.ex +++ b/lib/who_need_help_web/live/request_live/show.ex @@ -1020,15 +1020,31 @@ defmodule WhoNeedHelpWeb.RequestLive.Show do Help.helper?(@current_scope, @assignment) && is_nil(@assignment.handover_verified_at) } + id="handover-form" for={@handover_form} phx-submit="verify-code" > <.input field={@handover_form[:code]} label={gettext("Enter handover code")} + type="text" + inputmode="numeric" + autocomplete="one-time-code" + minlength="6" maxlength="6" + pattern="[0-9]{6}" + placeholder="000000" + required + aria-describedby="handover-code-hint" + class="input w-full bg-base-100 text-center font-mono text-xl font-black tracking-[.22em] text-base-content caret-base-content placeholder:text-base-content/35" /> - <.button class="btn btn-primary mt-2 w-full"> +

+ {gettext("Enter the six digits shown to the requester.")} +

+ <.button + class="btn btn-primary mt-2 w-full" + phx-disable-with={gettext("Verifying…")} + > {gettext("Verify handover")} diff --git a/test/who_need_help_web/live/mutual_aid_live_test.exs b/test/who_need_help_web/live/mutual_aid_live_test.exs index 9d7faca..376a215 100644 --- a/test/who_need_help_web/live/mutual_aid_live_test.exs +++ b/test/who_need_help_web/live/mutual_aid_live_test.exs @@ -646,6 +646,34 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do assert_push_event(view, "reset-message-form", %{id: "request-report-form"}) end + test "helper can enter and verify the visible six-digit handover code" do + category = Catalog.seed_defaults() + requester = user_fixture(display_name: "Handover requester") + helper = user_fixture(display_name: "Handover helper") + requester_scope = user_scope_fixture(requester) + helper_scope = user_scope_fixture(helper) + + {:ok, request} = Help.create_request(requester_scope, request_attrs(category)) + {:ok, assignment} = Help.accept_request(helper_scope, request.id) + {:ok, _assignment} = Help.start_assignment(helper_scope, assignment.id) + + {:ok, view, _html} = + build_conn() |> log_in_user(helper) |> live(~p"/requests/#{request.id}") + + assert has_element?( + view, + "#handover-form input[inputmode='numeric'][autocomplete='one-time-code'][pattern='[0-9]{6}']" + ) + + view + |> form("#handover-form", handover: %{code: Help.handover_code(request.id)}) + |> render_submit() + + assert render(view) =~ "Handover code verified." + refute has_element?(view, "#handover-form") + assert Help.get_request!(request.id).assignment.handover_verified_at + end + test "successful category proposal resets the browser form", %{conn: conn} do Catalog.seed_defaults() {:ok, view, _html} = live(conn, ~p"/categories/proposals")