import { useEffect, useState } from 'react' import { useNavigate, useSearchParams } from 'react-router-dom' import { Card, Descriptions, Button, Space, Tag, Spin, message, Typography, Divider, Modal, Form, Input, Alert } from 'antd' import { ArrowLeftOutlined, ReloadOutlined, EditOutlined } from '@ant-design/icons' import { useTranslation } from 'react-i18next' import { useAccountStore } from '../store/accountStore' import type { Account } from '../types' import { useMediaQuery } from 'react-responsive' import { formatUSDC } from '../utils' import AccountSetupStatusBlock from '../components/AccountSetupStatusBlock' const { Title } = Typography const AccountDetail: React.FC = () => { const { t } = useTranslation() const navigate = useNavigate() const [searchParams] = useSearchParams() const isMobile = useMediaQuery({ maxWidth: 768 }) const accountId = searchParams.get('id') const { fetchAccountDetail, fetchAccountBalance, updateAccount } = useAccountStore() const [account, setAccount] = useState(null) const [balance, setBalance] = useState(null) const [loading, setLoading] = useState(true) const [balanceLoading, setBalanceLoading] = useState(false) const [editModalVisible, setEditModalVisible] = useState(false) const [editForm] = Form.useForm() const [editLoading, setEditLoading] = useState(false) useEffect(() => { if (accountId) { loadAccountDetail() loadBalance() } else { message.error(t('account.accountIdRequired')) navigate('/accounts') } }, [accountId]) const loadAccountDetail = async () => { if (!accountId) return setLoading(true) try { const accountData = await fetchAccountDetail(Number(accountId)) setAccount(accountData) } catch (error: any) { message.error(error.message || t('account.getDetailFailed')) navigate('/accounts') } finally { setLoading(false) } } const loadBalance = async () => { if (!accountId) return setBalanceLoading(true) try { const balanceData = await fetchAccountBalance(Number(accountId)) setBalance(balanceData.totalBalance || null) } catch (error: any) { console.error('获取余额失败:', error) // 余额查询失败不显示错误,只显示 "-" setBalance(null) } finally { setBalanceLoading(false) } } const handleEditSubmit = async (values: any) => { if (!account) return setEditLoading(true) try { // 构建更新请求,只支持编辑账户名称 const updateData: any = { accountId: account.id, accountName: values.accountName || undefined, } await updateAccount(updateData) message.success(t('account.updateSuccess')) setEditModalVisible(false) editForm.resetFields() // 刷新账户详情 if (accountId) { await loadAccountDetail() } } catch (error: any) { message.error(error.message || t('account.updateFailed')) } finally { setEditLoading(false) } } if (loading) { return (
) } if (!account) { return null } return (
{account.accountName || `账户 ${account.id}`}
{account.id} {account.accountName || '-'} {account.walletType && ( {account.walletType.toLowerCase() === 'magic' ? 'Magic' : 'Safe'} )} {account.walletAddress} {balanceLoading ? ( ) : balance ? ( {formatUSDC(balance)} USDC ) : ( - )} {accountId && (
{ loadAccountDetail(); loadBalance() }} size={isMobile ? 'small' : 'default'} showApprovalDetails={true} />
)} {(account.totalOrders !== undefined || account.totalPnl !== undefined || account.activeOrders !== undefined || account.completedOrders !== undefined || account.positionCount !== undefined) ? ( <> {account.totalOrders !== undefined && ( {account.totalOrders} )} {account.activeOrders !== undefined && ( 0 ? 'orange' : 'default'}>{account.activeOrders} )} {account.completedOrders !== undefined && ( {account.completedOrders} )} {account.positionCount !== undefined && ( 0 ? 'blue' : 'default'}>{account.positionCount} )} {account.totalPnl !== undefined && ( {formatUSDC(account.totalPnl)} USDC )} ) : null} {/* 编辑账户 Modal */} { setEditModalVisible(false) editForm.resetFields() }} footer={null} width={isMobile ? '95%' : 600} style={{ top: isMobile ? 20 : 50 }} destroyOnClose maskClosable closable > {account ? (
) : (
{t('common.loading')}
)}
) } export default AccountDetail