import {
ExternalLink,
FolderKanban,
Globe2,
ImageIcon,
LockKeyhole,
ShieldAlert,
Shapes,
} from "lucide-react";
import Link from "next/link";
import { redirect } from "next/navigation";
import { Container } from "@/components/layout/container";
import { MotionFade } from "@/components/motion-fade";
import { DashboardCard } from "@/components/dashboard/dashboard-card";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { Badge, type BadgeProps } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import {
clearAdminSessionCookie,
getAdminLockState,
isAdminAuthConfigured,
isAdminAuthenticated,
isPasswordValid,
registerFailedAdminAttempt,
resetAdminFailedAttempts,
setAdminSessionCookie,
} from "@/lib/admin-auth";
import { getMaintenanceMode } from "@/lib/app-config";
import { getAdminMediaAssets } from "@/lib/media";
import {
getAdminPortfolioCategories,
getAdminPortfolioProjects,
} from "@/lib/portfolio";
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",
maintenanceVisitorsShort: "Besucher gesperrt",
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",
media: "Media",
siteSettings: "SEO",
portfolio: "Portfolio",
portfolioTitle: "Portfolio",
portfolioDescription: "Kategorien, Projekte, Abschnitte und Dateien verwalten.",
portfolioAction: "Zum Portfolio",
mediaTitle: "Media Library",
mediaDescription: "Uploads, externe URLs und Verwendungsorte zentral verwalten.",
mediaAction: "Zur Media Library",
siteSettingsTitle: "SEO",
siteSettingsDescription: "Favicon, Site Name, Description, Subhead und globale SEO Defaults verwalten.",
siteSettingsAction: "Zu SEO",
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",
tableTitle: "Bereiche",
tableDescription: "Direkter Zugriff auf alle Verwaltungsbereiche mit aktuellem Status.",
tableSection: "Bereich",
tableSummary: "Zusammenfassung",
tableStatus: "Status",
tableAction: "Aktion",
maintenanceStatusOn: "Aktiv",
maintenanceStatusOff: "Inaktiv",
authStatusOk: "Bereit",
authStatusWarning: "Pruefen",
authCard: "Root Zugang",
authDescription: "Admin Passwort und Session Signatur sind gesetzt.",
authDescriptionWarning: "Eine oder mehrere Root Variablen fehlen und sollten geprueft werden.",
mediaCountDescription: "Verfuegbare Dateien fuer Portfolio und Inhalte.",
projectCountDescription: "Gespeicherte Portfolio Projekte im System.",
categoryCountDescription: "Portfolio Kategorien mit eigener Sortierung.",
systemStatusTitle: "Systemstatus",
systemStatusDescription: "Technischer Zustand des Root Bereichs und der wichtigsten Inhaltsbereiche.",
maintenanceLabel: "Wartung",
contentLabel: "Inhalte",
contentDescription: "Portfolio, Media und Kategorien sind direkt aus diesem Bereich erreichbar.",
publishedProjects: "Veroeffentlicht",
totalProjects: "Projekte",
totalCategories: "Kategorien",
totalMedia: "Dateien",
};
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();
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.configMissing}
{copy.basicAuthMissing}
{copy.invalidLogin}
{copy.lockedLogin}
{copy.authCard}
{authHealthy ? copy.authDescription : copy.authDescriptionWarning}
{copy.contentDescription}