import { useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Card, Table, Button, Space, Tag, Popconfirm, message, List, Empty, Spin, Divider, Typography } from 'antd' import { PlusOutlined, EditOutlined, DeleteOutlined, GlobalOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' import { apiService } from '../services/api' import type { Leader } from '../types' import { useMediaQuery } from 'react-responsive' const { Text } = Typography const LeaderList: React.FC = () => { const { t, i18n } = useTranslation() const navigate = useNavigate() const isMobile = useMediaQuery({ maxWidth: 768 }) const [leaders, setLeaders] = useState([]) const [loading, setLoading] = useState(false) useEffect(() => { fetchLeaders() }, []) const fetchLeaders = async () => { setLoading(true) try { const response = await apiService.leaders.list() if (response.data.code === 0 && response.data.data) { setLeaders(response.data.data.list || []) } else { message.error(response.data.msg || t('leaderList.fetchFailed') || '获取 Leader 列表失败') } } catch (error: any) { message.error(error.message || t('leaderList.fetchFailed') || '获取 Leader 列表失败') } finally { setLoading(false) } } const handleDelete = async (leaderId: number) => { try { const response = await apiService.leaders.delete({ leaderId }) if (response.data.code === 0) { message.success(t('leaderList.deleteSuccess') || '删除 Leader 成功') fetchLeaders() } else { message.error(response.data.msg || t('leaderList.deleteFailed') || '删除 Leader 失败') } } catch (error: any) { message.error(error.message || t('leaderList.deleteFailed') || '删除 Leader 失败') } } const columns = [ { title: t('leaderList.leaderName') || 'Leader 名称', dataIndex: 'leaderName', key: 'leaderName', render: (text: string, record: Leader) => text || `Leader ${record.id}` }, { title: t('leaderList.walletAddress') || '钱包地址', dataIndex: 'leaderAddress', key: 'leaderAddress', render: (address: string) => ( {isMobile ? `${address.slice(0, 6)}...${address.slice(-4)}` : address} ) }, { title: t('leaderList.remark') || '备注', dataIndex: 'remark', key: 'remark', render: (remark: string | undefined) => remark ? ( {remark} ) : - }, { title: t('leaderList.copyTradingCount') || '跟单关系数', dataIndex: 'copyTradingCount', key: 'copyTradingCount', render: (count: number) => {count} }, { title: t('leaderList.createdAt') || '创建时间', dataIndex: 'createdAt', key: 'createdAt', render: (timestamp: number) => { const date = new Date(timestamp) return date.toLocaleString(i18n.language || 'zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) } }, { title: t('common.actions') || '操作', key: 'action', width: isMobile ? 150 : 200, render: (_: any, record: Leader) => ( {record.website && ( )} 0 ? t('leaderList.deleteConfirmDesc', { count: record.copyTradingCount }) || `该 Leader 还有 ${record.copyTradingCount} 个跟单关系,请先删除跟单关系` : undefined} onConfirm={() => handleDelete(record.id)} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} > ) } ] return (

{t('leaderList.title') || 'Leader 管理'}

{isMobile ? ( // 移动端卡片布局
{loading ? (
) : leaders.length === 0 ? ( ) : ( { const date = new Date(leader.createdAt) const formattedDate = date.toLocaleString(i18n.language || 'zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) return ( {/* Leader 名称和地址 */}
{leader.leaderName || `Leader ${leader.id}`}
{leader.leaderAddress}
{/* 备注 */} {leader.remark && (
{t('leaderList.remark') || '备注'}: {leader.remark}
)} {/* 跟单关系数 */}
{t('leaderList.copyTradingRelations', { count: leader.copyTradingCount }) || `${leader.copyTradingCount} 个跟单关系`}
{/* 创建时间 */}
{t('leaderList.createdAt') || '创建时间'}: {formattedDate}
{/* 操作按钮 */}
{leader.website && ( )} 0 ? t('leaderList.deleteConfirmDesc', { count: leader.copyTradingCount }) || `该 Leader 还有 ${leader.copyTradingCount} 个跟单关系,请先删除跟单关系` : undefined} onConfirm={() => handleDelete(leader.id)} okText={t('common.confirm') || '确定'} cancelText={t('common.cancel') || '取消'} >
) }} /> )}
) : ( // 桌面端表格布局 )} ) } export default LeaderList