import { useState, useEffect, useCallback } from 'react' import { Link } from 'react-router-dom' import { RefreshCw, Search, Settings, ChevronLeft, ChevronRight } from 'lucide-react' import { Card, CardHeader, CardTitle, CardContent, Button, Input, Select, Table, TableHeader, TableBody, TableRow, TableHead, TableCell, StatusBadge, } from '../components/common' import { useS2AApi } from '../hooks/useS2AApi' import { useConfig } from '../hooks/useConfig' import type { S2AAccount, AccountListParams } from '../types' import { formatDateTime } from '../utils/format' export default function Accounts() { const { config } = useConfig() const { getAccounts, loading, error } = useS2AApi() const [accounts, setAccounts] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [pageSize] = useState(20) const [search, setSearch] = useState('') const [statusFilter, setStatusFilter] = useState('') const [refreshing, setRefreshing] = useState(false) const hasConfig = config.s2a.apiBase && config.s2a.adminKey const fetchAccounts = useCallback(async () => { if (!hasConfig) return setRefreshing(true) const params: AccountListParams = { page, page_size: pageSize, platform: 'openai', } if (search) params.search = search if (statusFilter) params.status = statusFilter as 'active' | 'inactive' | 'error' const result = await getAccounts(params) if (result) { setAccounts(result.data) setTotal(result.total) } setRefreshing(false) }, [hasConfig, page, pageSize, search, statusFilter, getAccounts]) useEffect(() => { fetchAccounts() }, [fetchAccounts]) const handleSearch = (e: React.FormEvent) => { e.preventDefault() setPage(1) fetchAccounts() } const totalPages = Math.ceil(total / pageSize) return (
{/* Header */}

号池账号

查看 S2A 号池中的账号列表

{/* Connection warning */} {!hasConfig && (

请先配置 S2A 连接

查看账号列表需要配置 S2A API 连接信息

)} {/* Filters */} {hasConfig && (
setSearch(e.target.value)} className="w-full" />