defmodule LiveDebuggerWeb.LiveViewsDashboardLive do @moduledoc """ It displays all active LiveView sessions in the debugged application. """ use LiveDebuggerWeb, :live_view alias Phoenix.LiveView.AsyncResult alias LiveDebugger.Services.LiveViewDiscoveryService alias LiveDebuggerWeb.Components.TabGroup alias LiveDebuggerWeb.Components.Navbar @impl true def handle_params(_unsigned_params, _uri, socket) do socket |> assign_async_grouped_lv_processes() |> noreply() end @impl true def render(assigns) do ~H"""
<.h1>Active LiveViews <.button phx-click="refresh">
<.icon name="icon-refresh" class="w-4 h-4" />

Refresh

<.async_result :let={grouped_lv_processes} assign={@grouped_lv_processes}> <:loading>
<.spinner size="md" />
<:failed> <.alert variant="danger" with_icon heading="Error fetching active LiveViews"> Check logs for more
<%= if Enum.empty?(grouped_lv_processes) do %>

No active LiveViews

<% else %> <% end %>
""" end @impl true def handle_event("refresh", _params, socket) do socket |> assign(:grouped_lv_processes, AsyncResult.loading()) |> assign_async_grouped_lv_processes() |> noreply() end defp assign_async_grouped_lv_processes(socket) do assign_async(socket, :grouped_lv_processes, fn -> lv_processes = with [] <- fetch_lv_processes_after(200), [] <- fetch_lv_processes_after(800) do fetch_lv_processes_after(1000) end {:ok, %{grouped_lv_processes: LiveViewDiscoveryService.group_lv_processes(lv_processes)}} end) end defp fetch_lv_processes_after(milliseconds) do Process.sleep(milliseconds) LiveViewDiscoveryService.debugged_lv_processes() end end