'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 { Offering, OfferingRole, getOfferingIconUrl } from './types'; type Props = { offerings: Offering[]; quantities: Record; randMin: number; randMax: number; onSetQty: (id: string, qty: number) => void; }; const ROLE_LABELS: Record = { all: 'All', shared: 'Shared', killer: 'Killer', survivor: 'Survivor', }; const roleMatches = (offeringRole: number, filter: OfferingRole) => { if (filter === 'all') return true; if (filter === 'shared') return offeringRole === 0; if (filter === 'killer') return offeringRole === 1; if (filter === 'survivor') return offeringRole === 2; return true; }; export default function OfferingGrid({ offerings, quantities, randMin, randMax, onSetQty }: Props) { const [search, setSearch] = useState(''); const [roleFilter, setRoleFilter] = useState('all'); const filtered = useMemo(() => { return offerings.filter(o => { if (!roleMatches(o.role, roleFilter)) return false; if (search.trim() && !o.name.toLowerCase().includes(search.toLowerCase())) return false; return true; }); }, [offerings, roleFilter, search]); const handleGive100Visible = () => filtered.forEach(o => onSetQty(o.id, 100)); const handleRandVisible = () => filtered.forEach(o => onSetQty(o.id, randInRange(randMin, randMax))); const handleLockVisible = () => filtered.forEach(o => onSetQty(o.id, 0)); const activeCount = Object.values(quantities).filter(q => q > 0).length; return ( <>
setSearch(e.target.value)} />
{(Object.keys(ROLE_LABELS) as OfferingRole[]).map(r => ( ))}
{filtered.length} shown ยท {activeCount} active
{filtered.length === 0 ? (
No offerings match
) : (
{filtered.map(offering => ( ))}
)} ); }