import { Card, Col, Row, Space, Statistic, Tag, Typography, theme } from 'antd'; import { useEffect, useMemo, useState } from 'react'; import { accountApi, cookieApi, huyaApi, loginApi, type HuyaTaskItem, type LoginTaskItem, } from '../api/modules'; import { usePermissions } from '../hooks/usePermissions'; const { Title, Text } = Typography; interface PlatformStats { accounts: number; tasks: number; success: number; failed: number; } interface DashboardStats { douyu: PlatformStats & { cookies: number; }; huya: PlatformStats & { goods: number; rechargeGoods: number; }; } const EMPTY_STATS: DashboardStats = { douyu: { accounts: 0, tasks: 0, success: 0, failed: 0, cookies: 0, }, huya: { accounts: 0, tasks: 0, success: 0, failed: 0, goods: 0, rechargeGoods: 0, }, }; function countFailed(items: T[]) { return items.filter((item) => ['failed', 'error'].includes(item.status)).length; } function StatCard({ title, value, color, loading, }: { title: string; value: number; color?: string; loading?: boolean; }) { return ( ); } export default function DashboardPage() { const { token } = theme.useToken(); const { can, canAny } = usePermissions(); const [loading, setLoading] = useState(true); const [stats, setStats] = useState(EMPTY_STATS); const canViewDouyuAccounts = canAny(['account:view_all', 'account:view_assigned']); const canViewDouyuTasks = canAny(['login:batch', 'login:view_all', 'login:view_assigned']); const canViewCookies = can('cookie:view'); const canViewHuyaAccounts = can('huya:account'); const canViewHuyaTasks = can('huya:task'); useEffect(() => { let ignore = false; async function loadDashboard() { setLoading(true); const [ douyuAccountsResult, douyuTasksResult, cookiesResult, huyaAccountsResult, huyaTasksResult, huyaGoodsResult, huyaRechargeGoodsResult, ] = await Promise.allSettled([ canViewDouyuAccounts ? accountApi.list() : Promise.resolve([]), canViewDouyuTasks ? loginApi.listTasks() : Promise.resolve([]), canViewCookies ? cookieApi.list() : Promise.resolve([]), canViewHuyaAccounts ? huyaApi.listAccounts() : Promise.resolve([]), canViewHuyaTasks ? huyaApi.listTasks() : Promise.resolve([]), canViewHuyaTasks ? huyaApi.listGoods() : Promise.resolve([]), canViewHuyaTasks ? huyaApi.listRechargeGoods() : Promise.resolve([]), ]); if (ignore) return; const douyuAccounts = douyuAccountsResult.status === 'fulfilled' ? douyuAccountsResult.value : []; const douyuTasks = douyuTasksResult.status === 'fulfilled' ? douyuTasksResult.value : []; const cookies = cookiesResult.status === 'fulfilled' ? cookiesResult.value : []; const huyaAccounts = huyaAccountsResult.status === 'fulfilled' ? huyaAccountsResult.value : []; const huyaTasks = huyaTasksResult.status === 'fulfilled' ? huyaTasksResult.value : []; const huyaGoods = huyaGoodsResult.status === 'fulfilled' ? huyaGoodsResult.value : []; const huyaRechargeGoods = huyaRechargeGoodsResult.status === 'fulfilled' ? huyaRechargeGoodsResult.value : []; setStats({ douyu: { accounts: douyuAccounts.length, tasks: douyuTasks.length, success: douyuTasks.filter((task: LoginTaskItem) => task.status === 'success').length, failed: countFailed(douyuTasks), cookies: cookies.length, }, huya: { accounts: huyaAccounts.length, tasks: huyaTasks.length, success: huyaTasks.filter((task: HuyaTaskItem) => task.status === 'success').length, failed: countFailed(huyaTasks), goods: huyaGoods.length, rechargeGoods: huyaRechargeGoods.length, }, }); setLoading(false); } void loadDashboard(); return () => { ignore = true; }; }, [canViewCookies, canViewDouyuAccounts, canViewDouyuTasks, canViewHuyaAccounts, canViewHuyaTasks]); const totalStats = useMemo(() => ({ accounts: stats.douyu.accounts + stats.huya.accounts, tasks: stats.douyu.tasks + stats.huya.tasks, success: stats.douyu.success + stats.huya.success, failed: stats.douyu.failed + stats.huya.failed, }), [stats]); return (
概览 斗鱼 虎牙
斗鱼 账号登录、Cookie 产出和批量登录任务
虎牙 账号 Cookie、活动任务、兑换商品和充值商品
); }