'use client'; import { useState } from 'react'; import { GameCard } from '@/components/ui/game-card'; import { Badge } from '@/components/ui/badge'; import { ActionButton } from '@/components/ui/action-button'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import { Input } from '@/components/ui/input'; import { Gem, Search, ArrowUpDown, AlertTriangle } from 'lucide-react'; import { ElementBadge } from '@/components/ui/element-badge'; import type { LootInventory as LootInventoryType, EquipmentInstance, ElementState } from '@/lib/game/types'; import { LOOT_DROPS, RARITY_COLORS } from '@/lib/game/data/loot-drops'; import { EQUIPMENT_TYPES } from '@/lib/game/data/equipment'; import { ELEMENTS } from '@/lib/game/constants'; import { useGameToast } from '@/components/game/GameToast'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { type SortMode, type FilterMode, RARITY_ORDER, RARITY_CSS_VAR, RARITY_GLOW_CSS_VAR } from './types'; import { MaterialsSection } from './MaterialItem'; import { EssenceSection } from './EssenceItem'; import { BlueprintsSection } from './BlueprintsSection'; import { EquipmentSection } from './EquipmentItem'; interface LootInventoryProps { inventory: LootInventoryType; elements?: Record; equipmentInstances?: Record; onDeleteMaterial?: (materialId: string, amount: number) => void; onDeleteEquipment?: (instanceId: string) => void; } export function LootInventoryDisplay({ inventory, elements, equipmentInstances = {}, onDeleteMaterial, onDeleteEquipment, }: LootInventoryProps) { const showToast = useGameToast(); const [searchTerm, setSearchTerm] = useState(''); const [sortMode, setSortMode] = useState('rarity'); const [filterMode, setFilterMode] = useState('all'); const [deleteConfirm, setDeleteConfirm] = useState<{ type: 'material' | 'equipment'; id: string; name: string } | null>(null); // Count items const materialCount = Object.values(inventory.materials || {}).reduce((a: number, b: number) => a + b, 0); // Calculate essence count let essenceCount = 0; if (elements) { essenceCount = Object.entries(elements).reduce((acc: number, [id, state]) => { if (id === 'transference') return acc; return acc + (state.current || 0); }, 0); } const blueprintCount = inventory.blueprints.length; const equipmentCount = Object.keys(equipmentInstances).length; const totalItems = materialCount + blueprintCount + equipmentCount; // Filter and sort materials const filteredMaterials = Object.entries(inventory.materials) .filter(([id, count]) => { if (count <= 0) return false; const drop = LOOT_DROPS[id]; if (!drop) return false; if (searchTerm && !drop.name.toLowerCase().includes(searchTerm.toLowerCase())) return false; return true; }) .sort(([aId, aCount], [bId, bCount]) => { const aDrop = LOOT_DROPS[aId]; const bDrop = LOOT_DROPS[bId]; if (!aDrop || !bDrop) return 0; switch (sortMode) { case 'name': return aDrop.name.localeCompare(bDrop.name); case 'rarity': return RARITY_ORDER[bDrop.rarity] - RARITY_ORDER[aDrop.rarity]; case 'count': return bCount - aCount; default: return 0; } }); // Filter and sort essence const filteredEssence = elements ? Object.entries(elements) .filter(([id, state]) => { if (!state.unlocked || state.current <= 0) return false; if (id === 'transference') return false; if (searchTerm && !ELEMENTS[id]?.name.toLowerCase().includes(searchTerm.toLowerCase())) return false; return true; }) .sort(([aId, aState], [bId, bState]) => { switch (sortMode) { case 'name': return (ELEMENTS[aId]?.name || aId).localeCompare(ELEMENTS[bId]?.name || bId); case 'count': return bState.current - aState.current; default: return 0; } }) : []; // Filter and sort equipment const filteredEquipment = Object.entries(equipmentInstances) .filter(([id, instance]) => { if (searchTerm && !instance.name.toLowerCase().includes(searchTerm.toLowerCase())) return false; return true; }) .sort(([aId, aInst], [bId, bInst]) => { switch (sortMode) { case 'name': return aInst.name.localeCompare(bInst.name); case 'rarity': return RARITY_ORDER[bInst.rarity] - RARITY_ORDER[aInst.rarity]; default: return 0; } }); const hasItems = totalItems > 0 || essenceCount > 0; const handleDeleteMaterial = (materialId: string) => { const drop = LOOT_DROPS[materialId]; if (drop) { setDeleteConfirm({ type: 'material', id: materialId, name: drop.name }); } }; const handleDeleteEquipment = (instanceId: string) => { const instance = equipmentInstances[instanceId]; if (instance) { setDeleteConfirm({ type: 'equipment', id: instanceId, name: instance.name }); } }; const confirmDelete = () => { if (!deleteConfirm) return; if (deleteConfirm.type === 'material' && onDeleteMaterial) { const amount = inventory.materials[deleteConfirm.id] || 0; onDeleteMaterial(deleteConfirm.id, amount); showToast('success', 'Material Deleted', `${deleteConfirm.name} removed from inventory`); } else if (deleteConfirm.type === 'equipment' && onDeleteEquipment) { onDeleteEquipment(deleteConfirm.id); showToast('success', 'Item Discarded', `${deleteConfirm.name} has been removed from inventory`); } setDeleteConfirm(null); }; if (!hasItems) { return (

Inventory

No items collected yet. Defeat floors and guardians to find loot!
); } return ( <>

Inventory

{totalItems} items
{/* Search and Filter Controls */}
setSearchTerm(e.target.value)} className="h-7 pl-7 bg-[var(--bg-sunken)] border-[var(--border-subtle)] text-xs text-[var(--text-primary)] placeholder:text-[var(--text-disabled)]" aria-label="Search inventory" />
setSortMode(sortMode === 'rarity' ? 'name' : sortMode === 'name' ? 'count' : 'rarity')} aria-label={`Sort by ${sortMode === 'rarity' ? 'name' : sortMode === 'name' ? 'count' : 'rarity'}`} >
{/* Filter Tabs */}
{[ { mode: 'all' as FilterMode, label: 'All' }, { mode: 'materials' as FilterMode, label: `Materials (${materialCount})` }, { mode: 'essence' as FilterMode, label: `Essence (${essenceCount})` }, { mode: 'blueprints' as FilterMode, label: `Blueprints (${blueprintCount})` }, { mode: 'equipment' as FilterMode, label: `Equipment (${equipmentCount})` }, ].map(({ mode, label }) => ( setFilterMode(mode)} aria-pressed={filterMode === mode} aria-label={`Filter by ${label}`} > {label} ))}
{/* Materials */} {(filterMode === 'all' || filterMode === 'materials') && ( )} {/* Essence */} {(filterMode === 'all' || filterMode === 'essence') && ( )} {/* Blueprints */} {(filterMode === 'all' || filterMode === 'blueprints') && ( )} {/* Equipment */} {(filterMode === 'all' || filterMode === 'equipment') && ( )}
{/* Delete Confirmation Dialog */} setDeleteConfirm(null)}> Delete Item Are you sure you want to delete {deleteConfirm?.name}? {deleteConfirm?.type === 'material' && ( This will delete ALL {inventory.materials[deleteConfirm?.id || ''] || 0} of this material! )} {deleteConfirm?.type === 'equipment' && ( This equipment and all its enchantments will be permanently lost! )} Cancel Delete ); } LootInventoryDisplay.displayName = "LootInventoryDisplay";