"use client"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@workspace/ui/components/card"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@workspace/ui/components/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@workspace/ui/components/table"; import { getGroupHistory, getGroupHistoryDetail, getNodeGroupList, } from "@workspace/ui/services/admin/group"; import { Loader2 } from "lucide-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; export default function CurrentGroupResults() { const { t } = useTranslation("group"); const [loading, setLoading] = useState(true); const [latestResult, setLatestResult] = useState(null); const [latestDetails, setLatestDetails] = useState([]); const [detailsLoading, setDetailsLoading] = useState(false); // User list dialog state const [userListOpen, setUserListOpen] = useState(false); const [selectedNodeGroupName, setSelectedNodeGroupName] = useState(""); const [userList, setUserList] = useState([]); const [userListLoading, setUserListLoading] = useState(false); const [userListTotal, setUserListTotal] = useState(0); // Fetch node groups const { data: nodeGroups } = useQuery({ queryKey: ["nodeGroups"], queryFn: async () => { const { data } = await getNodeGroupList({ page: 1, size: 1000 }); return data.data?.list || []; }, }); useEffect(() => { const loadData = async () => { try { // Load latest result const { data: historyData } = await getGroupHistory({ page: 1, size: 1, }); if (historyData.data?.list && historyData.data.list.length > 0) { const latest = historyData.data.list[0]; if (!latest) return; setLatestResult(latest); // Fetch details setDetailsLoading(true); try { const { data: detailData } = await getGroupHistoryDetail({ id: latest.id, }); if (detailData.data?.config_snapshot?.group_details) { setLatestDetails(detailData.data.config_snapshot.group_details); } else { setLatestDetails([]); } } catch (error) { console.error("Failed to fetch latest result details:", error); setLatestDetails([]); } finally { setDetailsLoading(false); } } } catch (error) { console.error("Failed to load data:", error); } finally { setLoading(false); } }; loadData(); }, []); const handleShowUserList = async ( nodeGroupId: number, nodeGroupName: string ) => { setSelectedNodeGroupName(nodeGroupName); setUserListOpen(true); setUserListLoading(true); // 从历史详情记录中获取用户数据 const detail = latestDetails.find((d: any) => { const detailNodeGroupId = d.NodeGroupId || d.node_group_id; return detailNodeGroupId === nodeGroupId; }); if (detail) { const userDataJSON = detail.UserData || detail.user_data; if (userDataJSON) { try { const userData = JSON.parse(userDataJSON); setUserList(userData); setUserListTotal(userData.length); } catch (error) { console.error("Failed to parse user data:", error); setUserList([]); setUserListTotal(0); } } else { setUserList([]); setUserListTotal(0); } } else { setUserList([]); setUserListTotal(0); } setUserListLoading(false); }; if (loading) { return ( {t("currentGroupingResult", "Current Grouping Result")} {t("loading", "Loading...")} ); } return (
{/* Latest Result Card */} {latestResult ? ( {t("currentGroupingResult", "Current Grouping Result")} {t( "latestGroupingCalculation", "Latest grouping calculation details" )} {/* Calculation Info */}

{t("calculationInfo", "Calculation Information")}

{t("groupMode", "Group Mode")}
{(latestResult.GroupMode || latestResult.group_mode) === "average" ? t("averageMode", "Average Mode") : (latestResult.GroupMode || latestResult.group_mode) === "subscribe" ? t("subscribeMode", "Subscribe Mode") : t("trafficMode", "Traffic Mode")}
{t("state", "State")}
{(latestResult.State || latestResult.state) === "completed" ? t("completed", "Completed") : (latestResult.State || latestResult.state) === "running" ? t("running", "Running") : (latestResult.State || latestResult.state) === "failed" ? t("failed", "Failed") : t("idle", "Idle")}
{t("triggerType", "Trigger Type")}
{(latestResult.TriggerType || latestResult.trigger_type) === "manual" ? t("manualTrigger", "Manual") : (latestResult.TriggerType || latestResult.trigger_type) === "auto" ? t("autoTrigger", "Auto") : t("scheduleTrigger", "Schedule")}
{t("successFailedCount", "Success/Failed")}
{latestResult.SuccessCount || latestResult.success_count || 0}{" "} /{" "} {latestResult.FailedCount || latestResult.failed_count || 0}
{t("startTime", "Start Time")}
{latestResult.StartTime || latestResult.start_time ? new Date( (latestResult.StartTime || latestResult.start_time) * 1000 ).toLocaleString() : "-"}
{t("endTime", "End Time")}
{latestResult.EndTime || latestResult.end_time ? new Date( (latestResult.EndTime || latestResult.end_time) * 1000 ).toLocaleString() : "-"}
{/* Grouping Details */}

{t("groupingDetailsStatistics", "Grouping Details Statistics")}

{latestDetails.reduce( (sum: number, d: any) => sum + (d.UserCount || d.user_count || 0), 0 )}
{t("totalUsers", "Total Users")}
{latestDetails.reduce( (sum: number, d: any) => sum + (d.NodeCount || d.node_count || 0), 0 )}
{t("totalNodes", "Total Nodes")}
{latestDetails.length}
{t("totalNodeGroups", "Total Node Groups")}
{detailsLoading ? (
{t("loading", "Loading...")}
) : latestDetails.length > 0 ? ( <> {/* Details Table */}
{latestDetails.map((detail: any, index: number) => { const nodeGroupId = detail.NodeGroupId || detail.node_group_id; const nodeGroup = nodeGroups?.find( (ng) => ng.id === nodeGroupId ); const nodeGroupName = nodeGroup?.name || `${t("idPrefix", "#")}${nodeGroupId}`; const userCount = detail.UserCount || detail.user_count || 0; return ( ); })}
{t("nodeGroup", "Node Group")} {t("userCount", "User Count")} {t("nodeCount", "Node Count")}
{nodeGroupName}
{t("id", "ID")}: {nodeGroupId}
{detail.NodeCount || detail.node_count || 0}
) : (
{t("noDetails", "No details available")}
)}
) : ( {t("currentGroupingResult", "Current Grouping Result")}
{t("noDetails", "No details available")}
)} {/* User List Dialog */} {selectedNodeGroupName} - {t("userList", "User List")} {t("totalUsers", "Total Users")}: {userListTotal}
{userListLoading ? (
{t("loading", "Loading...")}
) : userList.length > 0 ? ( {t("id", "ID")} {t("email", "Email")} {userList.map((user) => ( {user.id} {user.email || "-"} ))}
) : (
{t("noUsers", "No users found")}
)}
); }