"use client"; import { useQuery } from "@tanstack/react-query"; import { Badge } from "@workspace/ui/components/badge"; import { Button } from "@workspace/ui/components/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@workspace/ui/components/card"; import { Input } from "@workspace/ui/components/input"; import { Label } from "@workspace/ui/components/label"; import { getGroupConfig, getNodeGroupList, getRecalculationStatus, recalculateGroup, } from "@workspace/ui/services/admin/group"; import { Loader2 } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; export default function AverageModeTab() { const { t } = useTranslation("group"); const [recalculating, setRecalculating] = useState(false); const [loadingStatus, setLoadingStatus] = useState(false); const [averageConfig, setAverageConfig] = useState({ node_group_count: 0, }); const [status, setStatus] = useState<{ state: string; progress: number; total: number; } | null>(null); const hasLoadedConfig = useRef(true); const { data: nodeGroupsData } = useQuery({ queryKey: ["nodeGroups"], queryFn: async () => { const { data } = await getNodeGroupList({ page: 1, size: 1000 }); return data.data?.list || []; }, }); const loadConfig = async () => { try { const { data } = await getGroupConfig(); if (data.data?.config?.average_config) { setAverageConfig(data.data.config.average_config as any); } hasLoadedConfig.current = true; } catch (error) { console.error("Failed to load group config:", error); toast.error(t("loadFailed", "Failed to load configuration")); } }; const loadStatus = async () => { setLoadingStatus(true); try { const { data } = await getRecalculationStatus(); if (data.data) { setStatus(data.data); } } catch (error) { console.error("Failed to load recalculation status:", error); } finally { setLoadingStatus(false); } }; useEffect(() => { loadConfig(); loadStatus(); }, []); useEffect(() => { if (nodeGroupsData) { const nodeGroupCount = nodeGroupsData?.length || 0; if (averageConfig.node_group_count !== nodeGroupCount) { setAverageConfig({ ...averageConfig, node_group_count: nodeGroupCount, }); } } }, [nodeGroupsData]); useEffect(() => { const interval = setInterval(() => { if (status?.state === "running") { loadStatus(); } }, 2000); return () => clearInterval(interval); }, [status?.state]); const handleRecalculate = async () => { setRecalculating(true); try { await recalculateGroup({ mode: "average" }); toast.success(t("recalculationStarted", "Recalculation started")); loadStatus(); } catch (error) { console.error("Failed to start recalculation:", error); toast.error(t("recalculationFailed", "Failed to start recalculation")); } finally { setRecalculating(false); } }; const getStateLabel = (state: string) => { switch (state) { case "running": return t("running", "Running"); case "completed": return t("completed", "Completed"); case "failed": return t("failed", "Failed"); default: return t("idle", "Idle"); } }; const getStateVariant = (state: string) => { switch (state) { case "running": return "default"; case "completed": return "secondary"; case "failed": return "destructive"; default: return "outline"; } }; return (
{/* Configuration Card */} {t("averageModeConfig", "Average Mode Configuration")} {t( "averageModeDescription", "Randomly assign node groups to user subscriptions based on subscribe configuration" )}

{t( "nodeGroupCountAutoCalculated", "Auto-calculated from actual node groups" )}

{/* Recalculation Card */} {t("groupRecalculation", "Group Recalculation")} {t( "groupRecalculationDescription", "Manually trigger a full recalculation of all user groups based on current configuration" )} {/* Current Status */}
{t("currentStatus", "Current Status")} {loadingStatus ? ( ) : status ? ( {getStateLabel(status.state)} ) : null}
{status?.state === "running" && (
{t("progress", "Progress")} {status.progress} / {status.total || 0}
0 ? (status.progress / status.total) * 100 : 0}%`, }} />
)} {status?.state === "completed" && (
{t( "recalculationCompleted", "Recalculation completed successfully" )}
)} {status?.state === "failed" && (
{t( "recalculationFailed", "Recalculation failed. Please try again." )}
)}
{/* Recalculate Button */}
{/* Warning */}
{t("warning", "Warning")}:{" "} {t( "recalculationWarning", "Recalculation will reassign all users to new groups based on current configuration. This operation cannot be undone." )}
); }