import { redirect } from "next/navigation"; import type { ReactNode } from "react"; import { HireWizardProvider } from "@/components/hire/HireWizardContext"; import { AppShell } from "@/components/shell/AppShell"; import { currentUserId } from "@/lib/auth/session"; import { withUser } from "@/lib/db"; import { loadShellData } from "@/lib/shell-data"; export default async function AppLayout({ children }: { children: ReactNode }) { const userId = await currentUserId(); if (!userId) redirect("/login"); // Alles in *einer* Transaktion, weil nur dort der Sitzungskontext gilt — // und damit nebenbei auf einem einheitlichen Lesestand. Was dabei in wie // vielen Rundreisen gelesen wird, steht in lib/shell-data.ts. const data = await withUser(userId, (tx) => loadShellData(tx, userId)); // `data` ist null, wenn die Person angemeldet, aber nicht freigeschaltet // ist. Hier — und nicht im Proxy — fällt diese Entscheidung: der Proxy hat // keine Datenbankverbindung. Sie wird bei jedem Aufbau frisch gestellt, eine // entzogene Freischaltung wirkt also sofort statt erst mit dem nächsten // Sitzungstoken. Ohne den Grund in der Adresse stünde die Person vor einer // wortlosen Anmeldeseite und versuchte es endlos erneut. if (!data) redirect("/login?error=no_hr_access"); const userLabel = data.profile.full_name || data.profile.email || ""; return ( {children} ); }