From 1c7c980cf4a6d86312c8b673cb1af9773ec41e24 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 3 Apr 2026 10:52:24 -0500 Subject: [PATCH] Debounce backfill dashboard updates to once per second --- lib/microwaveprop_web/live/backfill_live.ex | 27 +++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/microwaveprop_web/live/backfill_live.ex b/lib/microwaveprop_web/live/backfill_live.ex index 6bc3004d..5caf081c 100644 --- a/lib/microwaveprop_web/live/backfill_live.ex +++ b/lib/microwaveprop_web/live/backfill_live.ex @@ -34,7 +34,8 @@ defmodule MicrowavepropWeb.BackfillLive do unprocessed: unprocessed, db_stats: db_stats, last_enqueued: nil, - enqueuing: false + enqueuing: false, + refresh_timer: nil )} end @@ -59,21 +60,33 @@ defmodule MicrowavepropWeb.BackfillLive do end def handle_info({:contact_status_changed, _data}, socket) do - {:noreply, - assign(socket, - unprocessed: count_unprocessed(), - db_stats: fetch_db_stats() - )} + {:noreply, schedule_refresh(socket)} end def handle_info({:oban_job_changed, _data}, socket) do + {:noreply, schedule_refresh(socket)} + end + + def handle_info(:refresh_stats, socket) do {:noreply, assign(socket, stats: fetch_stats(), - unprocessed: count_unprocessed() + unprocessed: count_unprocessed(), + db_stats: fetch_db_stats(), + refresh_timer: nil )} end + defp schedule_refresh(%{assigns: %{refresh_timer: ref}} = socket) when is_reference(ref) do + # Already scheduled, skip + socket + end + + defp schedule_refresh(socket) do + ref = Process.send_after(self(), :refresh_stats, 1000) + assign(socket, refresh_timer: ref) + end + @enrichable [:pending, :failed] defp enqueue_batch(limit) do