added multi user support, move api key to database
build-and-push / build (push) Failing after 35s

This commit is contained in:
2026-08-01 13:16:54 +05:00
parent a7c5fe739a
commit 66073c7891
23 changed files with 2123 additions and 103 deletions
+50 -6
View File
@@ -1,11 +1,25 @@
import { NavLink, Navigate, Route, Routes } from 'react-router-dom'
import { LogOut, Moon, Router, Sun, Users, Wifi } from 'lucide-react'
import {
KeyRound,
LogOut,
Moon,
Router,
ScrollText,
Sun,
UserCog,
Users as UsersIcon,
Wifi,
} from 'lucide-react'
import { useAuth } from '@/auth/auth'
import { useTheme } from '@/lib/theme'
import { Login } from '@/pages/Login'
import { Clients } from '@/pages/Clients'
import { Devices } from '@/pages/Devices'
import { Vlans } from '@/pages/Vlans'
import { Users } from '@/pages/Users'
import { ApiKeys } from '@/pages/ApiKeys'
import { Logs } from '@/pages/Logs'
import { ChangePassword } from '@/pages/ChangePassword'
import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'
@@ -25,7 +39,7 @@ function ThemeToggle() {
)
}
function Nav() {
function Nav({ username, isAdmin }: { username: string; isAdmin: boolean }) {
const { logout } = useAuth()
const linkClass = ({ isActive }: { isActive: boolean }) =>
cn(
@@ -41,7 +55,7 @@ function Nav() {
RADIUS Admin
</div>
<NavLink to="/clients" className={linkClass}>
<Users className="h-4 w-4" /> Clients
<UsersIcon className="h-4 w-4" /> Clients
</NavLink>
<NavLink to="/devices" className={linkClass}>
<Router className="h-4 w-4" /> Devices
@@ -49,7 +63,23 @@ function Nav() {
<NavLink to="/vlans" className={linkClass}>
<Wifi className="h-4 w-4" /> VLANs
</NavLink>
{isAdmin && (
<>
<NavLink to="/users" className={linkClass}>
<UserCog className="h-4 w-4" /> Users
</NavLink>
<NavLink to="/apikeys" className={linkClass}>
<KeyRound className="h-4 w-4" /> API Keys
</NavLink>
<NavLink to="/logs" className={linkClass}>
<ScrollText className="h-4 w-4" /> Activity Log
</NavLink>
</>
)}
<div className="ml-auto flex items-center gap-1">
<NavLink to="/account" className={linkClass} title="Change password">
{username}
</NavLink>
<ThemeToggle />
<Button variant="ghost" size="sm" className="text-muted-foreground" onClick={logout}>
<LogOut className="h-4 w-4" /> Sign out
@@ -61,18 +91,32 @@ function Nav() {
}
export default function App() {
const { authenticated } = useAuth()
const { user } = useAuth()
if (!authenticated) return <Login />
if (!user) return <Login />
if (user.must_change_password) return <ChangePassword forced />
const admin = user.is_admin
return (
<div className="min-h-screen bg-muted/20">
<Nav />
<Nav username={user.username} isAdmin={admin} />
<main className="mx-auto max-w-6xl px-4 py-6">
<Routes>
<Route path="/clients" element={<Clients />} />
<Route path="/devices" element={<Devices />} />
<Route path="/vlans" element={<Vlans />} />
<Route path="/account" element={<ChangePassword />} />
<Route
path="/users"
element={admin ? <Users /> : <Navigate to="/clients" replace />}
/>
<Route
path="/apikeys"
element={admin ? <ApiKeys /> : <Navigate to="/clients" replace />}
/>
<Route path="/logs" element={admin ? <Logs /> : <Navigate to="/clients" replace />} />
<Route path="*" element={<Navigate to="/clients" replace />} />
</Routes>
</main>