'use client'; import Link from 'next/link'; import { Pencil, Trash2 } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { formatDateTime } from '@/lib/utils'; import type { NodeItem } from '@/lib/services/openflare'; import { NodeStatusBadge } from './node-status-badge'; import { formatRelativeTime, getApplyLabel, getApplyTone, getNodeStatusLabel, getNodeStatusTone, getNodeTypeLabel, getOpenrestyStatusLabel, getOpenrestyStatusTone, getRelayStatusLabel, getRelayStatusTone, isMeaningfulTime, isWSConnectedLastSeen, } from './node-utils'; export function NodesTable({ nodes, deletingId, onEdit, onDelete, }: { nodes: NodeItem[]; deletingId: number | null; onEdit: (node: NodeItem) => void; onDelete: (node: NodeItem) => void; }) { return (
节点 状态 Version 运行健康 当前版本 最近应用 最近心跳 操作 {nodes.map((node) => (

{node.name}

IP:{node.ip || '—'} {node.ip_manual_override ? '(已锁定)' : ''}

位置:{node.geo_name || '未配置地图点位'}

{node.version || 'unknown'} {node.node_type === 'tunnel_relay' ? ( ) : node.node_type === 'tunnel_client' ? ( ) : ( )} {node.current_version || (node.node_type === 'tunnel_relay' ? '实时配置' : '未应用')} {node.node_type === 'tunnel_relay' ? ( — ) : ( )} {isWSConnectedLastSeen(node.last_seen_at) ? 'WS 已连接' : isMeaningfulTime(node.last_seen_at) ? `${formatRelativeTime(node.last_seen_at)} · ${formatDateTime(node.last_seen_at)}` : '暂无'}
))}
); }