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>
|
</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>
|
||||||
|
|||||||
@@ -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}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user