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