import { ArrowLeft, ExternalLink, LockKeyhole, LogOut } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { AppHeader } from "@/components/layout/app-header"; import { AppShell } from "@/components/layout/app-shell"; import { AppSidebar } from "@/components/layout/app-sidebar"; import { Container } from "@/components/layout/container"; import { MotionFade } from "@/components/motion-fade"; import { ThemeToggle } from "@/components/theme-toggle"; import { getLocalizedPath } from "@/lib/locale"; import { AppCard } from "@/components/ui/app-card"; import { Button } from "@/components/ui/button"; import { CardContent, CardDescription, CardHeader } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { clearAdminSessionCookie, getAdminLockState, isAdminAuthConfigured, isAdminAuthenticated, isPasswordValid, registerFailedAdminAttempt, resetAdminFailedAttempts, setAdminSessionCookie, } from "@/lib/admin-auth"; import { getMaintenanceMode } from "@/lib/app-config"; import { getRootNavigation } from "@/lib/root-navigation"; type RootPageProps = { searchParams?: { error?: string; }; }; export const dynamic = "force-dynamic"; const copy = { title: "Uebersicht", subtitle: "Interner Bereich fuer Kennzahlen und zentrale Navigation.", overview: "Uebersicht", maintenance: "Wartungsmodus", maintenanceTitle: "Wartungsmodus", maintenanceVisitorsClosed: "Website fuer Besucher geschlossen", maintenanceDescription: "Wenn aktiv, werden alle Seiten auf die Coming Soon Seite weitergeleitet.", maintenanceOpen: "Website fuer Besucher offen", maintenanceAction: "Zur Wartungsseite", uiKitTitle: "UI Kit", uiKitDescription: "Globale Referenz fuer Cards, Buttons, Inputs und Surface Levels.", uiKitAction: "Zur UI Kit", loginTitle: "Root Login", loginText: "Nur autorisierte Nutzer duerfen diesen Bereich verwenden.", passwordLabel: "Passwort", loginButton: "Einloggen", invalidLogin: "Falsches Passwort.", lockedLogin: "Zu viele Fehlversuche. Bitte spaeter erneut versuchen.", configMissing: "ADMIN_PASSWORD und ADMIN_AUTH_SECRET fehlen in env.", basicAuthMissing: "ROOT_BASIC_AUTH_USER und ROOT_BASIC_AUTH_PASS fehlen in env.", logout: "Ausloggen", backToSite: "Zur Website", uiKit: "UI Kit", }; export default async function RootPage({ searchParams }: RootPageProps) { const authConfigured = isAdminAuthConfigured(); const basicConfigured = Boolean( process.env.ROOT_BASIC_AUTH_USER && process.env.ROOT_BASIC_AUTH_PASS, ); const authenticated = isAdminAuthenticated(); const lockState = getAdminLockState(); const maintenanceEnabled = authenticated ? await getMaintenanceMode() : false; async function loginAction(formData: FormData) { "use server"; const password = String(formData.get("password") ?? ""); const currentLockState = getAdminLockState(); if (currentLockState.locked) { redirect("/root?error=locked"); } if (!isAdminAuthConfigured() || !isPasswordValid(password)) { const failState = registerFailedAdminAttempt(); if (failState.locked) { redirect("/root?error=locked"); } redirect("/root?error=invalid"); } resetAdminFailedAttempts(); setAdminSessionCookie(); redirect("/root"); } async function logoutAction() { "use server"; clearAdminSessionCookie(); redirect("/root"); } if (!authenticated) { return (

{copy.loginTitle}

{copy.loginText}
{!authConfigured ? (

{copy.configMissing}

) : null} {!basicConfigured ? (

{copy.basicAuthMissing}

) : null} {searchParams?.error === "invalid" ? (

{copy.invalidLogin}

) : null} {searchParams?.error === "locked" || lockState.locked ? (

{copy.lockedLogin}

) : null}
); } const sidebarItems = getRootNavigation(copy, "overview"); return (
} /> } header={ {copy.maintenanceVisitorsClosed} ) : null } /> } >
{copy.maintenanceTitle}

{maintenanceEnabled ? copy.maintenanceVisitorsClosed : copy.maintenanceOpen}

{copy.maintenanceDescription}

{copy.uiKitTitle}

{copy.uiKitTitle}

{copy.uiKitDescription}

); }