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 %>
<% 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