SPB Git

spb/autoscholar

Public
2.3 KB · 69 lines tsx
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
Files · 87b4e55c3b9fbcc2cd191a1e469b33de0a24ccc8
Menu

Theme