import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Card, theme } from 'antd'; import { ArrowDownOutlined, ArrowUpOutlined } from '@ant-design/icons'; import { SizeFormatter } from '@/utils'; import { Sparkline } from '@/components/viz'; import type { Status } from '@/models/status'; import { mean, peak } from './useOverviewHistory'; interface ThroughputCardProps { status: Status; up: number[]; down: number[]; labels: string[]; isMobile: boolean; } export default function ThroughputCard({ status, up, down, labels, isMobile }: ThroughputCardProps) { const { t } = useTranslation(); const { token } = theme.useToken(); const accent = token.colorPrimary; const downColor = token.colorTextTertiary; const referenceLines = useMemo( () => [ { y: status.netIO.down, color: downColor, dash: '2 4' }, { y: status.netIO.up, color: accent, dash: '2 4' }, ], [status.netIO.up, status.netIO.down, accent, downColor], ); return (
{t('pages.index.overallSpeed')}
{`${t('pages.index.throughputSub')} · ${t('pages.index.peak')} ${SizeFormatter.speedFormat(peak(down))}`}
{t('pages.index.upload')} {SizeFormatter.speedFormat(status.netIO.up)}
{t('pages.index.download')} {SizeFormatter.speedFormat(status.netIO.down)}
{t('pages.index.sent')}
{SizeFormatter.sizeFormat(status.netTraffic.sent)}
{t('pages.index.received')}
{SizeFormatter.sizeFormat(status.netTraffic.recv)}
{t('pages.index.avgWindow')}
{`↑ ${SizeFormatter.speedFormat(mean(up))}`}{' '} {`↓ ${SizeFormatter.speedFormat(mean(down))}`}
); }