Add main application component with inventory management panels and connection status
This commit is contained in:
91
web/client/src/App.jsx
Normal file
91
web/client/src/App.jsx
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
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 { useInventoryStore } from './store/inventoryStore';
|
||||||
|
import './App.css';
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
const connect = useInventoryStore((state) => state.connect);
|
||||||
|
const connected = useInventoryStore((state) => state.connected);
|
||||||
|
const commandResult = useInventoryStore((state) => state.commandResult);
|
||||||
|
const [panelTab, setPanelTab] = useState('inventory');
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
connect();
|
||||||
|
}, [connect]);
|
||||||
|
|
||||||
|
const renderPanelContent = () => {
|
||||||
|
switch (panelTab) {
|
||||||
|
case 'inventory':
|
||||||
|
return <InventoryGrid />;
|
||||||
|
case 'smelting':
|
||||||
|
return <SmeltingPanel />;
|
||||||
|
case 'crafting':
|
||||||
|
return <CraftingPanel />;
|
||||||
|
case 'alerts':
|
||||||
|
return <AlertsPanel />;
|
||||||
|
default:
|
||||||
|
return <InventoryGrid />;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="app">
|
||||||
|
<div className="app-header">
|
||||||
|
<h1>⛏️ Inventory Manager</h1>
|
||||||
|
<div className={`connection-status ${connected ? 'connected' : 'disconnected'}`}>
|
||||||
|
<span className="status-dot"></span>
|
||||||
|
{connected ? 'Connected' : 'Disconnected'}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{commandResult && (
|
||||||
|
<div className={`command-toast ${commandResult.success ? 'success' : 'error'}`}>
|
||||||
|
{commandResult.message || commandResult.error || (commandResult.success ? 'OK' : 'Failed')}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<div className="app-content">
|
||||||
|
<div className="sidebar">
|
||||||
|
<StorageOverview />
|
||||||
|
</div>
|
||||||
|
<div className="main-panel">
|
||||||
|
<div className="panel-tabs">
|
||||||
|
<button
|
||||||
|
className={panelTab === 'inventory' ? 'active' : ''}
|
||||||
|
onClick={() => setPanelTab('inventory')}
|
||||||
|
>
|
||||||
|
📦 Inventory
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={panelTab === 'smelting' ? 'active' : ''}
|
||||||
|
onClick={() => setPanelTab('smelting')}
|
||||||
|
>
|
||||||
|
🔥 Smelting
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={panelTab === 'crafting' ? 'active' : ''}
|
||||||
|
onClick={() => setPanelTab('crafting')}
|
||||||
|
>
|
||||||
|
🔨 Crafting
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
className={panelTab === 'alerts' ? 'active' : ''}
|
||||||
|
onClick={() => setPanelTab('alerts')}
|
||||||
|
>
|
||||||
|
🔔 Alerts
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="panel-content-wrapper">
|
||||||
|
{renderPanelContent()}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App;
|
||||||
Reference in New Issue
Block a user