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() agents = Agents.from_servers(servers) {:ok, socket |> assign(:servers, servers) |> assign(:agents, agents)} 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 flex"> <.status_bar agent={@agents[server.id]} />

<%= server.name %>

IP: <%= server.public_ip || "N/A" %>
<.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.Agent{} = agent, socket) do # id = String.to_integer(agent.id) # {:noreply, update(socket, :agents, &Map.put(&1, id, agent))} # end def handle_info(msg, state) do Logger.debug("received unexpected message #{inspect(msg)}") {:noreply, state} end defp status_bar(assigns) do assigns = assign(assigns, :class, [ "w-3 rounded-l-lg", assigns.agent.status == :connected && "bg-teal-500", assigns.agent.status == :disconnected && "bg-red-500" ]) ~H"""
""" end end