"use client"; import { usePoll } from "@/lib/use-poll"; import { StatCard } from "@/components/stat-card"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { StatusBadge } from "@/components/status-badge"; import { DataTable, Column } from "@/components/data-table"; interface AdGuardStats { total_queries?: number; num_dns_queries?: number; blocked?: number; num_blocked_filtering?: number; avg_time?: number; avg_processing_time?: number; } interface HeadscaleNode { id: string; name: string; ip_addresses?: string[]; ip?: string; online: boolean; last_seen?: string; } interface DnsRewrite { domain: string; answer: string; } export default function NetworkPage() { const { data: adguard } = usePoll("/api/network/adguard", 60000); const { data: nodesRaw } = usePoll("/api/network/headscale", 30000); const { data: rewritesRaw } = usePoll("/api/network/adguard/rewrites", 120000); const nodes = Array.isArray(nodesRaw) ? nodesRaw : (nodesRaw?.nodes ?? []); const rewrites = Array.isArray(rewritesRaw) ? rewritesRaw : (rewritesRaw?.rewrites ?? []); const rewriteColumns: Column[] = [ { key: "domain", label: "Domain", render: (row) => {row.domain}, }, { key: "answer", label: "Answer" }, ]; return (

Network

{/* Top row: AdGuard stats */}
{ const v = adguard?.total_queries ?? adguard?.num_dns_queries; return v != null ? v.toLocaleString() : "\u2014"; })()} sub="DNS queries" /> { const v = adguard?.blocked ?? adguard?.num_blocked_filtering; return v != null ? v.toLocaleString() : "\u2014"; })()} sub="blocked by filters" /> { const v = adguard?.avg_time ?? adguard?.avg_processing_time; return v != null ? `${(v * 1000).toFixed(1)}ms` : "\u2014"; })()} sub="processing time" />
{/* Middle: Headscale nodes grid */} Headscale Nodes {nodes.length === 0 ? (

Loading...

) : (
{nodes.map((node) => (
{node.name}

{node.ip_addresses?.[0] ?? node.ip ?? "—"}

{node.last_seen && (

{new Date(node.last_seen).toLocaleString("en-US", { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", })}

)}
))}
)}
{/* Bottom: DNS rewrites table */} DNS Rewrites data={rewrites} columns={rewriteColumns} searchKey="domain" />
); }