"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 { getNodeGroupList, getRecalculationStatus, recalculateGroup, updateNodeGroup, } from "@workspace/ui/services/admin/group"; import { Loader2 } from "lucide-react"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import TrafficRangeConfig from "./traffic-ranges-config"; export default function TrafficModeTab() { const { t } = useTranslation("group"); const [recalculating, setRecalculating] = useState(false); const [loadingStatus, setLoadingStatus] = useState(false); const [status, setStatus] = useState<{ state: string; progress: number; total: number; } | null>(null); // Fetch node groups const { data: nodeGroupsData, isLoading: isLoadingNodeGroups, refetch: refetchNodeGroups, } = useQuery({ queryKey: ["nodeGroups"], queryFn: async () => { const { data } = await getNodeGroupList({ page: 1, size: 1000 }); return data.data?.list || []; }, }); 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); } }; const handleTrafficUpdate = async ( nodeGroupId: number, fields: { min_traffic_gb?: number; max_traffic_gb?: number } ) => { try { await updateNodeGroup({ id: nodeGroupId, ...fields, }); toast.success(t("configSaved", "Configuration saved successfully")); // Refetch node groups to get updated data refetchNodeGroups(); } catch (error) { console.error("Failed to update node group:", error); toast.error(t("saveFailed", "Failed to save configuration")); } }; const handleRecalculate = async () => { setRecalculating(true); try { await recalculateGroup({ mode: "traffic" }); 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 (