import { BanIcon } from 'lucide-react'; import { LoaderFunctionArgs, Outlet, redirect, useLoaderData, } from 'react-router'; import Card from '~/components/Card'; import Footer from '~/components/Footer'; import Header from '~/components/Header'; import type { LoadContext } from '~/server'; import { Capabilities } from '~/server/web/roles'; // This loads the bare minimum for the application to function // So we know that if context fails to load then well, oops? export async function loader({ request, context, }: LoaderFunctionArgs) { try { const session = await context.sessions.auth(request); if (!session.has('api_key')) { // There is a session, but it's not valid return redirect('/login', { headers: { 'Set-Cookie': await context.sessions.destroy(session), }, }); } const check = await context.sessions.check(request, Capabilities.ui_access); return { config: context.hs.c, url: context.config.headscale.public_url ?? context.config.headscale.url, configAvailable: context.hs.readable(), debug: context.config.debug, user: session.get('user'), uiAccess: check, }; } catch { // No session, so we can just return return redirect('/login'); } } export default function Shell() { const data = useLoaderData(); return ( <>
{data.uiAccess ? ( ) : (
Access Denied
Your account does not have access to the UI. Please contact your administrator.
)}