Show a dynamically updated list of NTS servers #1

Merged
mike merged 21 commits from liveview into main 2024-07-26 09:35:19 -04:00
5 changed files with 80 additions and 40 deletions
Showing only changes of commit 8b9c344577 - Show all commits

View File

@ -1,28 +1,25 @@
<header class="px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between border-b border-zinc-100 py-3 text-sm">
<div class="flex items-center gap-4">
<a href="/">
<img src={~p"/images/logo.svg"} width="36" />
<div class="flex items-center justify-between border-b border-zinc-100 dark:border-zinc-700 py-3 text-sm">
<div class="flex items-center gap-4 font-semibold leading-6 text-zinc-900 dark:text-zinc-300 pe-4">
<a href="/" class="hover:text-zinc-700 dark:hover:text-zinc-400">
Chronoscope
</a>
<p class="bg-brand/5 text-brand rounded-full px-2 font-medium leading-6">
v<%= Application.spec(:phoenix, :vsn) %>
<p class="bg-brand/5 dark:bg-brand/70 text-brand dark:text-zinc-900 rounded-full px-2 font-medium leading-6">
v<%= Application.spec(:chronoscope, :vsn) %>
</p>
</div>
<div class="flex items-center gap-4 font-semibold leading-6 text-zinc-900">
<a href="https://twitter.com/elixirphoenix" class="hover:text-zinc-700">
@elixirphoenix
<div class="flex items-center gap-4 font-semibold leading-6 text-zinc-900 dark:text-zinc-300">
<a href="https://codeberg.org/mike-cifelli" class="hover:text-zinc-700 dark:hover:text-zinc-400">
Codeberg
</a>
<a href="https://github.com/phoenixframework/phoenix" class="hover:text-zinc-700">
GitHub
</a>
<a href="https://hexdocs.pm/phoenix/overview.html" class="rounded-lg bg-zinc-100 px-2 py-1 hover:bg-zinc-200/80">
Get Started <span aria-hidden="true">&rarr;</span>
<a href="/add" class="rounded-lg bg-zinc-200 dark:bg-zinc-600 px-2 py-1 hover:bg-zinc-300/80 dark:hover:bg-zinc-500/80 whitespace-nowrap">
Add a Server <span aria-hidden="true">&rarr;</span>
</a>
</div>
</div>
</header>
<main class="px-4 py-20 sm:px-6 lg:px-8">
<div class="mx-auto max-w-2xl">
<div class="mx-auto max-w-7xl">
<.flash_group flash={@flash} />
<%= @inner_content %>
</div>

View File

@ -11,7 +11,7 @@
<script defer phx-track-static type="text/javascript" src={~p"/assets/app.js"}>
</script>
</head>
<body class="bg-white antialiased">
<body class="bg-white dark:bg-zinc-800 dark:text-zinc-300 antialiased font-sans tracking-wide">
<%= @inner_content %>
</body>
</html>

View File

@ -1,21 +1,16 @@
defmodule ChronoscopeWeb.IndexLive do
use ChronoscopeWeb, :live_view
@topic "test"
alias Chronoscope.NTS
@topic "nts-servers"
def mount(_params, _session, socket) do
ChronoscopeWeb.Endpoint.subscribe(@topic)
ChronoscopeWeb.Endpoint.broadcast_from(self(), @topic, "", %{temperature: 100})
{:ok, assign(socket, :temperature, 100)}
{:ok, assign(socket, %{servers: NTS.list()})}
end
def handle_event("inc_temperature", _params, socket) do
updated = socket.assigns.temperature + 1
ChronoscopeWeb.Endpoint.broadcast_from(self(), @topic, "", %{temperature: updated})
{:noreply, assign(socket, :temperature, updated)}
end
def handle_info(%{topic: @topic, payload: state}, socket) do
{:noreply, assign(socket, state)}
def handle_info(%{topic: @topic, payload: servers}, socket) do
{:noreply, assign(socket, %{servers: servers})}
end
end

View File

@ -1,6 +1,60 @@
<div>
Live!
<br />
Current temperature: <%= @temperature %>°F
<button phx-click="inc_temperature">+</button>
</div>
<table class="mx-auto border-collapse table-auto min-w-full divide-y divide-zinc-200 dark:divide-zinc-700 text-left">
<thead>
<tr>
<th scope="col" class="py-3 px-6">
Host
</th>
<th scope="col" class="py-3 px-6">
Status
</th>
<th scope="col" class="py-3 px-6">
Algorithm
</th>
<th scope="col" class="py-3 px-6">
Cookies
</th>
<th scope="col" class="py-3 px-6">
Cookie Length
</th>
</tr>
</thead>
<tbody>
<tr :for={server <- @servers} class="hover:bg-zinc-100 dark:hover:bg-zinc-700">
<% {status, response} = server.key_establishment_response %>
<%= if (status == :ok) do %>
<td class="py-4 px-6 whitespace-nowrap">
<%= server.server.host %>:<%= server.server.port %>
</td>
<td class="py-4 px-6 whitespace-nowrap">
<%= status %>
</td>
<td class="py-4 px-6 whitespace-nowrap">
<%= Enum.at(response.aead_algorithms, 0) %>
</td>
<td class="py-4 px-6 whitespace-nowrap">
<%= length(response.cookies) %>
</td>
<td class="py-4 px-6 whitespace-nowrap">
<%= response.cookie_length %>
</td>
<% else %>
<td class="py-4 px-6 whitespace-nowrap">
<%= server.server.host %>:<%= server.server.port %>
</td>
<td class="py-4 px-6 whitespace-nowrap">
<span class="group relative">
<%= status %>
<span class="pointer-events-none absolute -top-9 left-0 w-max p-1 rounded-lg bg-zinc-300 dark:bg-zinc-600 opacity-0 transition-opacity group-hover:opacity-100">
<%= response %>
</span>
</span>
</td>
<td class="py-4 px-6 whitespace-nowrap"> - </td>
<td class="py-4 px-6 whitespace-nowrap"> - </td>
<td class="py-4 px-6 whitespace-nowrap"> - </td>
<% end %>
</tr>
</tbody>
</table>

View File

@ -14,16 +14,10 @@ defmodule ChronoscopeWeb.Router do
plug :accepts, ["json"]
end
scope "/test", ChronoscopeWeb do
pipe_through :browser
live "/", IndexLive
end
scope "/", ChronoscopeWeb do
pipe_through :browser
get "/", PageController, :home
live "/", IndexLive
end
scope "/api/v1", ChronoscopeWeb.API.V1 do