"use client" import { useState, useCallback, useRef } from "react" import Link from "next/link" import { ChevronLeft, Search, Info } from "lucide-react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Badge } from "@/components/ui/badge" import { Separator } from "@/components/ui/separator" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { useUser } from "@/context/user-context" import type { InventoryItem } from "@/data/enemies" export default function InventoryPage() { const { userStats, useItem, removeItem } = useUser() const [searchTerm, setSearchTerm] = useState("") const [selectedItem, setSelectedItem] = useState(null) const [itemDetailsOpen, setItemDetailsOpen] = useState(false) const [itemToUse, setItemToUse] = useState(null) const itemToUseRef = useRef(null) // Filter items based on search term and type const filterItems = (items: InventoryItem[], type?: string) => { return items.filter( (item) => (type ? item.type === type : true) && (item.name.toLowerCase().includes(searchTerm.toLowerCase()) || item.description.toLowerCase().includes(searchTerm.toLowerCase())), ) } // Group items by type const materials = filterItems(userStats.inventory, "Material") const consumables = filterItems(userStats.inventory, "Consumable") const equipment = filterItems(userStats.inventory, ["Weapon", "Armor", "Accessory", "Rune"] as unknown as string) const allItems = filterItems(userStats.inventory) // Handle item use const handleUseItem = useCallback(() => { if (itemToUseRef.current) { useItem(itemToUseRef.current.id) setItemDetailsOpen(false) itemToUseRef.current = null } }, [useItem]) // Get rarity color const getRarityColor = (rarity: string) => { switch (rarity) { case "Common": return "text-gray-400" case "Uncommon": return "text-green-400" case "Rare": return "text-[#4cc9ff]" case "Epic": return "text-purple-400" case "Legendary": return "text-yellow-400" default: return "text-gray-400" } } // Get type color const getTypeColor = (type: string) => { switch (type) { case "Material": return "bg-amber-900 text-amber-200" case "Weapon": return "bg-red-900 text-red-200" case "Armor": return "bg-blue-900 text-blue-200" case "Accessory": return "bg-purple-900 text-purple-200" case "Consumable": return "bg-green-900 text-green-200" case "Rune": return "bg-indigo-900 text-indigo-200" case "Quest": return "bg-yellow-900 text-yellow-200" default: return "bg-gray-900 text-gray-200" } } return (
{/* Header */}

Inventory

Gold: {userStats.gold}
{/* Search and Filter */}
setSearchTerm(e.target.value)} />
{/* Inventory Tabs */} All Materials Consumables Equipment {/* All Items */}
{allItems.length > 0 ? ( allItems.map((item) => ( { setSelectedItem(item) setItemDetailsOpen(true) }} /> )) ) : (
{searchTerm ? "No items match your search." : "Your inventory is empty."}
)}
{/* Materials */}
{materials.length > 0 ? ( materials.map((item) => ( { setSelectedItem(item) setItemDetailsOpen(true) }} /> )) ) : (
{searchTerm ? "No materials match your search." : "You don't have any materials."}
)}
{/* Consumables */}
{consumables.length > 0 ? ( consumables.map((item) => ( { setSelectedItem(item) setItemDetailsOpen(true) }} /> )) ) : (
{searchTerm ? "No consumables match your search." : "You don't have any consumables."}
)}
{/* Equipment */}
{equipment.length > 0 ? ( equipment.map((item) => ( { setSelectedItem(item) setItemDetailsOpen(true) }} /> )) ) : (
{searchTerm ? "No equipment matches your search." : "You don't have any equipment."}
)}
{/* Item Details Dialog */} {selectedItem && ( {selectedItem.name} {selectedItem.type} {selectedItem.rarity}

{selectedItem.description}

{selectedItem.stats && Object.keys(selectedItem.stats).length > 0 && ( <>

Stats:

    {selectedItem.stats.str && (
  • Strength +{selectedItem.stats.str}
  • )} {selectedItem.stats.agi && (
  • Agility +{selectedItem.stats.agi}
  • )} {selectedItem.stats.per && (
  • Perception +{selectedItem.stats.per}
  • )} {selectedItem.stats.int && (
  • Intelligence +{selectedItem.stats.int}
  • )} {selectedItem.stats.vit && (
  • Vitality +{selectedItem.stats.vit}
  • )} {selectedItem.stats.resistance && Object.keys(selectedItem.stats.resistance).length > 0 && ( <>
  • Resistances:
  • {selectedItem.stats.resistance.fire && (
  • Fire +{selectedItem.stats.resistance.fire}
  • )} {selectedItem.stats.resistance.ice && (
  • Ice +{selectedItem.stats.resistance.ice}
  • )} {selectedItem.stats.resistance.lightning && (
  • Lightning +{selectedItem.stats.resistance.lightning}
  • )} {selectedItem.stats.resistance.poison && (
  • Poison +{selectedItem.stats.resistance.poison}
  • )} {selectedItem.stats.resistance.dark && (
  • Dark +{selectedItem.stats.resistance.dark}
  • )} )}
)} {selectedItem.quantity && (
Quantity: {selectedItem.quantity}
)}
{selectedItem.type === "Consumable" && ( )} {(selectedItem.type === "Weapon" || selectedItem.type === "Armor" || selectedItem.type === "Accessory") && ( )}
)}
) } function InventoryItemCard({ item, onSelect, }: { item: InventoryItem onSelect: () => void }) { // Get rarity color const getRarityColor = (rarity: string) => { switch (rarity) { case "Common": return "text-gray-400 border-gray-700" case "Uncommon": return "text-green-400 border-green-900" case "Rare": return "text-[#4cc9ff] border-[#4cc9ff]/30" case "Epic": return "text-purple-400 border-purple-900" case "Legendary": return "text-yellow-400 border-yellow-900" default: return "text-gray-400 border-gray-700" } } // Get type color const getTypeColor = (type: string) => { switch (type) { case "Material": return "bg-amber-900 text-amber-200" case "Weapon": return "bg-red-900 text-red-200" case "Armor": return "bg-blue-900 text-blue-200" case "Accessory": return "bg-purple-900 text-purple-200" case "Consumable": return "bg-green-900 text-green-200" case "Rune": return "bg-indigo-900 text-indigo-200" case "Quest": return "bg-yellow-900 text-yellow-200" default: return "bg-gray-900 text-gray-200" } } return (
{item.name} {item.quantity && x{item.quantity}}
{item.type}

{item.description}

{item.stats && Object.keys(item.stats).some((key) => key !== "resistance" && item.stats[key as keyof typeof item.stats]) && (
{item.stats.str &&
+{item.stats.str} STR
} {item.stats.agi &&
+{item.stats.agi} AGI
} {item.stats.per &&
+{item.stats.per} PER
} {item.stats.int &&
+{item.stats.int} INT
} {item.stats.vit &&
+{item.stats.vit} VIT
}
)}
) }