PowerGrid / frontend /src /App.jsx
saiteja020's picture
Rebrand to PowerGrid and improve AI model selector UI
1fac18a
Raw
History Blame Contribute Delete
2.17 kB
import { Routes, Route, NavLink, useLocation } from 'react-router-dom'
import { useEffect, useState } from 'react'
import { LayoutDashboard, PlayCircle, BarChart3, Zap } from 'lucide-react'
import Dashboard from './pages/Dashboard'
import RunEpisode from './pages/RunEpisode'
import Evaluate from './pages/Evaluate'
import { getHealth } from './api/client'
const NAV = [
{ to: '/', label: 'Dashboard', icon: LayoutDashboard },
{ to: '/run', label: 'Run Episode', icon: PlayCircle },
{ to: '/evaluate', label: 'Evaluate', icon: BarChart3 },
]
export default function App() {
const [online, setOnline] = useState(null)
const location = useLocation()
useEffect(() => {
getHealth()
.then(() => setOnline(true))
.catch(() => setOnline(false))
}, [location.pathname])
return (
<div className="layout">
{/* ── Sidebar ── */}
<aside className="sidebar">
<div className="brand">
<div className="brand-icon"></div>
<div>
<div className="brand-title">PowerGrid</div>
<div className="brand-sub">RL PLATFORM</div>
</div>
</div>
<nav className="nav">
<div className="nav-label">Navigation</div>
{NAV.map(({ to, label, icon: Icon }) => (
<NavLink
key={to}
to={to}
end={to === '/'}
className={({ isActive }) => `nav-item${isActive ? ' active' : ''}`}
>
<Icon size={17} />
{label}
</NavLink>
))}
</nav>
<div className="sidebar-footer">
<span className={`status-dot${online === false ? ' offline' : ''}`} />
{online === null ? 'Connecting…' : online ? 'Backend online' : 'Backend offline'}
</div>
</aside>
{/* ── Main ── */}
<main className="main">
<Routes>
<Route path="/" element={<Dashboard />} />
<Route path="/run" element={<RunEpisode />} />
<Route path="/evaluate" element={<Evaluate />} />
</Routes>
</main>
</div>
)
}