import React, { useEffect, useState } from "react"; import Image from "next/image"; import { AlertCircle } from "lucide-react"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Skeleton } from "@/components/ui/skeleton"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { getHeatmapUrl } from "@/lib/simulation-service"; interface HeatmapViewerProps { simulation: any; fullscreen?: boolean; } export function HeatmapViewer({ simulation, fullscreen = false }: HeatmapViewerProps) { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [heatmapType, setHeatmapType] = useState("nodesVsFailure"); const [heatmapUrl, setHeatmapUrl] = useState(null); const heatmapTypes = [ { id: "nodesVsFailure", label: "Nodes vs Failure" }, { id: "nodesVsChi", label: "Nodes vs Chi" }, { id: "failureVsChi", label: "Failure vs Chi" }, { id: "failureVsNetDegree", label: "Failure vs Net Degree" }, { id: "NWDegVsNodeOnRuntime", label: "Network Degree vs Nodes" }, { id: "NWDegVsMalNodeOnMissingSamples", label: "Net Degree vs Malicious Nodes" }, { id: "NWDegVsFailureRateOnMissingSamples", label: "Net Degree vs Failure Rate" }, ]; useEffect(() => { const fetchHeatmap = async () => { try { setLoading(true); setError(null); const url = await getHeatmapUrl(simulation.id, heatmapType); setHeatmapUrl(url); } catch (err) { console.error("Error loading heatmap:", err); setError("Failed to load heatmap. Please try again later."); } finally { setLoading(false); } }; fetchHeatmap(); }, [simulation.id, heatmapType]); return (
{heatmapTypes.map((type) => ( {type.label} ))}
{loading ? ( ) : error ? ( Error {error} ) : !heatmapUrl ? ( No data available No heatmap data available for the selected parameters. ) : ( {`${heatmapType} setError("Failed to load heatmap image.")} /> )}
); }