Add dropper location selector: discover available droppers on network, pass through server, and add dropdown in order panel for location-based dispensing

This commit is contained in:
MayaTheShy
2026-03-21 19:57:13 -04:00
parent fcfef379be
commit 79eca14f4c
5 changed files with 204 additions and 46 deletions

View File

@@ -15,6 +15,9 @@ function InventoryGrid() {
const [orderAmount, setOrderAmount] = useState(1);
const [sortBy, setSortBy] = useState('count');
const [activeCategory, setActiveCategory] = useState('all');
const [selectedDropper, setSelectedDropper] = useState('');
const droppers = inventory.droppers || [];
const items = getFilteredItems();
@@ -33,8 +36,8 @@ function InventoryGrid() {
const handleOrder = useCallback(async () => {
if (!selectedItem || orderAmount <= 0) return;
await orderItem(selectedItem.name, orderAmount);
}, [selectedItem, orderAmount, orderItem]);
await orderItem(selectedItem.name, orderAmount, selectedDropper || undefined);
}, [selectedItem, orderAmount, orderItem, selectedDropper]);
const handleItemClick = (item) => {
setSelectedItem(item);
@@ -162,6 +165,22 @@ function InventoryGrid() {
<div className="order-section">
<h4>📤 Order Items</h4>
<div className="order-controls">
{droppers.length > 1 && (
<div className="dropper-select-wrapper">
<label className="dropper-label">📍 Dispense to:</label>
<select
className="dropper-select"
value={selectedDropper}
onChange={(e) => setSelectedDropper(e.target.value)}
>
{droppers.map((d) => (
<option key={d.name} value={d.name}>
{d.name.replace(/^minecraft:/, '')}{d.isDefault ? ' (default)' : ''}
</option>
))}
</select>
</div>
)}
<div className="order-amount-controls">
<button className="mc-btn" onClick={() => setOrderAmount(Math.max(1, orderAmount - 1))}>-</button>
<input