feat: add batch RT import page for managing S2A account creation.
This commit is contained in:
@@ -13,7 +13,7 @@ import {
|
|||||||
FileText,
|
FileText,
|
||||||
AlertTriangle,
|
AlertTriangle,
|
||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
import { Card, CardHeader, CardTitle, CardContent, Button, Input } from '../components/common'
|
import { Card, CardHeader, CardTitle, CardContent, Button } from '../components/common'
|
||||||
import { useConfig } from '../hooks/useConfig'
|
import { useConfig } from '../hooks/useConfig'
|
||||||
|
|
||||||
interface RTImportResult {
|
interface RTImportResult {
|
||||||
@@ -41,9 +41,6 @@ export default function BatchRTImport() {
|
|||||||
|
|
||||||
const [tokens, setTokens] = useState<string[]>([])
|
const [tokens, setTokens] = useState<string[]>([])
|
||||||
const [prefix, setPrefix] = useState<'team' | 'free'>('team')
|
const [prefix, setPrefix] = useState<'team' | 'free'>('team')
|
||||||
const [concurrency, setConcurrency] = useState(3)
|
|
||||||
const [priority, setPriority] = useState(10)
|
|
||||||
const [rateMultiplier, setRateMultiplier] = useState(1.0)
|
|
||||||
const [status, setStatus] = useState<RTImportStatus | null>(null)
|
const [status, setStatus] = useState<RTImportStatus | null>(null)
|
||||||
const [polling, setPolling] = useState(false)
|
const [polling, setPolling] = useState(false)
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
@@ -153,10 +150,6 @@ export default function BatchRTImport() {
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
tokens,
|
tokens,
|
||||||
prefix,
|
prefix,
|
||||||
concurrency,
|
|
||||||
priority,
|
|
||||||
rate_multiplier: rateMultiplier,
|
|
||||||
group_ids: [],
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -172,7 +165,7 @@ export default function BatchRTImport() {
|
|||||||
setFileError('启动失败')
|
setFileError('启动失败')
|
||||||
}
|
}
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
}, [tokens, prefix, concurrency, priority, rateMultiplier, fetchStatus])
|
}, [tokens, prefix, fetchStatus])
|
||||||
|
|
||||||
// 停止导入
|
// 停止导入
|
||||||
const handleStop = useCallback(async () => {
|
const handleStop = useCallback(async () => {
|
||||||
@@ -373,37 +366,7 @@ export default function BatchRTImport() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Parameters */}
|
|
||||||
<div className="grid grid-cols-3 gap-2">
|
|
||||||
<Input
|
|
||||||
label="并发数"
|
|
||||||
type="number"
|
|
||||||
min={1}
|
|
||||||
max={10}
|
|
||||||
value={concurrency}
|
|
||||||
onChange={(e) => setConcurrency(Number(e.target.value))}
|
|
||||||
disabled={isRunning}
|
|
||||||
/>
|
|
||||||
<Input
|
|
||||||
label="优先级"
|
|
||||||
type="number"
|
|
||||||
min={1}
|
|
||||||
max={100}
|
|
||||||
value={priority}
|
|
||||||
onChange={(e) => setPriority(Number(e.target.value))}
|
|
||||||
disabled={isRunning}
|
|
||||||
/>
|
|
||||||
<Input
|
|
||||||
label="计费倍率"
|
|
||||||
type="number"
|
|
||||||
min={0.1}
|
|
||||||
max={10}
|
|
||||||
step={0.1}
|
|
||||||
value={rateMultiplier}
|
|
||||||
onChange={(e) => setRateMultiplier(Number(e.target.value))}
|
|
||||||
disabled={isRunning}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Action Buttons */}
|
{/* Action Buttons */}
|
||||||
<div className="flex gap-2 pt-2">
|
<div className="flex gap-2 pt-2">
|
||||||
|
|||||||
Reference in New Issue
Block a user