import React, { useEffect, useState } from 'react'; import InventoryGrid from './components/InventoryGrid'; import StorageOverview from './components/StorageOverview'; import SmeltingPanel from './components/SmeltingPanel'; import CraftingPanel from './components/CraftingPanel'; import AlertsPanel from './components/AlertsPanel'; import AnalyticsPanel from './components/AnalyticsPanel'; import SettingsPanel from './components/SettingsPanel'; import ErrorBoundary from './components/ErrorBoundary'; import { useInventoryStore } from './store/inventoryStore'; import './App.css'; function App() { const connect = useInventoryStore((state) => state.connect); const connected = useInventoryStore((state) => state.connected); const bridgeConnected = useInventoryStore((state) => state.bridgeConnected); const lastUpdate = useInventoryStore((state) => state.lastUpdate); const commandResult = useInventoryStore((state) => state.commandResult); const alerts = useInventoryStore((state) => state.alerts) || []; const [panelTab, setPanelTab] = useState('inventory'); const [showAlerts, setShowAlerts] = useState(false); const [showSettings, setShowSettings] = useState(false); const [, forceRender] = useState(0); useEffect(() => { connect(); }, [connect]); // Re-render every 5s so the "last updated" text stays fresh useEffect(() => { const id = setInterval(() => forceRender((n) => n + 1), 5000); return () => clearInterval(id); }, []); const staleSecs = lastUpdate ? Math.floor((Date.now() - lastUpdate) / 1000) : null; useEffect(() => { connect(); }, [connect]); const renderPanelContent = () => { switch (panelTab) { case 'inventory': return ; case 'smelting': return ; case 'crafting': return ; case 'analytics': return ; default: return ; } }; const triggeredAlerts = alerts.filter((a) => a.triggered !== false); return (

⛏️ Inventory Manager

{/* Settings gear button */} {/* Alerts bell button */}
{connected ? 'Connected' : 'Disconnected'}
{connected && (
{bridgeConnected ? 'Bridge OK' : 'Bridge Off'}
)} {staleSecs !== null && staleSecs > 0 && ( {staleSecs < 60 ? `${staleSecs}s ago` : `${Math.floor(staleSecs / 60)}m ago`} )}
{commandResult && (
{commandResult.message || commandResult.error || (commandResult.success ? 'OK' : 'Failed')}
)} {/* Alerts popup overlay */} setShowAlerts(false)} /> {/* Settings overlay */} setShowSettings(false)} />
{renderPanelContent()}
); } export default App;