Files
PolyHermes/frontend/src/pages/LeaderAdd.tsx
T

127 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-12-01 23:36:23 +08:00
import { useState } from 'react'
2025-11-21 04:32:08 +08:00
import { useNavigate } from 'react-router-dom'
2025-12-01 23:36:23 +08:00
import { Card, Form, Input, Button, Select, message, Typography, Space } from 'antd'
2025-11-21 04:32:08 +08:00
import { ArrowLeftOutlined } from '@ant-design/icons'
import { apiService } from '../services/api'
import { useMediaQuery } from 'react-responsive'
2025-12-01 23:36:23 +08:00
import { isValidWalletAddress } from '../utils'
2025-11-21 04:32:08 +08:00
const { Title } = Typography
const { Option } = Select
const LeaderAdd: React.FC = () => {
const navigate = useNavigate()
const isMobile = useMediaQuery({ maxWidth: 768 })
const [form] = Form.useForm()
const [loading, setLoading] = useState(false)
const handleSubmit = async (values: any) => {
setLoading(true)
try {
const response = await apiService.leaders.add({
2025-12-01 23:36:23 +08:00
leaderAddress: values.leaderAddress.trim(),
leaderName: values.leaderName?.trim() || undefined,
category: values.category || undefined
2025-11-21 04:32:08 +08:00
})
if (response.data.code === 0) {
message.success('添加 Leader 成功')
navigate('/leaders')
} else {
message.error(response.data.msg || '添加 Leader 失败')
}
} catch (error: any) {
message.error(error.message || '添加 Leader 失败')
} finally {
setLoading(false)
}
}
return (
<div>
<div style={{ marginBottom: '16px' }}>
<Button
icon={<ArrowLeftOutlined />}
onClick={() => navigate('/leaders')}
style={{ marginBottom: '16px' }}
>
返回
</Button>
<Title level={2} style={{ margin: 0 }}>添加 Leader</Title>
</div>
<Card>
<Form
form={form}
layout="vertical"
onFinish={handleSubmit}
size={isMobile ? 'middle' : 'large'}
initialValues={{
enabled: true
}}
>
<Form.Item
label="Leader 钱包地址"
name="leaderAddress"
rules={[
{ required: true, message: '请输入 Leader 钱包地址' },
{
2025-12-01 23:36:23 +08:00
validator: (_, value) => {
if (!value) {
return Promise.reject(new Error('请输入 Leader 钱包地址'))
}
if (!isValidWalletAddress(value.trim())) {
return Promise.reject(new Error('钱包地址格式不正确(必须是 0x 开头的 42 位地址)'))
}
return Promise.resolve()
}
2025-11-21 04:32:08 +08:00
}
]}
2025-12-01 23:36:23 +08:00
tooltip="被跟单者的钱包地址,系统将监控该地址的交易并自动跟单"
2025-11-21 04:32:08 +08:00
>
2025-12-01 23:36:23 +08:00
<Input placeholder="0x..." style={{ fontFamily: 'monospace' }} />
2025-11-21 04:32:08 +08:00
</Form.Item>
<Form.Item
label="Leader 名称"
name="leaderName"
2025-12-01 23:36:23 +08:00
tooltip="可选,用于标识 Leader,方便管理"
2025-11-21 04:32:08 +08:00
>
<Input placeholder="可选,用于标识 Leader" />
</Form.Item>
<Form.Item
label="分类筛选"
name="category"
2025-12-01 23:36:23 +08:00
tooltip="仅跟单该分类的交易,不选择则跟单所有分类(sports 或 crypto"
2025-11-21 04:32:08 +08:00
>
<Select placeholder="选择分类(可选)" allowClear>
<Option value="sports">Sports</Option>
<Option value="crypto">Crypto</Option>
</Select>
</Form.Item>
<Form.Item>
<Space>
<Button
type="primary"
htmlType="submit"
loading={loading}
size={isMobile ? 'middle' : 'large'}
>
添加 Leader
</Button>
<Button onClick={() => navigate('/leaders')}>
取消
</Button>
</Space>
</Form.Item>
</Form>
</Card>
</div>
)
}
export default LeaderAdd