dotfiles/app/lib/prymn_web/live/server_live/index.ex

90 lines
2.6 KiB
Elixir

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"""
<div class="mx-auto max-w-2xl">
<.header>
Your servers
<small class="block">
<%= "#{Enum.count(@servers)} servers" %>
</small>
<:actions>
<Button.primary patch={~p"/servers/new"}>Connect a Server</Button.primary>
</:actions>
</.header>
<div class="mt-10 space-y-5" phx-update="replace" id="servers">
<.link :for={server <- @servers} navigate={~p"/servers/#{server}"} class="group flex">
<.status_bar agent={@agents[server.id]} />
<div class="flex-1 rounded-r-lg bg-gray-100 p-5 transition-colors group-hover:bg-black group-hover:text-white">
<h2 class="text-xl"><%= server.name %></h2>
<div class="flex flex-row flex-wrap justify-between lg:text-sm">
<span>IP: <%= server.public_ip || "N/A" %></span>
</div>
</div>
</.link>
</div>
<.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"} />
</.modal>
</div>
"""
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"""
<div class={@class}></div>
"""
end
end