defmodule Phoenix.LiveDashboard.AppInfoComponent do use Phoenix.LiveDashboard.Web, :live_component alias Phoenix.LiveDashboard.{PageBuilder, SystemInfo, ReingoldTilford} @impl true def render(assigns) do ~H"""
<%= if @alive do %> <%= for node <- @nodes do %> <%= node.label %> <% end %> <%= for line <- @lines do %> <% end %> <% else %>
No app or no supervision tree for app exists.
<% end %>
""" end @impl true def mount(socket) do {:ok, socket} end @impl true def update(%{id: "App<" <> app, page: page}, socket) do app = app |> String.replace_suffix(">", "") |> String.to_existing_atom() {:ok, socket |> assign(app: app, node: page.node) |> assign_tree()} end defp assign_tree(%{assigns: assigns} = socket) do case SystemInfo.fetch_app_tree(assigns.node, assigns.app) do {_, _} = tree -> tree = ReingoldTilford.build(tree, &node_label/1) nodes = ReingoldTilford.nodes(tree) lines = ReingoldTilford.lines(tree) {width, height} = ReingoldTilford.dimensions(nodes) assign(socket, nodes: nodes, lines: lines, width: width, height: height, alive: true) :error -> assign(socket, alive: false) end end defp node_encoded_pid({_, pid, _}), do: PageBuilder.encode_pid(pid) defp node_label({_, pid, []}), do: pid |> :erlang.pid_to_list() |> List.to_string() defp node_label({_, _, name}), do: inspect(name) end