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, Download } from "lucide-react"; import { SignatureCategories } from "@/components/SignatureCategories"; import { SignatureCategory, useSignatureCategories } from "@/hooks/useSignatureCategories"; import { toast } from "@/hooks/use-toast"; import { CleanModeToggle } from "@/components/CleanModeToggle"; import pb from "@/lib/pocketbase"; import { SigviewRecord as Signature } from "@/lib/pbtypes"; import { useEffect } from "react"; interface SystemTrackerProps { system: string; cleanMode: boolean; onCleanModeToggle: (enabled: boolean) => void; onDelete?: (signatureId: string) => Promise; } export const SystemTracker = ({ system, cleanMode, onCleanModeToggle, onDelete }: SystemTrackerProps) => { const { data: signaturesData, refetch: refetchSignatures, isLoading: signaturesLoading, error: signaturesError } = useQuery({ queryKey: ['signatures', system], queryFn: async () => { if (!system) return null; const signatures = await pb.collection('sigview').getFullList({ batch: 1000, filter: `(system='${system}')` }); const sigMap = new Map(); signatures.forEach(sig => { sigMap.set(sig.identifier, sig); }); return sigMap; }, enabled: !!system, refetchInterval: 5000, // Poll every 5 seconds }); const handleRefresh = () => { refetchSignatures(); toast({ title: "Refreshing Data", description: "Updating signature information...", }); }; const handleExport = () => { const exportText = Object.values(signaturesData || {}) .map(sig => [ sig.identifier, '', // Empty field (part[1] in parseSignature) sig.type || '', sig.signame || '', sig.scanned || '' ].join('\t')) .join('\n'); navigator.clipboard.writeText(exportText).then(() => { toast({ title: "Exported", description: "Signatures copied to clipboard in EVE format", }); }).catch(() => { toast({ title: "Export Failed", description: "Failed to copy to clipboard", variant: "destructive" }); }); }; const isLoading = signaturesLoading; const { categories, toggleCategoryVisibility } = useSignatureCategories(signaturesData || new Map()); return (
{/* System Status Card */} {system} Polling
Total: {signaturesData?.size}
{/* Error Display */} {signaturesError && (
Error loading signatures: {signaturesError.message}
)} {/* Loading State */} {signaturesLoading && system && (
{[...Array(1)].map((_, i) => (
))}
)} {/* Signature Categories */} {system && !signaturesLoading && ( )}
); };