"use client"; import { useState, useMemo } from "react"; import { Server, Search, Wifi, WifiOff, Clock, MapPin, Shield, } from "lucide-react"; interface TunnelConnection { id: string; is_pending_reconnect: boolean; origin_ip: string; opened_at: string; } interface Tunnel { id: string; name: string; status: string; created_at: string; deleted_at: string | null; connections: TunnelConnection[]; } function timeAgo(dateStr: string): string { const diff = Date.now() - new Date(dateStr).getTime(); const mins = Math.floor(diff / 60000); if (mins < 1) return "Just now"; if (mins < 60) return `${mins}m ago`; const hrs = Math.floor(mins / 60); if (hrs < 24) return `${hrs}h ago`; const days = Math.floor(hrs / 24); if (days < 30) return `${days}d ago`; return `${Math.floor(days / 30)}mo ago`; } export default function TunnelList({ tunnels }: { tunnels: Tunnel[] }) { const [search, setSearch] = useState(""); const filtered = useMemo(() => { const q = search.toLowerCase(); if (!q) return tunnels; return tunnels.filter( (t) => t.name.toLowerCase().includes(q) || t.id.toLowerCase().includes(q) ); }, [tunnels, search]); const activeCount = tunnels.filter( (t) => t.connections && t.connections.length > 0 ).length; return (
{tunnels.length} total · {activeCount} active
No tunnels found
{tunnel.id}