import React, { useState, useEffect } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { GitCompare, BarChart3, Eye } from "lucide-react"; import { api } from "@/lib/api"; import { LoadingSpinner } from "@/components/shared/LoadingSpinner"; import { GraphSelector } from "./GraphSelector"; import { ComparisonResults } from "./ComparisonResults"; import { VisualComparison } from "./VisualComparison"; import { AvailableGraph, GraphComparisonResults } from "@/types"; export const GraphComparisonView: React.FC = () => { const [activeTab, setActiveTab] = useState("selection"); const [availableGraphs, setAvailableGraphs] = useState([]); const [selectedGraph1, setSelectedGraph1] = useState( null ); const [selectedGraph2, setSelectedGraph2] = useState( null ); const [comparisonResults, setComparisonResults] = useState(null); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // Load available graphs on component mount useEffect(() => { loadAvailableGraphs(); }, []); // Auto-refresh available graphs every 15 seconds useEffect(() => { const interval = setInterval(() => { if (!isLoading) { loadAvailableGraphs(); } }, 15000); // 15 seconds return () => clearInterval(interval); }, [isLoading]); const loadAvailableGraphs = async () => { try { setIsLoading(true); setError(null); const response = await api.graphComparison.listAvailableGraphs(); setAvailableGraphs(response.final_graphs); } catch (err) { setError(err instanceof Error ? err.message : "Failed to load graphs"); } finally { setIsLoading(false); } }; const handleGraphSelection = ( graph1: AvailableGraph | null, graph2: AvailableGraph | null ) => { setSelectedGraph1(graph1); setSelectedGraph2(graph2); // Remove auto-navigation - let users control when to switch tabs }; const handleCompareGraphs = async () => { if (!selectedGraph1 || !selectedGraph2) return; try { setIsLoading(true); setError(null); const results = await api.graphComparison.compareGraphs( selectedGraph1.id, selectedGraph2.id, { similarity_threshold: 0.7, use_cache: true } ); setComparisonResults(results); setActiveTab("results"); } catch (err) { setError(err instanceof Error ? err.message : "Failed to compare graphs"); } finally { setIsLoading(false); } }; const canCompare = selectedGraph1 && selectedGraph2; return (
{/* Error Display */} {error && (

{error}

)} {/* Content */}
Selection Results Visual
{isLoading && !availableGraphs.length ? (
) : ( )}
{comparisonResults ? ( ) : (

No comparison results available

)}
{canCompare ? ( ) : (

Select 2 graphs to view visual comparison

)}
); };