fix: Resolve infinite "loading historical data" issue

Fix the issue where the historical data loading indicator would get stuck
indefinitely when no packets are found for a callsign or time period.

Changes:
- Handle empty packet results by properly updating loading state
- Add failsafe timeout (30s) to prevent infinite loading states
- Add debug logging to help identify when no packets are found
- Ensure loading progress is updated even when batches return no data

This fixes the issue where viewing callsigns with no recent data would
show "loading historical data" forever.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Graham McIntire 2025-07-30 14:49:40 -05:00
parent 18b85ad512
commit 9f52f8cb49
No known key found for this signature in database
2 changed files with 40 additions and 1 deletions

View file

@ -49,6 +49,9 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do
# Cancel any pending batch tasks
socket = cancel_pending_loads(socket)
# Add a failsafe timeout to prevent infinite loading
Process.send_after(self(), {:historical_loading_timeout, new_generation}, 30_000)
# For high zoom levels, load everything in one batch for maximum speed
zoom = socket.assigns.map_zoom || 5
@ -210,7 +213,24 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do
process_loaded_packets(socket, historical_packets, packet_data_list, batch_offset)
else
socket
# No packets found - handle this as a completed batch to prevent infinite loading
require Logger
Logger.debug(
"No historical packets found for batch #{batch_offset}, hours_back: #{Map.get(socket.assigns, :historical_hours, "1")}, callsign: #{Map.get(socket.assigns, :tracked_callsign, "")}"
)
total_batches = socket.assigns.total_batches || 1
is_final_batch = batch_offset >= total_batches - 1
# Update progress for user feedback
socket = assign(socket, :loading_batch, batch_offset + 1)
# Mark loading as complete if this was the final batch or if we're doing single-batch loading
socket = update_loading_status(socket, is_final_batch)
# Process any pending bounds update if loading is complete
handle_pending_bounds(socket, is_final_batch)
end
end
end

View file

@ -872,6 +872,25 @@ defmodule AprsmeWeb.MapLive.Index do
end
end
def handle_info({:historical_loading_timeout, generation}, socket) do
# Only process if generation matches current loading generation and we're still loading
if generation == socket.assigns.loading_generation && socket.assigns.historical_loading do
require Logger
Logger.warning("Historical loading timeout reached, forcing completion")
socket =
socket
|> assign(:historical_loading, false)
|> assign(:loading_batch, socket.assigns.total_batches || 1)
{:noreply, socket}
else
# Stale timeout or already completed, ignore it
{:noreply, socket}
end
end
def handle_info(%Broadcast{topic: "aprs_messages", event: "packet", payload: packet}, socket),
do: handle_info({:postgres_packet, packet}, socket)