import React, { useState, useMemo } from 'react'; import { useInventoryStore } from '../store/inventoryStore'; import { formatItemName } from '../utils/itemUtils'; import ItemIcon from './ItemIcon'; import './SmeltingPanel.css'; function SmeltingPanel() { const inventory = useInventoryStore((state) => state.inventory); const smeltingPaused = useInventoryStore((state) => state.smeltingPaused); const disabledRecipes = useInventoryStore((state) => state.disabledRecipes); const smeltable = useInventoryStore((state) => state.smeltable); const toggleSmelting = useInventoryStore((state) => state.toggleSmelting); const toggleRecipe = useInventoryStore((state) => state.toggleRecipe); const enableAllRecipes = useInventoryStore((state) => state.enableAllRecipes); const disableAllRecipes = useInventoryStore((state) => state.disableAllRecipes); const [collapsedGroups, setCollapsedGroups] = useState({}); const furnaceStatus = inventory.furnaceStatus || {}; const furnaceEntries = Object.entries(furnaceStatus); const smeltableEntries = Object.entries(smeltable || {}); // Group recipes by output item const groupedRecipes = useMemo(() => { const groups = {}; for (const [input, recipe] of smeltableEntries) { const result = (recipe && recipe.result) || 'unknown'; if (!groups[result]) { groups[result] = []; } groups[result].push({ input, recipe }); } // Sort groups by output name return Object.entries(groups).sort(([a], [b]) => formatItemName(a).localeCompare(formatItemName(b)) ); }, [smeltableEntries]); const toggleGroup = (groupKey) => { setCollapsedGroups((prev) => ({ ...prev, [groupKey]: !prev[groupKey], })); }; return (
{/* Header */}

🔥 Smelting Dashboard

{smeltingPaused && (
⚠️ Smelting is PAUSED
)} {/* Furnace status */}

🔥 Furnaces ({inventory.furnaceCount || 0})

{furnaceEntries.length > 0 ? (
{furnaceEntries.map(([name, status]) => (
{(name || '').replace(/^minecraft:/, '')}
{status && status.input && (
In: {status.input.count || 0}
)} {status && status.fuel && (
Fuel: {status.fuel.count || 0}
)} {status && status.output && (
Out: {status.output.count || 0}
)} {(!status || (!status.input && !status.fuel && !status.output)) && ( Empty )}
))}
) : (
No furnace data available
)}
{/* Recipe list - Grouped by output */}

📋 Smelting Recipes ({smeltableEntries.length})

{groupedRecipes.map(([outputName, recipes]) => { const isCollapsed = collapsedGroups[outputName]; const enabledCount = recipes.filter((r) => !disabledRecipes[r.input]).length; return (
toggleGroup(outputName)} > {isCollapsed ? '▶' : '▼'} {formatItemName(outputName)} {enabledCount}/{recipes.length} enabled
{!isCollapsed && (
{recipes.map(({ input, recipe }) => { const isDisabled = disabledRecipes[input]; const furnaces = (recipe && recipe.furnaces) || []; return (
toggleRecipe(input)} >
{isDisabled ? '⬜' : '✅'}
{formatItemName(input)}
{furnaces.map((f) => ( {(f || '').replace(/^minecraft:/, '')} ))}
); })}
)}
); })} {groupedRecipes.length === 0 && (
No smelting recipes loaded
)}
); } export default SmeltingPanel;