"use client"; import { useQuery } from "@tanstack/react-query"; import { Link } from "@tanstack/react-router"; import { Card, CardContent, CardHeader, CardTitle, } from "@workspace/ui/components/card"; import { ChartContainer, ChartTooltip, ChartTooltipContent, } from "@workspace/ui/components/chart"; // (Select imports removed) import { Separator } from "@workspace/ui/components/separator"; import { Tabs, TabsList, TabsTrigger } from "@workspace/ui/components/tabs"; import Empty from "@workspace/ui/composed/empty"; import { Icon } from "@workspace/ui/composed/icon"; import { queryServerTotalData, queryTicketWaitReply, } from "@workspace/ui/services/admin/console"; import { formatBytes } from "@workspace/ui/utils/formatting"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Bar, BarChart, CartesianGrid, LabelList, XAxis, YAxis, } from "recharts"; import { UserSubscribeDetail } from "@/sections/user/user-detail"; import { RevenueStatisticsCard } from "./revenue-statistics-card"; import SystemVersionCard from "./system-version-card"; import { UserStatisticsCard } from "./user-statistics-card"; export default function Statistics() { const { t } = useTranslation("dashboard"); 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 [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 TrafficRankCard = ({ type }: { type: "nodes" | "users" }) => { const currentData = trafficData[type][timeFrame as "today" | "yesterday"]; return ( {type === "nodes" ? t("nodeTraffic", "Node Traffic") : t("userTraffic", "User Traffic")} {t("today", "Today")} {t("yesterday", "Yesterday")} {currentData.length > 0 ? ( formatBytes(value || 0)} tickLine={false} type="number" /> String(index + 1)} tickLine={false} tickMargin={0} type="category" width={15} /> formatBytes(Number(value) || 0)} label={true} labelFormatter={(label, [payload]) => type === "nodes" ? ( `${t("nodes", "Nodes")}: ${label}` ) : ( <>
{`${t("users", "Users")}: ${label}`}
) } /> } trigger="hover" />
) : (
)}
); }; return ( <>
{[ { title: t("onlineUsersCount", "Online Users"), value: ServerTotal?.online_users || 0, subtitle: t("currentlyOnline", "Currently Online"), 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", "Today Traffic"), 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", "Month Traffic"), 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", "Total Servers"), value: (ServerTotal?.online_servers || 0) + (ServerTotal?.offline_servers || 0), subtitle: `${t("online", "Online")} ${ServerTotal?.online_servers || 0} ${t("offline", "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", "Pending Tickets"), value: TicketTotal || 0, subtitle: t("pending", "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}
))}
); }