defmodule PrymnWeb.ServerLive.Index do require Logger alias Prymn.{Agents, Servers} use PrymnWeb, :live_view @impl true def mount(_params, _session, socket) do servers = Servers.list_servers() healths = for %Servers.Server{status: :registered, id: id} = server <- servers, into: %{} do # Agents.from_server(server) # |> Agents.subscribe_to_health() {id, Agents.get_health(id)} end {:ok, socket |> assign(:servers, servers) |> assign(:healths, healths)} end @impl true def render(assigns) do ~H"""
<.header> Your servers <%= "#{Enum.count(@servers)} servers" %> <:actions> Connect a Server
<.link :for={server <- @servers} navigate={~p"/servers/#{server}"} class="group block rounded-lg bg-gray-100 p-5 shadow-sm shadow-gray-300 hover:bg-black hover:text-white" >

<%= server.name %>

<.server_status status={server.status} health={@healths[server.public_ip]} />
IP: <%= server.public_ip || "N/A" %> <%= if @healths[server.public_ip] do %>
In progress: <%= name %>
<%= task.progress %>
<% end %>
<.modal :if={@live_action == :new} id="server-modal" show on_cancel={JS.patch(~p"/servers")}> <.live_component module={PrymnWeb.ServerLive.NewServer} id={:new} patch={~p"/servers"} />
""" end @impl true def handle_params(_params, _url, socket) do socket = case socket.assigns.live_action do :new -> assign(socket, :page_title, gettext("Connect a Server")) :index -> assign(socket, :page_title, gettext("Listing Servers")) end {:noreply, socket} end @impl true def handle_info({:connect, %Servers.Server{} = server}, socket) do {:noreply, socket |> update(:servers, fn servers -> [server | servers] end)} end def handle_info(%Agents.Health{} = health, socket) do healths = Map.put(socket.assigns.healths, health.host, health) {:noreply, assign(socket, :healths, healths)} end def handle_info(msg, state) do Logger.debug("received unexpected message #{inspect(msg)}") {:noreply, state} end defp server_status(assigns) do case {assigns.status, assigns.health} do {:unregistered, _} -> ~H""" Needs registration """ {:registered, nil} -> ~H""" <.spinner size="md" /> """ {:registered, %Agents.Health{status: :connected}} -> ~H""" Connected """ {:registered, %Agents.Health{status: :disconnected}} -> ~H""" Disconnected """ {:registered, %Agents.Health{message: message}} -> assigns = assign(assigns, :message, message) ~H""" <%= @message %> """ end end end