From 9c3456ad56c7ef61531ec4bdd286edf6ed75c1ef Mon Sep 17 00:00:00 2001 From: SimpleTest Date: Thu, 23 Jul 2026 03:39:03 +0300 Subject: [PATCH] fix: preserve push state across live updates --- assets/js/hooks.js | 23 +++++++++++++++++++ .../live/request_live/show.ex | 12 ++++++++++ .../live/mutual_aid_live_test.exs | 23 +++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/assets/js/hooks.js b/assets/js/hooks.js index ae0ee27..e9d1b43 100644 --- a/assets/js/hooks.js +++ b/assets/js/hooks.js @@ -817,6 +817,29 @@ export const Hooks = { this.restoreWebState() } }, + updated() { + const previousButton = this.button + const nextButton = this.el.querySelector("[data-enable-push]") + + if (previousButton && previousButton !== nextButton) { + previousButton.removeEventListener("click", this.enable) + } + + this.button = nextButton + this.buttonLabel = this.el.querySelector("[data-enable-push-label]") + this.status = this.el.querySelector("[data-push-status]") + + if (this.native && this.button) this.button.disabled = false + + this.button?.removeEventListener("click", this.enable) + this.button?.addEventListener("click", this.enable) + + if (this.native) { + this.postNative({action: "push_token_request"}) + } else { + this.restoreWebState() + } + }, destroyed() { window.removeEventListener("wnh:native-push-token", this.nativeToken) window.removeEventListener("wnh:native-push-error", this.nativeError) 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 5d3262b..857fadd 100644 --- a/lib/who_need_help_web/live/request_live/show.ex +++ b/lib/who_need_help_web/live/request_live/show.ex @@ -1660,6 +1660,18 @@ defmodule WhoNeedHelpWeb.RequestLive.Show do {gettext("Optional thank-you link")} + <% @request.status == :cancelled -> %> +

+ {gettext("This request was cancelled.")} +

+ <% @request.status == :expired -> %> +

+ {gettext("This request has expired.")} +

+ <% @request.status == :completed -> %> +

+ {gettext("Help completed and verified by both participants.")} +

<% true -> %>

{gettext("This request already has a helper.")} 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 e193d7e..bf007a9 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 @@ -916,6 +916,29 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do stop_live_view(helper_view) end + test "cancelled open request shows a terminal action-center state", %{ + conn: conn, + scope: requester_scope + } do + category = Catalog.seed_defaults() + {:ok, request} = Help.create_request(requester_scope, request_attrs(category)) + {:ok, view, _html} = live(conn, ~p"/requests/#{request.id}") + + view + |> form("#open-request-cancellation-form", %{ + "cancellation" => %{ + "cancellation_reason" => "no_longer_needed", + "cancellation_note" => "" + } + }) + |> render_submit() + + html = render(view) + assert html =~ "This request was cancelled." + refute html =~ "This request already has a helper." + refute has_element?(view, "#open-request-cancellation-form") + end + test "terminal request updates stop Android foreground tracking", _context do category = Catalog.seed_defaults() requester = user_fixture(display_name: "Tracking requester")