'use client'; import { useState } from 'react'; import { Eye } from 'lucide-react'; import { useTranslations } from 'next-intl'; 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 { cacheOutcomeLabel, DETAIL_SORT_OPTIONS, resolveCacheOutcome, type CacheOutcome, } from './access-log-utils'; function cacheOutcomeVariant( outcome: CacheOutcome, ): 'default' | 'secondary' | 'outline' | 'destructive' { switch (outcome) { case 'hit': return 'default'; case 'origin': return 'secondary'; default: return 'outline'; } } function PaginationBar({ page, hasMore, loading, onPrev, onNext, }: { page: number; hasMore: boolean; loading: boolean; onPrev: () => void; onNext: () => void; }) { const t = useTranslations('accessLogs.detail'); return (

{t('page', { page: 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 t = useTranslations('accessLogs'); const [selected, setSelected] = useState(null); const [detailOpen, setDetailOpen] = useState(false); return ( <>

{t('detail.listTitle')}

{error ? (
) : loading ? ( ) : (data?.items ?? []).length === 0 ? ( ) : ( {t('detail.time')} {t('detail.node')} IP {t('detail.host')} {t('detail.path')} {t('detail.cache')} {t('detail.status')} {(data?.items ?? []).map((item) => { const outcome = resolveCacheOutcome(item.cache_status); return ( {formatDateTime(item.logged_at)} {item.node_name || item.node_id}
{item.remote_addr} {item.region ? ( {item.region} ) : null}
{item.host} {item.path} {cacheOutcomeLabel(outcome, (key) => t(key))} {item.status_code} {t('detail.view')}
); })}
)}
); }