'use client'; import { useState } from 'react'; import { Eye } from 'lucide-react'; import { EmptyStateWithBorder } from '@/components/layout/empty'; import { ErrorInline } from '@/components/layout/error'; import { LoadingStateWithBorder } from '@/components/layout/loading'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import type { AccessLogItem, AccessLogList } from '@/lib/services/openflare'; import { formatDateTime } from '@/lib/utils'; import { AccessLogDetailDialog } from './access-log-detail-dialog'; import { DETAIL_SORT_OPTIONS } from './access-log-utils'; function PaginationBar({ page, hasMore, loading, onPrev, onNext, }: { page: number; hasMore: boolean; loading: boolean; onPrev: () => void; onNext: () => void; }) { return (

当前第 {page + 1} 页

); } export function DetailTab({ data, loading, error, page, detailSort, onDetailSortChange, onRetry, onPrevPage, onNextPage, isFetching, }: { data?: AccessLogList; loading: boolean; error: Error | null; page: number; detailSort: string; onDetailSortChange: (value: string) => void; onRetry: () => void; onPrevPage: () => void; onNextPage: () => void; isFetching: boolean; }) { const [selected, setSelected] = useState(null); const [detailOpen, setDetailOpen] = useState(false); return ( <>

日志明细

{error ? (
) : loading ? ( ) : (data?.items ?? []).length === 0 ? ( ) : ( 时间 节点 IP 域名 路径 状态码 {(data?.items ?? []).map((item) => ( {formatDateTime(item.logged_at)} {item.node_name || item.node_id} {item.remote_addr} {item.host} {item.path} {item.status_code} 查看详情 ))}
)}
); }