"use client"; import { useState, useEffect, useMemo } from "react"; import { Loader2 } from "lucide-react"; import { useDashboardSummary, useTimeline, useTopApps, useTopProtocols, useCountries } from "@/lib/api-with-context"; import { GlobeMap } from "@/components/ui/GlobeMap"; import { getOriginLocation, getDestinationLocation } from "@/lib/geoUtils"; import { KPICards } from "@/components/dashboard/KPICards"; import { TopWidgets } from "@/components/dashboard/TopWidgets"; import { HelpTrigger } from "@/components/help/HelpTrigger"; export default function SummaryPage() { const [mounted, setMounted] = useState(false); const summary = useDashboardSummary(); const timeline = useTimeline(24); const rawTopApps = useTopApps(7); const rawTopProtocols = useTopProtocols(); const countries = useCountries(0); // Load all countries for complete globemap (Requirement 16) const { topProtocols, topApps } = useMemo(() => { const rawProtos = rawTopProtocols.data || []; let appsData = rawTopApps.data || []; // Process Apps let finalApps = appsData .filter(a => a.app_label !== 'Unknown') .map(a => ({ ...a, app_label: (a.app_label || '').replace(/siab\./g, 'backone.'), total_bytes: (a.download || 0) + (a.upload || 0) })) .sort((a, b) => b.total_bytes - a.total_bytes) .slice(0, 7); // Process Protocols let finalProtos = rawProtos .map(p => ({ ...p, protocol_label: (p.protocol_label || '').replace(/siab\./g, 'backone.'), total: (p.download || 0) + (p.upload || 0) })) .sort((a, b) => b.total - a.total) .slice(0, 7); return { topProtocols: { ...rawTopProtocols, data: finalProtos }, topApps: { ...rawTopApps, data: finalApps.length > 0 ? finalApps : appsData } }; }, [rawTopProtocols.data, rawTopApps.data, rawTopProtocols.isLoading, rawTopApps.isLoading]); const mapData = useMemo(() => { if (!countries.data) return []; // Jika summary menunjukkan tidak ada traffic sama sekali, jangan tampilkan globe const totalTraffic = (summary.data?.bandwidth_down || 0) + (summary.data?.bandwidth_up || 0); if (totalTraffic === 0) return []; const origin = getOriginLocation(); return countries.data.reduce((acc: any[], row) => { // Hanya tampilkan negara yang punya traffic aktual > 0 const traffic = (row.download || 0) + (row.upload || 0); if (traffic === 0) return acc; const dest = getDestinationLocation(row.country_code, row.country_name); if (dest) { acc.push({ startLat: origin.lat, startLng: origin.lng, endLat: dest.lat, endLng: dest.lng, fromLabel: origin.label, toLabel: dest.label, value: traffic, download: row.download, upload: row.upload, countryCode: row.country_code }); } return acc; }, []); }, [countries.data, summary.data]); useEffect(() => { setMounted(true); document.title = "Overview Dashboard | BackOne - Deep Package Inspection"; }, []); if (!mounted) return null; const isLoading = summary.isLoading || timeline.isLoading || topApps.isLoading || topProtocols.isLoading; return (
Real-time network traffic and intelligence summary.