spb/autoscholar
Public
1import Link from "next/link";2import { redirect } from "next/navigation";3import type { ReactNode } from "react";4import { ThemeToggle } from "@/components/ThemeToggle";5import { currentSession } from "@/lib/server/session";6import { LogoutButton } from "./LogoutButton";78const NAV: Array<[string, string]> = [9 ["/admin", "Overview"],10 ["/admin/new", "New research"],11 ["/admin/projects", "Projects"],12 ["/admin/runs", "Runs"],13 ["/admin/maclustr", "MacLustr"],14 ["/admin/manuscripts", "Manuscripts"],15 ["/admin/quality", "Quality"],16 ["/admin/publications", "Publications"],17 ["/admin/templates", "Templates"],18 ["/admin/settings", "Settings & security"],19];2021export default async function ConsoleLayout({ children }: { children: ReactNode }) {22 const sess = await currentSession();23 if (!sess) redirect("/admin/login");24 if (sess.mustChangePassword) redirect("/admin/change-password");25 return (26 <div className="min-h-dvh md:grid md:grid-cols-[14rem_1fr]">27 <a href="#admin-main" className="skip-link">28 Skip to content29 </a>30 <aside31 className="border-b hairline md:border-r md:border-b-0"32 style={{ background: "var(--bg-muted)" }}33 >34 <div className="flex items-center justify-between px-4 py-3">35 <Link href="/admin" className="serif font-semibold no-underline">36 AutoScholar <span className="subtle text-xs">admin</span>37 </Link>38 <ThemeToggle />39 </div>40 <nav aria-label="Admin" className="flex gap-1 overflow-x-auto px-2 pb-2 md:flex-col md:pb-4">41 {NAV.map(([href, label]) => (42 <Link43 key={href}44 href={href}45 className="whitespace-nowrap rounded-md px-2 py-1.5 text-sm no-underline hover:bg-[var(--bg-elev)]"46 >47 {label}48 </Link>49 ))}50 </nav>51 <div className="muted hidden px-4 pb-4 text-xs md:block">52 Signed in as <strong>{sess.username}</strong>53 <div className="mt-2">54 <LogoutButton />55 </div>56 <div className="mt-3">57 <Link href="/" className="text-xs">58 ← Public site59 </Link>60 </div>61 </div>62 </aside>63 <main id="admin-main" className="min-w-0 px-4 py-6 sm:px-6 lg:px-8">64 {children}65 </main>66 </div>67 );68}69