feat: initial open-source release of Pipely
OTA update server designed for high-concurrency, low-bandwidth deployments. GORM-backed PostgreSQL, JWT auth, device management, artefact versioning, deployment rollout with gated rate-limited downloads, and a React admin panel.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import { NavLink, useNavigate, Outlet } from 'react-router-dom';
|
||||
import { setToken } from '../api/client';
|
||||
import './Layout.css';
|
||||
|
||||
export default function Layout() {
|
||||
const navigate = useNavigate();
|
||||
|
||||
function handleLogout() {
|
||||
setToken(null);
|
||||
navigate('/');
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="app-layout">
|
||||
<aside className="sidebar">
|
||||
<div className="sidebar-brand">
|
||||
<h2>OTA Manager</h2>
|
||||
</div>
|
||||
<nav>
|
||||
<NavLink to="/dashboard" className={({ isActive }) => isActive ? 'nav-link active' : 'nav-link'}>
|
||||
Dashboard
|
||||
</NavLink>
|
||||
<NavLink to="/artefacts" className={({ isActive }) => isActive ? 'nav-link active' : 'nav-link'}>
|
||||
Versions
|
||||
</NavLink>
|
||||
<NavLink to="/deployments" className={({ isActive }) => isActive ? 'nav-link active' : 'nav-link'}>
|
||||
Deployments
|
||||
</NavLink>
|
||||
<NavLink to="/users" className={({ isActive }) => isActive ? 'nav-link active' : 'nav-link'}>
|
||||
Admin Users
|
||||
</NavLink>
|
||||
</nav>
|
||||
<div className="sidebar-footer">
|
||||
<button className="btn-logout" onClick={handleLogout}>Logout</button>
|
||||
</div>
|
||||
</aside>
|
||||
<main className="content">
|
||||
<Outlet />
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user