feat: implement admin panel for managing builds with retry functionality

This commit is contained in:
Ben Allfree
2025-12-01 11:12:33 -08:00
parent c8c4588310
commit 8cba89a9e0
8 changed files with 499 additions and 13 deletions
+57 -13
View File
@@ -1,23 +1,67 @@
import { useAuthActions } from '@convex-dev/auth/react'
import { Authenticated, Unauthenticated, useQuery } from 'convex/react'
import { Link } from 'react-router-dom'
import { Button } from '@/components/ui/button'
import { api } from '../../convex/_generated/api'
export default function Navbar() {
const { signIn, signOut } = useAuthActions()
const isAdmin = useQuery(api.admin.isAdmin)
return (
<nav className="border-b border-slate-800 bg-slate-950">
<div className="max-w-7xl mx-auto px-8 py-4">
<div className="flex items-center justify-between">
<Link
to="/"
className="flex items-center gap-3 hover:opacity-80 transition-opacity"
>
<img
src="/favicon-96x96.png"
alt="Mesh Forge logo"
className="h-10 w-10 rounded-lg"
/>
<span className="text-2xl font-bold bg-gradient-to-r from-cyan-400 to-blue-600 bg-clip-text text-transparent">
Mesh Forge
</span>
</Link>
<div className="flex items-center gap-8">
<Link
to="/"
className="flex items-center gap-3 hover:opacity-80 transition-opacity"
>
<img
src="/favicon-96x96.png"
alt="Mesh Forge logo"
className="h-10 w-10 rounded-lg"
/>
<span className="text-2xl font-bold bg-gradient-to-r from-cyan-400 to-blue-600 bg-clip-text text-transparent">
Mesh Forge
</span>
</Link>
<div className="flex items-center gap-4">
<Authenticated>
<Link
to="/dashboard"
className="text-slate-300 hover:text-white transition-colors"
>
Dashboard
</Link>
{isAdmin && (
<Link
to="/admin"
className="text-slate-300 hover:text-white transition-colors"
>
Admin
</Link>
)}
</Authenticated>
</div>
</div>
<div className="flex items-center gap-4">
<Unauthenticated>
<Button
onClick={() =>
signIn('google', { redirectTo: window.location.href })
}
className="bg-white text-slate-900 hover:bg-slate-200"
>
Sign in
</Button>
</Unauthenticated>
<Authenticated>
<Button variant="outline" onClick={() => signOut()}>
Sign Out
</Button>
</Authenticated>
</div>
</div>
</div>
</nav>