import { useState, useEffect } from "react"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { RefreshCw, AlertCircle, Radar } from "lucide-react"; import SignatureListItem from "./SignatureListItem"; import { toast } from "@/hooks/use-toast"; import { useNavigate } from "react-router-dom"; interface SignatureItem { collectionId: string; collectionName: string; id: string; identifier: string; signame: string; sysid: string; system: string; type: string; updated?: string; created?: string; dangerous?: boolean; } interface ApiResponse { items: SignatureItem[]; } interface SystemTrackerProps { initialSystem?: string; } const SystemTracker = ({ initialSystem }: SystemTrackerProps) => { const [currentSystem, setCurrentSystem] = useState(initialSystem || ""); const navigate = useNavigate(); // Query to get current system from localhost:7000 (always enabled to track system changes) const { data: systemData, refetch: refetchSystem, isLoading: systemLoading } = useQuery({ queryKey: ['currentSystem'], queryFn: async () => { const response = await fetch('http://localhost:7000'); if (!response.ok) { throw new Error('Failed to fetch current system'); } const text = await response.text(); return text.trim(); }, refetchInterval: 1000, // Always refetch to track system changes retry: 3, }); // Query to get signatures for the current system const { data: signaturesData, refetch: refetchSignatures, isLoading: signaturesLoading, error: signaturesError } = useQuery({ queryKey: ['signatures', currentSystem], queryFn: async () => { if (!currentSystem) return null; const encodedSystem = encodeURIComponent(currentSystem); const url = `https://evebase.site.quack-lab.dev/api/collections/sigview/records?filter=(system%3D'${encodedSystem}')`; console.log('Fetching signatures for system:', currentSystem); console.log('API URL:', url); const response = await fetch(url); if (!response.ok) { throw new Error('Failed to fetch signatures'); } const data: ApiResponse = await response.json(); return data; }, enabled: !!currentSystem, refetchInterval: 60000, // Keep signature refresh at 1 minute }); // Update current system when data changes and navigate to new system useEffect(() => { if (systemData && systemData !== currentSystem) { setCurrentSystem(systemData); navigate(`/${systemData}`); console.log('Current system updated to:', systemData); // Immediately refetch signatures when system changes refetchSignatures(); toast({ title: "System Updated", description: `Now tracking: ${systemData}`, }); } }, [systemData, currentSystem, refetchSignatures, navigate]); // Refresh signatures every 5 seconds useEffect(() => { const refreshInterval = setInterval(() => { console.log('Auto-refreshing signatures...'); if (currentSystem) { refetchSignatures(); } }, 5000); // Cleanup interval on component unmount return () => clearInterval(refreshInterval); }, [refetchSignatures, currentSystem]); const handleRefresh = () => { refetchSystem(); if (currentSystem) { refetchSignatures(); } toast({ title: "Refreshing Data", description: "Updating system and signature information...", }); }; const signatures = signaturesData?.items || []; const isLoading = systemLoading || signaturesLoading; // Sort signatures by date (newest first) and prioritize unknown types const sortedSignatures = [...signatures].sort((a, b) => { // First, prioritize unknown types const aIsUnknown = !a.type || a.type === ''; const bIsUnknown = !b.type || b.type === ''; if (aIsUnknown && !bIsUnknown) return -1; if (!aIsUnknown && bIsUnknown) return 1; // If both are unknown or both are known, sort by type if (a.type !== b.type) { return a.type.localeCompare(b.type); } // If same type, sort by date const dateA = a.updated || a.created || ''; const dateB = b.updated || b.created || ''; return dateB.localeCompare(dateA); }); // Group signatures by type for better organization const signaturesByType = sortedSignatures.reduce((acc, sig) => { const type = sig.type || 'Unknown'; if (!acc[type]) acc[type] = []; acc[type].push(sig); return acc; }, {} as Record); return (
{/* System Status Card */} {initialSystem ? 'System View' : 'Current System'}
{systemLoading && !initialSystem ? (
Loading system...
) : currentSystem ? (
{currentSystem}
) : (
No system data
)}
{signatures.length} Signatures
{/* Error Display */} {signaturesError && (
Error loading signatures: {signaturesError.message}
)} {/* Signatures Display */} {currentSystem && !signaturesLoading && (
{sortedSignatures.length === 0 ? (
No signatures found for {currentSystem}
) : ( Signatures {sortedSignatures.length} Total
{sortedSignatures.map((signature) => ( ))}
)}
)} {/* Loading State */} {signaturesLoading && currentSystem && (
{[...Array(6)].map((_, i) => (
))}
)}
); }; export default SystemTracker;