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>
<Badge
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}
</Badge>
</CardTitle>

View File

@@ -4,11 +4,12 @@ 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 { useSignatureCategories } from "@/hooks/useSignatureCategories";
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;
@@ -26,7 +27,12 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
queryKey: ['signatures', system],
queryFn: async () => {
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,
refetchInterval: 5000, // Poll every 5 seconds
@@ -41,7 +47,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
};
const handleExport = () => {
const exportText = signatures
const exportText = Object.values(signaturesData || {})
.map(sig => [
sig.identifier,
'', // Empty field (part[1] in parseSignature)
@@ -65,29 +71,8 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
});
};
const signatures = signaturesData || [];
const isLoading = 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);
});
const { categories, toggleCategoryVisibility } = useSignatureCategories(sortedSignatures);
const { categories, toggleCategoryVisibility } = useSignatureCategories(signaturesData || new Map());
return (
<div className="space-y-6">
@@ -104,7 +89,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
<div className="flex items-center gap-2">
<CleanModeToggle cleanMode={cleanMode} onToggle={onCleanModeToggle} />
<Badge variant="outline" className="bg-slate-700/50 text-slate-300 border-slate-600">
Total: {signatures.length}
Total: {signaturesData?.size}
</Badge>
<Button
onClick={handleExport}
@@ -144,7 +129,7 @@ export const SystemTracker = ({ system, cleanMode, onCleanModeToggle }: SystemTr
<Card className="bg-slate-800/30 border-slate-700">
<CardContent className="pt-6">
<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 className="h-6 bg-slate-700 rounded w-24"></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 */}
{system && !signaturesLoading && (
<SignatureCategories
<SignatureCategories
categories={categories}
onToggleCategory={toggleCategoryVisibility}
/>

View File

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