defmodule ToweropsWeb.DeviceLive.Components.WirelessTab do @moduledoc """ LiveComponent for the device wireless clients tab. Displays wireless clients connected to the device with optional subscriber matching from Gaiia integration. """ use ToweropsWeb, :live_component alias ToweropsWeb.DeviceLive.Helpers.DataLoaders @impl true def update(assigns, socket) do {:ok, socket |> assign(assigns) |> load_wireless_data()} end defp load_wireless_data(socket) do device_id = socket.assigns.device.id wireless_data = DataLoaders.load_wireless_data(device_id) socket |> assign(:wireless_clients, wireless_data.wireless_clients) |> assign(:wireless_client_subscribers, wireless_data.wireless_client_subscribers) |> assign(:wireless_client_count, wireless_data.wireless_client_count) |> assign(:wireless_matched_count, wireless_data.wireless_matched_count) |> assign(:wireless_last_updated, wireless_data.wireless_last_updated) |> assign(:wireless_clients_available, wireless_data.wireless_clients_available) end @impl true def render(assigns) do ~H"""
{length(@wireless_clients)} clients — {@wireless_matched_count} subscribers matched <%= if @wireless_last_updated do %> · Last updated {format_relative_time(@wireless_last_updated)} <% end %>
| MAC Address | IP Address | Subscriber | Signal | SNR | Distance | TX Rate | RX Rate | Uptime |
|---|---|---|---|---|---|---|---|---|
| {client.mac_address} <.icon name="hero-clipboard-document" class="h-3 w-3 inline ml-0.5 opacity-0 group-hover/mac:opacity-100 transition-opacity text-gray-400" /> | <%= if client.ip_address do %> {client.ip_address} <.icon name="hero-clipboard-document" class="h-3 w-3 inline ml-0.5 opacity-0 group-hover/ip:opacity-100 transition-opacity text-gray-400" /> <% else %> — <% end %> | <%= if subscriber_link && subscriber_link.gaiia_account do %> {subscriber_link.gaiia_account.account_name} <% else %> — <% end %> | <%= if client.signal_strength do %> <.signal_badge value={client.signal_strength} /> <% else %> — <% end %> | <%= if client.snr do %> <.snr_badge value={client.snr} /> <% else %> — <% end %> | <%= if client.distance do %> {client.distance}m <% else %> — <% end %> | {format_rate(client.tx_rate)} | {format_rate(client.rx_rate)} | <%= if client.uptime_seconds do %> {format_uptime(client.uptime_seconds * 100)} <% else %> — <% end %> |
{t("No clients are currently connected to this access point.")}