import { useEffect, useState } from 'react' import { Card, Row, Col, Statistic, message, DatePicker, Space, Button, Typography } from 'antd' import { ArrowUpOutlined, ArrowDownOutlined, ReloadOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' import type { Dayjs } from 'dayjs' import { apiService } from '../services/api' import type { Statistics as StatisticsType } from '../types' import { formatUSDC, formatNumber } from '../utils' import { useMediaQuery } from 'react-responsive' const { RangePicker } = DatePicker const { Title } = Typography const Statistics: React.FC = () => { const { t } = useTranslation() const isMobile = useMediaQuery({ maxWidth: 768 }) const [stats, setStats] = useState(null) const [loading, setLoading] = useState(false) const [dateRange, setDateRange] = useState<[Dayjs | null, Dayjs | null]>([null, null]) useEffect(() => { fetchStatistics() }, []) const fetchStatistics = async () => { setLoading(true) try { const startTime = dateRange[0] ? dateRange[0].valueOf() : undefined const endTime = dateRange[1] ? dateRange[1].valueOf() : undefined const response = await apiService.statistics.global({ startTime, endTime }) if (response.data.code === 0 && response.data.data) { setStats(response.data.data) } else { message.error(response.data.msg || t('statistics.fetchFailed') || '获取统计信息失败') } } catch (error: any) { message.error(error.message || t('statistics.fetchFailed') || '获取统计信息失败') } finally { setLoading(false) } } const handleDateRangeChange = (dates: [Dayjs | null, Dayjs | null] | null) => { setDateRange(dates || [null, null]) } const handleReset = () => { setDateRange([null, null]) // 重置后自动刷新 setTimeout(() => { fetchStatistics() }, 100) } return (
{t('statistics.title') || '统计信息'} {(dateRange[0] || dateRange[1]) && ( )}
{stats?.totalPnl && parseFloat(stats.totalPnl) >= 0 ? : } $} valueStyle={{ color: stats?.totalPnl && parseFloat(stats.totalPnl || '0') >= 0 ? '#3f8600' : '#cf1322' }} loading={loading} /> {stats?.avgPnl && parseFloat(stats.avgPnl || '0') >= 0 ? : } $} valueStyle={{ color: stats?.avgPnl && parseFloat(stats.avgPnl || '0') >= 0 ? '#3f8600' : '#cf1322' }} loading={loading} /> $} valueStyle={{ color: '#3f8600' }} loading={loading} /> $} valueStyle={{ color: '#cf1322' }} loading={loading} />
) } export default Statistics