"use client"; import { useEffect, useState } from "react"; import type { ReactNode } from "react"; type UserItem = { id: string; email: string; name?: string | null; status: string; role: string; emailVerified: boolean; createdAt: string; loginStats?: { attempts: number; lastAttempt: string | null; lockedUntil: string | null; }; }; type AdminUserApprovalsProps = { role?: string | null; }; export default function AdminUserApprovals({ role }: AdminUserApprovalsProps) { const [users, setUsers] = useState([]); const [allUsers, setAllUsers] = useState([]); const [error, setError] = useState(null); const [status, setStatus] = useState(null); const [modalOpen, setModalOpen] = useState(false); const [modalError, setModalError] = useState(null); const [modalStatus, setModalStatus] = useState(null); const [editingUser, setEditingUser] = useState(null); const loadPending = async () => { try { const response = await fetch("/api/users?status=PENDING"); if (!response.ok) { throw new Error("Nutzer konnten nicht geladen werden."); } setUsers(await response.json()); } catch (err) { setError((err as Error).message); } }; const loadAll = async () => { if (!role) return; try { const response = await fetch("/api/users"); if (!response.ok) { throw new Error("Übersicht konnte nicht geladen werden."); } setAllUsers(await response.json()); } catch (err) { setError((err as Error).message); } }; useEffect(() => { loadPending(); loadAll(); }, [role]); const isSuperAdmin = role === "SUPERADMIN"; const canManageUsers = role === "ADMIN" || role === "SUPERADMIN"; const approveUser = async (userId: string) => { setError(null); setStatus(null); const response = await fetch("/api/users", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId, status: "ACTIVE" }) }); if (!response.ok) { const data = await response.json(); setError(data.error || "Freischaltung fehlgeschlagen."); return; } setUsers((prev) => prev.filter((user) => user.id !== userId)); setStatus("Benutzer freigeschaltet."); loadAll(); }; const openCreate = () => { setEditingUser(null); setModalError(null); setModalStatus(null); setModalOpen(true); }; const openEdit = (user: UserItem) => { setEditingUser(user); setModalError(null); setModalStatus(null); setModalOpen(true); }; const closeModal = () => { setModalOpen(false); setEditingUser(null); }; const saveUser = async (event: React.FormEvent) => { event.preventDefault(); setModalError(null); setModalStatus(null); const formData = new FormData(event.currentTarget); const payload = { email: formData.get("email"), name: formData.get("name"), role: formData.get("role"), status: formData.get("status"), emailVerified: formData.get("emailVerified") === "on", password: formData.get("password") }; const response = await fetch("/api/users", { method: editingUser ? "PATCH" : "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify( editingUser ? { ...payload, userId: editingUser.id } : payload ) }); if (!response.ok) { const data = await response.json(); setModalError(data.error || "Speichern fehlgeschlagen."); return; } setModalStatus("Gespeichert."); loadPending(); loadAll(); setModalOpen(false); setEditingUser(null); }; const removeUser = async (user: UserItem, mode: "disable" | "delete" = "disable") => { if (mode === "delete" && !isSuperAdmin) { setError("Nur Superadmins können Benutzer endgültig löschen."); return; } const ok = window.confirm( mode === "delete" ? `Benutzer ${user.email} endgültig löschen? Alle Daten werden entfernt.` : `Benutzer ${user.email} deaktivieren?` ); if (!ok) return; const hardParam = mode === "delete" ? "&hard=true" : ""; const response = await fetch(`/api/users?id=${user.id}${hardParam}`, { method: "DELETE" }); if (!response.ok) { const data = await response.json(); setError(data.error || "Löschen fehlgeschlagen."); return; } setStatus(mode === "delete" ? "Benutzer gelöscht." : "Benutzer deaktiviert."); loadPending(); loadAll(); }; const resetLoginAttempts = async (user: UserItem) => { setError(null); setStatus(null); const response = await fetch("/api/users", { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId: user.id, resetLoginAttempts: true }) }); if (!response.ok) { const data = await response.json(); setError(data.error || "Zurücksetzen fehlgeschlagen."); return; } setStatus("Loginversuche zurückgesetzt."); loadAll(); }; const manageableUsers = isSuperAdmin ? allUsers : allUsers.filter((user) => user.role === "USER"); return (

Freischaltung

Neue Registrierungen

{error &&

{error}

} {status &&

{status}

} {users.length === 0 ? (

Keine offenen Registrierungen.

) : (
{users.map((user) => ( ))}
E-Mail Name Rolle Erstellt Aktion
{user.email} {user.name || "-"} {user.role} {new Date(user.createdAt).toLocaleDateString("de-DE")} approveUser(user.id)} >
)}
{canManageUsers && (

Übersicht

Alle Benutzer

{manageableUsers.length === 0 ? (

Keine Benutzer vorhanden.

) : (
{manageableUsers.map((user) => ( ))}
E-Mail Name Rolle Status Verifiziert Fehlversuche Letzter Versuch Gesperrt bis Erstellt Aktion
{user.email} {user.name || "-"} {user.role} {user.status} {user.emailVerified ? "Ja" : "Nein"} {user.loginStats?.attempts ?? 0} {user.loginStats?.lastAttempt ? new Date(user.loginStats.lastAttempt).toLocaleString("de-DE") : "-"} {user.loginStats?.lockedUntil ? new Date(user.loginStats.lockedUntil).toLocaleString("de-DE") : "-"} {new Date(user.createdAt).toLocaleDateString("de-DE")}
openEdit(user)} > {isSuperAdmin && ( resetLoginAttempts(user)} > )} removeUser(user, isSuperAdmin ? "delete" : "disable")} >
)}
)} {modalOpen && (

{editingUser ? "Benutzer bearbeiten" : "Benutzer anlegen"}

{isSuperAdmin ? ( ) : ( )}
{modalStatus && (

{modalStatus}

)} {modalError && (

{modalError}

)}
)}
); } function IconButton({ label, onClick, children }: { label: string; onClick: () => void; children: ReactNode; }) { return ( ); } function IconCheck() { return ( ); } function IconEdit() { return ( ); } function IconTrash() { return ( ); } function IconPlus() { return ( ); } function IconClose() { return ( ); } function IconUnlock() { return ( ); }