Stabilize realtime discovery pagination

This commit is contained in:
SimpleTest 2026-08-03 02:31:04 +03:00
parent 741359e476
commit ea2a1b6f5e
2 changed files with 16 additions and 22 deletions

View File

@ -68,21 +68,6 @@ defmodule WhoNeedHelpWeb.ActivityLive.Index do
user_id = socket.assigns.current_scope.user.id
already_mine? = Enum.any?(socket.assigns.my_activities, &(&1.id == activity.id))
{activities, activities_cursor} =
update_entry(
socket.assigns.activities,
activity,
not is_nil(socket.assigns.viewport) and
Activities.visible_open_activity?(
socket.assigns.current_scope,
activity,
socket.assigns.filters,
socket.assigns.viewport
),
:asc,
socket.assigns.activities_cursor
)
{my_activities, my_activities_cursor} =
update_entry(
socket.assigns.my_activities,
@ -94,12 +79,14 @@ defmodule WhoNeedHelpWeb.ActivityLive.Index do
socket =
socket
|> assign(:activities, activities)
|> assign(:activities_cursor, activities_cursor)
|> assign(:my_activities, my_activities)
|> assign(:my_activities_cursor, my_activities_cursor)
if socket.assigns.refresh_timer || socket.assigns.view_mode == "list" do
# A single authoritative page reload keeps the list, cursor, result count,
# and map clusters on the same database snapshot. Applying the PubSub item
# locally and then accepting an in-flight async page allowed an older page
# to overwrite a newer bounded window during bursts.
if socket.assigns.refresh_timer do
{:noreply, socket}
else
timer = Process.send_after(self(), :refresh_discovery, 100)

View File

@ -665,7 +665,11 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
first = List.first(requests)
overflow = List.last(requests)
assert_eventually(fn -> has_element?(view, "#open-request-#{first.id}") end)
assert_eventually(fn ->
has_element?(view, "#open-request-#{first.id}") and
has_element?(view, "button", "Load more in this area")
end)
refute has_element?(view, "#open-request-#{overflow.id}")
view |> element("button", "Load more in this area") |> render_click()
@ -704,7 +708,7 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
"safety_confirmed" => true
})
assert render(view) =~ "Realtime coffee meetup"
assert_eventually(fn -> render(view) =~ "Realtime coffee meetup" end)
end
test "activity realtime updates keep a bounded window without skipping pagination" do
@ -738,11 +742,14 @@ defmodule WhoNeedHelpWeb.MutualAidLiveTest do
activity
end
render(view)
first = List.first(activities)
overflow = List.last(activities)
assert has_element?(view, "#open-activity-#{first.id}")
assert_eventually(fn ->
has_element?(view, "#open-activity-#{first.id}") and
has_element?(view, "button", "Load more")
end)
refute has_element?(view, "#open-activity-#{overflow.id}")
view |> element("button", "Load more") |> render_click()