'use client'; import { UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; import { queryServerTotalData, queryTicketWaitReply } from '@/services/admin/console'; import { useQuery } from '@tanstack/react-query'; import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/components/card'; import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@workspace/ui/components/chart'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@workspace/ui/components/select'; import { Separator } from '@workspace/ui/components/separator'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Icon } from '@workspace/ui/custom-components/icon'; import { formatBytes } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import Link from 'next/link'; import { useState } from 'react'; import { Bar, BarChart, CartesianGrid, LabelList, XAxis, YAxis } from 'recharts'; import { Empty } from '../empty'; import { RevenueStatisticsCard } from './revenue-statistics-card'; import SystemVersionCard from './system-version-card'; import { UserStatisticsCard } from './user-statistics-card'; export default function Statistics() { const t = useTranslations('index'); const { data: TicketTotal, isLoading: ticketLoading } = useQuery({ queryKey: ['queryTicketWaitReply'], queryFn: async () => { const { data } = await queryTicketWaitReply(); return data.data?.count; }, }); const { data: ServerTotal, isLoading: serverLoading } = useQuery({ queryKey: ['queryServerTotalData'], queryFn: async () => { const { data } = await queryServerTotalData(); return data.data; }, }); const isLoading = ticketLoading || serverLoading; const [dataType, setDataType] = useState('nodes'); const [timeFrame, setTimeFrame] = useState('today'); const trafficData = { nodes: { today: ServerTotal?.server_traffic_ranking_today?.map((item) => ({ name: item.name, traffic: item.download + item.upload, })) || [], yesterday: ServerTotal?.server_traffic_ranking_yesterday?.map((item) => ({ name: item.name, traffic: item.download + item.upload, })) || [], }, users: { today: ServerTotal?.user_traffic_ranking_today?.map((item) => ({ name: item.sid, traffic: item.download + item.upload, })) || [], yesterday: ServerTotal?.user_traffic_ranking_yesterday?.map((item) => ({ name: item.sid, traffic: item.download + item.upload, })) || [], }, }; const currentData = trafficData[dataType as 'nodes' | 'users'][timeFrame as 'today' | 'yesterday']; return ( <>
{[ { title: t('onlineUsersCount'), value: ServerTotal?.online_users || 0, subtitle: t('currentlyOnline'), icon: 'uil:users-alt', href: '/dashboard/user', color: 'text-blue-600 dark:text-blue-400', iconBg: 'bg-blue-100 dark:bg-blue-900/30', }, { title: t('todayTraffic'), value: formatBytes( (ServerTotal?.today_upload || 0) + (ServerTotal?.today_download || 0), ), subtitle: `↑${formatBytes(ServerTotal?.today_upload || 0)} ↓${formatBytes(ServerTotal?.today_download || 0)}`, icon: 'uil:exchange-alt', color: 'text-purple-600 dark:text-purple-400', iconBg: 'bg-purple-100 dark:bg-purple-900/30', }, { title: t('monthTraffic'), value: formatBytes( (ServerTotal?.monthly_upload || 0) + (ServerTotal?.monthly_download || 0), ), subtitle: `↑${formatBytes(ServerTotal?.monthly_upload || 0)} ↓${formatBytes(ServerTotal?.monthly_download || 0)}`, icon: 'uil:cloud-data-connection', color: 'text-orange-600 dark:text-orange-400', iconBg: 'bg-orange-100 dark:bg-orange-900/30', }, { title: t('totalServers'), value: (ServerTotal?.online_servers || 0) + (ServerTotal?.offline_servers || 0), subtitle: `${t('online')} ${ServerTotal?.online_servers || 0} ${t('offline')} ${ServerTotal?.offline_servers || 0}`, icon: 'uil:server-network', href: '/dashboard/servers', color: 'text-green-600 dark:text-green-400', iconBg: 'bg-green-100 dark:bg-green-900/30', }, { title: t('pendingTickets'), value: TicketTotal || 0, subtitle: t('pending'), icon: 'uil:clipboard-notes', href: '/dashboard/ticket', color: 'text-red-600 dark:text-red-400', iconBg: 'bg-red-100 dark:bg-red-900/30', }, ].map((item, index) => (

{item.title}

{item.value}
{item.subtitle}
))}
{t('trafficRank')} {t('today')} {t('yesterday')}

{dataType === 'nodes' ? t('nodeTraffic') : t('userTraffic')}

{currentData.length > 0 ? ( formatBytes(value || 0)} /> String(index + 1)} /> dataType === 'nodes' ? ( `${t('nodes')}: ${label}` ) : ( <>
{`${t('users')}: ${label}`}
) } formatter={(value) => { return formatBytes(Number(value) || 0); }} /> } />
) : (
)}
); }