Rework signatures to be a map and not a list

Because they ARE unique by identifier WITHIN A SYSTEM
This commit is contained in:
2025-06-16 21:24:23 +02:00
parent b13635eb69
commit 927eae06c3
3 changed files with 16 additions and 32 deletions

View File

@@ -41,8 +41,7 @@ export const SignatureCategories = ({ categories, onToggleCategory }: SignatureC
</div> </div>
<Badge <Badge
variant="outline" variant="outline"
className={`bg-slate-700 border-slate-600 ${category.meta.color} px-2 py-1`} className={`bg-slate-700 border-slate-600 ${category.meta.color} px-2 py-1`} >
>
{category.signatures.length} {category.signatures.length}
</Badge> </Badge>
</CardTitle> </CardTitle>

View File

@@ -4,11 +4,12 @@ import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { RefreshCw, AlertCircle, Radar, Download } from "lucide-react"; import { RefreshCw, AlertCircle, Radar, Download } from "lucide-react";
import { SignatureCategories } from "@/components/SignatureCategories"; import { SignatureCategories } from "@/components/SignatureCategories";
import { useSignatureCategories } from "@/hooks/useSignatureCategories"; import { SignatureCategory, useSignatureCategories } from "@/hooks/useSignatureCategories";
import { toast } from "@/hooks/use-toast"; import { toast } from "@/hooks/use-toast";
import { CleanModeToggle } from "@/components/CleanModeToggle"; import { CleanModeToggle } from "@/components/CleanModeToggle";
import pb from "@/lib/pocketbase"; import pb from "@/lib/pocketbase";
import { SigviewRecord as Signature } from "@/lib/pbtypes"; import { SigviewRecord as Signature } from "@/lib/pbtypes";
import { useEffect } from "react";
interface SystemTrackerProps { interface SystemTrackerProps {
system: string; system: string;
@@ -26,7 +27,12 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
queryKey: ['signatures', system], queryKey: ['signatures', system],
queryFn: async () => { queryFn: async () => {
if (!system) return null; if (!system) return null;
return pb.collection('sigview').getFullList<Signature>({ batch: 1000, filter: `(system='${system}')` }); const signatures = await pb.collection('sigview').getFullList<Signature>({ batch: 1000, filter: `(system='${system}')` });
const sigMap = new Map<string, Signature>();
signatures.forEach(sig => {
sigMap.set(sig.identifier, sig);
});
return sigMap;
}, },
enabled: !!system, enabled: !!system,
refetchInterval: 5000, // Poll every 5 seconds refetchInterval: 5000, // Poll every 5 seconds
@@ -41,7 +47,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
}; };
const handleExport = () => { const handleExport = () => {
const exportText = signatures const exportText = Object.values(signaturesData || {})
.map(sig => [ .map(sig => [
sig.identifier, sig.identifier,
'', // Empty field (part[1] in parseSignature) '', // Empty field (part[1] in parseSignature)
@@ -65,29 +71,8 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
}); });
}; };
const signatures = signaturesData || [];
const isLoading = signaturesLoading; const isLoading = signaturesLoading;
const { categories, toggleCategoryVisibility } = useSignatureCategories(signaturesData || new Map());
// 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);
});
const { categories, toggleCategoryVisibility } = useSignatureCategories(sortedSignatures);
return ( return (
<div className="space-y-6"> <div className="space-y-6">
@@ -104,7 +89,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<CleanModeToggle cleanMode={cleanMode} onToggle={onCleanModeToggle} /> <CleanModeToggle cleanMode={cleanMode} onToggle={onCleanModeToggle} />
<Badge variant="outline" className="bg-slate-700/50 text-slate-300 border-slate-600"> <Badge variant="outline" className="bg-slate-700/50 text-slate-300 border-slate-600">
Total: {signatures.length} Total: {signaturesData?.size}
</Badge> </Badge>
<Button <Button
onClick={handleExport} onClick={handleExport}
@@ -144,7 +129,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
<Card className="bg-slate-800/30 border-slate-700"> <Card className="bg-slate-800/30 border-slate-700">
<CardContent className="pt-6"> <CardContent className="pt-6">
<div className="space-y-4"> <div className="space-y-4">
{[...Array(6)].map((_, i) => ( {[...Array(1)].map((_, i) => (
<div key={i} className="flex items-center gap-4 p-4 animate-pulse"> <div key={i} className="flex items-center gap-4 p-4 animate-pulse">
<div className="h-6 bg-slate-700 rounded w-24"></div> <div className="h-6 bg-slate-700 rounded w-24"></div>
<div className="h-4 bg-slate-600 rounded flex-1"></div> <div className="h-4 bg-slate-600 rounded flex-1"></div>
@@ -158,7 +143,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
{/* Signature Categories */} {/* Signature Categories */}
{system && !signaturesLoading && ( {system && !signaturesLoading && (
<SignatureCategories <SignatureCategories
categories={categories} categories={categories}
onToggleCategory={toggleCategoryVisibility} onToggleCategory={toggleCategoryVisibility}
/> />

View File

@@ -71,7 +71,7 @@ export const getSignatureMeta = (type: string): SignatureCategoryMeta => {
return allCategories.get("unknown")!; return allCategories.get("unknown")!;
}; };
export const categorizeSignatures = (signatures: Signature[]): Record<string, Signature[]> => { export const categorizeSignatures = (signatures: Map<string, Signature>): Record<string, Signature[]> => {
const categories: Record<string, Signature[]> = { const categories: Record<string, Signature[]> = {
unknown: [], unknown: [],
combat: [], combat: [],
@@ -90,7 +90,7 @@ export const categorizeSignatures = (signatures: Signature[]): Record<string, Si
return categories; return categories;
}; };
export const useSignatureCategories = (signatures: Signature[]) => { export const useSignatureCategories = (signatures: Map<string, Signature>) => {
const [categoryVisibility, setCategoryVisibility] = useState<Record<string, boolean>>({ const [categoryVisibility, setCategoryVisibility] = useState<Record<string, boolean>>({
unknown: true, unknown: true,
combat: true, combat: true,