'use client'; import Link from 'next/link'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { formatDecimal } from '@/lib/utils/format'; import { getAccountDisplayInfo, type SystemAccount } from '@/types/system-account'; import { getRegionDisplayName } from '@/lib/constants/region-codes'; import { formatDistanceToNow } from 'date-fns'; import { zhCN } from 'date-fns/locale'; import { FileText } from 'lucide-react'; interface AccountsTableProps { title: string; accounts: SystemAccount[]; isLoading?: boolean; showSyncInfo?: boolean; showMiningData?: boolean; } export function AccountsTable({ title, accounts, isLoading = false, showSyncInfo = false, showMiningData = true, }: AccountsTableProps) { // 计算列数 const getColumnCount = () => { let count = 5; // 基础列: 类型, 名称, 算力, 来源, 操作 if (showMiningData) count += 1; // 已挖积分股 if (showSyncInfo) count += 1; // 同步时间 return count; }; return ( {title} {accounts.length > 0 && ( {accounts.length} 个账户 )} 账户类型 账户名称 算力 {showMiningData && ( 已挖积分股 )} 来源 {showSyncInfo && 同步时间} 操作 {isLoading ? ( [...Array(3)].map((_, i) => ( {[...Array(getColumnCount())].map((_, j) => ( ))} )) ) : accounts.length === 0 ? ( 暂无数据 ) : ( accounts.map((account) => { const displayInfo = getAccountDisplayInfo(account.accountType); const contribution = account.contributionBalance || account.totalContribution || '0'; const totalMined = account.totalMined || '0'; // 使用前端区域代码映射获取显示名称 const displayName = account.regionCode ? getRegionDisplayName(account.regionCode, account.accountType) : (account.name || displayInfo.label); return (
{account.accountType} {account.regionCode && `_${account.regionCode}`}
{displayName} {formatDecimal(contribution, 8)} {account.contributionNeverExpires && ( 永久 )} {showMiningData && ( 0 ? 'text-green-600' : 'text-muted-foreground'}> {formatDecimal(totalMined, 8)} )} {account.source === 'synced' ? 'CDC同步' : '本地'} {showSyncInfo && ( {account.syncedAt ? formatDistanceToNow(new Date(account.syncedAt), { addSuffix: true, locale: zhCN, }) : '-'} )}
); }) )}
); }