import { useEffect, useState } from 'react' import { Table, Tag, Select, Input, Button, Card, Divider, Spin } from 'antd' import { apiService } from '../../services/api' import { formatUSDC } from '../../utils' import { useMediaQuery } from 'react-responsive' import { useTranslation } from 'react-i18next' import type { SellOrderInfo, OrderTrackingRequest, OrderTrackingListResponse } from '../../types' const { Option } = Select interface SellOrdersTabProps { copyTradingId: string } const SellOrdersTab: React.FC = ({ copyTradingId }) => { const { t } = useTranslation() const isMobile = useMediaQuery({ maxWidth: 768 }) const [loading, setLoading] = useState(false) const [orders, setOrders] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [limit, setLimit] = useState(20) const [filters, setFilters] = useState<{ marketId?: string side?: string }>({}) useEffect(() => { if (copyTradingId) { fetchOrders() } }, [copyTradingId, page, limit, filters]) const fetchOrders = async () => { if (!copyTradingId) return setLoading(true) try { const request: OrderTrackingRequest = { copyTradingId: parseInt(copyTradingId), type: 'sell', page, limit, ...filters } const response = await apiService.orderTracking.list(request) if (response.data.code === 0 && response.data.data) { const data = response.data.data as OrderTrackingListResponse setOrders((data.list || []) as SellOrderInfo[]) setTotal(data.total || 0) } } catch (error: any) { console.error('获取卖出订单列表失败:', error) } finally { setLoading(false) } } const getPnlColor = (value: string): string => { const num = parseFloat(value) if (isNaN(num)) return '#666' return num >= 0 ? '#3f8600' : '#cf1322' } const columns = [ { title: t('copyTradingOrders.orderId') || '订单ID', dataIndex: 'orderId', key: 'orderId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: t('copyTradingOrders.leaderTradeId') || 'Leader 交易ID', dataIndex: 'leaderTradeId', key: 'leaderTradeId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: t('copyTradingOrders.market') || '市场', dataIndex: 'marketId', key: 'marketId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: t('copyTradingOrders.side') || '方向', dataIndex: 'side', key: 'side', width: isMobile ? 60 : 80, render: (side: string) => { const displaySide = side === '0' ? 'YES' : side === '1' ? 'NO' : side return {displaySide} } }, { title: t('copyTradingOrders.sellQuantity') || '卖出数量', dataIndex: 'quantity', key: 'quantity', width: isMobile ? 80 : 100, render: (value: string) => ( {formatUSDC(value)} ) }, { title: t('copyTradingOrders.sellPrice') || '卖出价格', dataIndex: 'price', key: 'price', width: isMobile ? 80 : 100, render: (value: string) => ( {formatUSDC(value)} ) }, { title: t('copyTradingOrders.sellAmount') || '卖出金额', key: 'amount', width: isMobile ? 100 : 120, render: (_: any, record: SellOrderInfo) => { const amount = (parseFloat(record.quantity) * parseFloat(record.price)).toString() return ( {isMobile ? formatUSDC(amount) : `${formatUSDC(amount)} USDC`} ) } }, { title: t('copyTradingOrders.realizedPnl') || '已实现盈亏', dataIndex: 'realizedPnl', key: 'realizedPnl', width: isMobile ? 100 : 120, render: (value: string) => ( {isMobile ? formatUSDC(value) : `${formatUSDC(value)} USDC`} ) }, { title: t('copyTradingOrders.createdAt') || '创建时间', dataIndex: 'createdAt', key: 'createdAt', width: isMobile ? 120 : 160, render: (timestamp: number) => ( {isMobile ? new Date(timestamp).toLocaleDateString('zh-CN') : new Date(timestamp).toLocaleString('zh-CN') } ) } ] return (
setFilters({ ...filters, marketId: e.target.value || undefined })} />
{isMobile ? (
{loading ? (
) : orders.length === 0 ? (
{t('copyTradingOrders.noSellOrders') || '暂无卖出订单'}
) : (
{orders.map((order) => { const date = new Date(order.createdAt) const formattedDate = date.toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) const amount = (parseFloat(order.quantity) * parseFloat(order.price)).toString() const displaySide = order.side === '0' ? 'YES' : order.side === '1' ? 'NO' : order.side return (
{order.orderId.slice(0, 8)}...{order.orderId.slice(-6)}
{displaySide}
{t('copyTradingOrders.sellInfo') || '卖出信息'}
{t('copyTradingOrders.quantity') || '数量'}: {formatUSDC(order.quantity)} | {t('copyTradingOrders.price') || '价格'}: {formatUSDC(order.price)}
{t('copyTradingOrders.amount') || '金额'}: {formatUSDC(amount)} USDC
{t('copyTradingOrders.realizedPnl') || '已实现盈亏'}
{formatUSDC(order.realizedPnl)} USDC
{t('copyTradingOrders.leaderTradeId') || 'Leader 交易ID'}
{order.leaderTradeId.slice(0, 8)}...{order.leaderTradeId.slice(-6)}
{t('copyTradingOrders.marketId') || '市场ID'}
{order.marketId.slice(0, 8)}...{order.marketId.slice(-6)}
{t('copyTradingOrders.createdAt') || '创建时间'}: {formattedDate}
) })}
)}
) : ( `${t('common.total') || '共'} ${total} ${t('common.items') || '条'}`, onChange: (newPage, newLimit) => { setPage(newPage) setLimit(newLimit) } }} /> )} ) } export default SellOrdersTab