import React, { useState, useEffect } from "react"; import GameDataManager from "../../../services/GameDataManager.js"; import "./styles/ItemListTab.css"; import { config } from "../../../config/api.js"; const ItemListTab = () => { const [allItems, setAllItems] = useState([]); const [filteredItems, setFilteredItems] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [selectedCategory, setSelectedCategory] = useState("all"); const [selectedItem, setSelectedItem] = useState(null); const [isMobile, setIsMobile] = useState(window.innerWidth <= 768); const ASSET_BASE_URL = `${config.serverUrl}/static/`; useEffect(() => { const handleResize = () => setIsMobile(window.innerWidth <= 768); window.addEventListener("resize", handleResize); const itemsArray = Array.from(GameDataManager.items.keys()).map((id) => GameDataManager.getItem(id), ); setAllItems(itemsArray); setFilteredItems(itemsArray); return () => window.removeEventListener("resize", handleResize); }, []); useEffect(() => { let result = allItems; if (selectedCategory !== "all") { result = result.filter( (item) => item.meta?.category === selectedCategory, ); } if (searchQuery) { const q = searchQuery.toLowerCase(); result = result.filter( (item) => item.displayName.toLowerCase().includes(q) || item.id.toLowerCase().includes(q), ); } setFilteredItems(result); }, [searchQuery, selectedCategory, allItems]); const getFullTextureUrl = (path) => { if (!path) return "/assets/no-image.png"; return path.startsWith("http") ? path : `${ASSET_BASE_URL}${path}`; }; const categories = [ "all", ...new Set(allItems.map((i) => i.meta?.category).filter(Boolean)), ]; const renderInspector = () => (
isMobile && setSelectedItem(null)} > {selectedItem && (
e.stopPropagation()}> {isMobile && ( )}
{selectedItem.id}

{selectedItem.displayName}

{selectedItem.meta?.rarity?.toUpperCase()}
DATA_DESCRIPTION

{selectedItem.description}

{selectedItem.stats && Object.keys(selectedItem.stats).length > 0 && (
PARAMETER_READOUT
{Object.entries(selectedItem.stats).map(([k, v]) => (
{GameDataManager.getStatName(k)} +{v}
))}
)}
)}
); return (
setSearchQuery(e.target.value)} />
{categories.map((cat) => ( ))}
{filteredItems.map((item) => (
setSelectedItem(item)} >
{item.displayName}
{item.id}
))}
{(!isMobile || (isMobile && selectedItem)) && renderInspector()}
); }; export default ItemListTab;