'use client'; import { useState, useMemo } from 'react'; import shared from '../../styles/shared.module.css'; import styles from '../../styles/Items.module.css'; import QuantityCard from '../../components/QuantityCard'; import { Item, ItemType, ITEM_TYPE_LABELS, getItemType, getItemIconUrl } from './types'; import { randInRange } from '@/lib/utils'; type Props = { items: Item[]; quantities: Record; randMin: number; randMax: number; onSetQty: (id: string, qty: number) => void; }; export default function ItemGrid({ items, quantities, randMin, randMax, onSetQty }: Props) { const [search, setSearch] = useState(''); const [typeFilter, setTypeFilter] = useState('all'); const filtered = useMemo(() => { return items.filter(item => { if (typeFilter !== 'all' && getItemType(item.id) !== typeFilter) return false; if (search.trim() && !item.name.toLowerCase().includes(search.toLowerCase())) return false; return true; }); }, [items, typeFilter, search]); const handleGive100Visible = () => filtered.forEach(i => onSetQty(i.id, 100)); const handleRandVisible = () => filtered.forEach(i => onSetQty(i.id, randInRange(randMin, randMax))); const handleLockVisible = () => filtered.forEach(i => onSetQty(i.id, 0)); const activeCount = Object.values(quantities).filter(q => q > 0).length; return ( <>
setSearch(e.target.value)} />
{(Object.keys(ITEM_TYPE_LABELS) as ItemType[]).map(t => ( ))}
{filtered.length} shown ยท {activeCount} active
{filtered.length === 0 ? (
No items match
) : (
{filtered.map(item => ( ))}
)} ); }