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 = if connected?(socket) do for %Servers.Server{status: :registered, public_ip: ip} <- servers, into: %{} do Agents.subscribe_to_health(ip) Agents.start_connection(ip) {ip, Agents.get_health(ip)} end else %{} end {:ok, socket |> assign(:servers, servers) |> assign(:healths, healths)} 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 class="w-5" /> """ {: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