'use client'; 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 { 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 { UserStatisticsCard } from './user-statistics-card'; export default function Statistics() { const t = useTranslations('index'); const { data: TicketTotal } = useQuery({ queryKey: ['queryTicketWaitReply'], queryFn: async () => { const { data } = await queryTicketWaitReply(); return data.data?.count; }, }); const { data: ServerTotal } = useQuery({ queryKey: ['queryServerTotalData'], queryFn: async () => { const { data } = await queryServerTotalData(); return data.data; }, }); 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.user_id, traffic: item.download + item.upload, email: item.email, })) || [], yesterday: ServerTotal?.user_traffic_ranking_yesterday?.map((item) => ({ name: item.user_id, traffic: item.download + item.upload, email: item.email, })) || [], }, }; const currentData = trafficData[dataType as 'nodes' | 'users'][timeFrame as 'today' | 'yesterday']; return ( <>
{[ { title: t('onlineIPCount'), value: ServerTotal?.online_user_ips || 0, icon: 'uil:users-alt', href: '/dashboard/server', }, { title: t('onlineNodeCount'), value: ServerTotal?.online_servers || 0, icon: 'uil:server-network', href: '/dashboard/server', }, { title: t('offlineNodeCount'), value: ServerTotal?.offline_servers || 0, icon: 'uil:server-network-alt', href: '/dashboard/server', }, { title: t('pendingTickets'), value: TicketTotal || 0, icon: 'uil:clipboard-notes', href: '/dashboard/ticket', }, { title: t('todayUploadTraffic'), value: formatBytes(ServerTotal?.today_upload || 0), icon: 'uil:arrow-up', }, { title: t('todayDownloadTraffic'), value: formatBytes(ServerTotal?.today_download || 0), icon: 'uil:arrow-down', }, { title: t('monthUploadTraffic'), value: formatBytes(ServerTotal?.monthly_upload || 0), icon: 'uil:cloud-upload', }, { title: t('monthDownloadTraffic'), value: formatBytes(ServerTotal?.monthly_download || 0), icon: 'uil:cloud-download', }, ].map((item, index) => ( {item.title}
{item.value}
))}
{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); }} /> } /> ) : (
)}
); }