diff --git a/lib/towerops_web/live/agent_live/index.ex b/lib/towerops_web/live/agent_live/index.ex index 85fb2f3b..6e1d75e4 100644 --- a/lib/towerops_web/live/agent_live/index.ex +++ b/lib/towerops_web/live/agent_live/index.ex @@ -55,7 +55,7 @@ defmodule ToweropsWeb.AgentLive.Index do |> assign(:page_title, "Remote Agents") |> assign(:timezone, socket.assigns.current_scope.timezone) |> assign(:is_superuser, is_superuser) - |> assign(:agent_tokens, agent_tokens) + |> stream(:agent_tokens, agent_tokens) |> assign(:cloud_pollers, cloud_pollers) |> assign(:global_default_cloud_poller_id, global_default_cloud_poller_id) |> assign(:selected_global_default, global_default_cloud_poller_id || "") @@ -355,18 +355,18 @@ defmodule ToweropsWeb.AgentLive.Index do # Handle real-time agent status updates @impl true - def handle_info({:agent_connected, _agent_token_id, _organization_id}, socket) do - {:noreply, reload_agent_data(socket)} + def handle_info({:agent_connected, agent_token_id, _organization_id}, socket) do + {:noreply, update_single_agent(socket, agent_token_id)} end @impl true - def handle_info({:agent_disconnected, _agent_token_id, _organization_id}, socket) do - {:noreply, reload_agent_data(socket)} + def handle_info({:agent_disconnected, agent_token_id, _organization_id}, socket) do + {:noreply, update_single_agent(socket, agent_token_id)} end @impl true - def handle_info({:agent_heartbeat, _agent_token_id, _organization_id}, socket) do - {:noreply, reload_agent_data(socket)} + def handle_info({:agent_heartbeat, agent_token_id, _organization_id}, socket) do + {:noreply, update_single_agent(socket, agent_token_id)} end @impl true @@ -388,7 +388,7 @@ defmodule ToweropsWeb.AgentLive.Index do offline_agents = Stats.get_offline_agents(organization.id) socket - |> assign(:agent_tokens, agent_tokens) + |> stream(:agent_tokens, agent_tokens, reset: true) |> assign(:cloud_pollers, cloud_pollers) |> assign(:device_counts, equipment_counts) |> assign(:cloud_poller_counts, cloud_poller_counts) @@ -396,4 +396,27 @@ defmodule ToweropsWeb.AgentLive.Index do |> assign(:assignment_breakdown, assignment_breakdown) |> assign(:offline_agents, offline_agents) end + + defp update_single_agent(socket, agent_token_id) do + agent_token = Agents.get_agent_token!(agent_token_id) + + socket + |> stream_insert(:agent_tokens, agent_token) + |> maybe_update_stats() + rescue + Ecto.NoResultsError -> + # Agent was deleted, just update stats + maybe_update_stats(socket) + end + + defp maybe_update_stats(socket) do + organization = socket.assigns.current_scope.organization + + agent_health_stats = Stats.get_organization_agent_health(organization.id) + offline_agents = Stats.get_offline_agents(organization.id) + + socket + |> assign(:agent_health_stats, agent_health_stats) + |> assign(:offline_agents, offline_agents) + end end diff --git a/lib/towerops_web/live/agent_live/index.html.heex b/lib/towerops_web/live/agent_live/index.html.heex index 09c6eb56..9b17aa7f 100644 --- a/lib/towerops_web/live/agent_live/index.html.heex +++ b/lib/towerops_web/live/agent_live/index.html.heex @@ -52,7 +52,7 @@ - <%= if @agent_tokens == [] do %> + <%= if Enum.empty?(@streams.agent_tokens) do %>