diff --git a/web/client/src/components/InventoryGrid.jsx b/web/client/src/components/InventoryGrid.jsx new file mode 100644 index 0000000..ee66c43 --- /dev/null +++ b/web/client/src/components/InventoryGrid.jsx @@ -0,0 +1,155 @@ +import React, { useState, useCallback } from 'react'; +import { useInventoryStore } from '../store/inventoryStore'; +import { formatItemName, getItemEmoji, formatCount } from '../utils/itemUtils'; +import ItemIcon from './ItemIcon'; +import './InventoryGrid.css'; + +function InventoryGrid() { + const inventory = useInventoryStore((state) => state.inventory); + const searchQuery = useInventoryStore((state) => state.searchQuery); + const setSearchQuery = useInventoryStore((state) => state.setSearchQuery); + const getFilteredItems = useInventoryStore((state) => state.getFilteredItems); + const orderItem = useInventoryStore((state) => state.orderItem); + + const [selectedItem, setSelectedItem] = useState(null); + const [orderAmount, setOrderAmount] = useState(1); + const [sortBy, setSortBy] = useState('count'); // 'count', 'name' + + const items = getFilteredItems(); + + const sortedItems = [...items].sort((a, b) => { + if (sortBy === 'count') return (b.count || 0) - (a.count || 0); + if (sortBy === 'name') return (a.displayName || a.name || '').localeCompare(b.displayName || b.name || ''); + return 0; + }); + + const handleOrder = useCallback(async () => { + if (!selectedItem || orderAmount <= 0) return; + await orderItem(selectedItem.name, orderAmount); + }, [selectedItem, orderAmount, orderItem]); + + const handleItemClick = (item) => { + setSelectedItem(item); + setOrderAmount(1); + }; + + return ( +