import React, { useState, useEffect, useCallback, useMemo } from "react"; import { useDashboardData } from "@/hooks/useDashboardData"; import { DashboardVisualization } from "../dashboard/DashboardVisualization"; import { EntityRelationAnalysisModal } from "../dashboard/modals/EntityRelationAnalysisModal"; import { TinyTrendChart } from "@/components/shared/TinyTrendChart"; import { EntityRelationTreeChart } from "@/components/shared/EntityRelationTreeChart"; import { generateTrendData, calculateFailureCount, } from "@/lib/trend-data-generator"; import { useAgentGraph } from "@/context/AgentGraphContext"; import { api } from "@/lib/api"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { FileText, AlertCircle, Clock, Users, AlertTriangle, } from "lucide-react"; export function DashboardView() { const { state, actions } = useAgentGraph(); const { stats, recentActivity, isLoading, error, refresh } = useDashboardData(); // Modal states const [isEntityModalOpen, setIsEntityModalOpen] = useState(false); // Generate realistic trend data based on current traces const trendData = useMemo( () => generateTrendData(state.traces), [state.traces] ); // Load traces data when dashboard mounts (if not already loaded) const loadTracesData = useCallback(async () => { if (state.traces.length === 0 && !state.isLoading) { actions.setLoading(true); try { const tracesData = await api.traces.list(); actions.setTraces(Array.isArray(tracesData) ? tracesData : []); } catch (error) { actions.setError( error instanceof Error ? error.message : "Failed to load traces" ); actions.setTraces([]); } finally { actions.setLoading(false); } } }, [state.traces.length, state.isLoading, actions]); useEffect(() => { loadTracesData(); }, [loadTracesData]); const handleUploadTrace = () => { actions.setActiveView("upload"); }; return (
{/* Glassmorphism background gradient */}
{/* Content with relative positioning */}
{/* Error State */} {error && (
{error}
)} {/* Stats Grid */}
{/* Traces & Agent Graphs - Blue & Green Theme */}

Traces & Graphs

{isLoading ? (
) : (
{stats.totalTraces}
{stats.totalAgentGraphs}
)}
{/* Dual-line trend chart */}
{stats.totalTraces > 0 ? (

Traces ready •{" "} Graphs generated

) : ( )}
{/* Entities & Relations - Purple & Orange Theme */}
setIsEntityModalOpen(true)} >

Entities & Relations

{isLoading ? (
) : (
{stats.totalEntities}
{stats.totalRelations}
)}
{/* Entity-Relation Tree Visualization */}

Entities extracted •{" "} Relations connected

{/* Failures - Red Theme */}

System Failures

{isLoading ? ( ) : (
{calculateFailureCount(state.traces)}
)}
{/* Failures trend chart */}

Processing errors tracked

{/* Dashboard Visualization */} {/* Main Content Area - Recent Activity */}
{/* Recent Activity - Now takes full available space */} Recent Activity Latest system events and processing updates {isLoading ? (
{[...Array(3)].map((_, i) => (
))}
) : recentActivity.length > 0 ? (
{recentActivity.map((activity) => (

{activity.action}

{activity.trace}

{activity.status}

{activity.timestamp}

))}
) : (

No recent activity

)}
{/* Analysis Modals */}
); }