import { useEffect, useState } from "react"; import { Link, NavLink, Outlet, useLocation, useNavigate } from "react-router-dom"; import { api } from "../../lib/api"; import { usePageTitle } from "../../lib/pageTitle"; import "./Admin.scss"; function adminTitleFromPath(pathname: string): string { if (pathname.endsWith("/projects/new")) return "New project · Admin"; if (/\/projects\/[^/]+$/.test(pathname) && !pathname.endsWith("/projects")) return "Edit project · Admin"; if (pathname.includes("/projects")) return "Projects · Admin"; if (pathname.includes("/categories")) return "Categories · Admin"; if (pathname.includes("/views")) return "Portfolio views · Admin"; if (pathname.includes("/resume")) return "Resume · Admin"; if (pathname.includes("/settings")) return "Settings · Admin"; return "Admin"; } export function AdminLayout() { const [user, setUser] = useState<{ username: string; name?: string } | null>(null); const [error, setError] = useState(null); const navigate = useNavigate(); const location = useLocation(); usePageTitle(adminTitleFromPath(location.pathname)); useEffect(() => { api .me() .then(setUser) .catch((e) => setError(e.message)); }, []); if (error) { return (

Admin access required

This area is protected by Authelia SSO via the Remote-User header.

{error}

Sign in at{" "} auth.jmartgraphix.com, then return here.

Back to site
); } if (!user) { return (

Checking authentication…

); } return (
); }