Rework signatures to be a map and not a list
Because they ARE unique by identifier WITHIN A SYSTEM
This commit is contained in:
@@ -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>
|
||||
|
@@ -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}
|
||||
/>
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user