"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Lock, RotateCcw, Trash2, Unlock } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { deleteUser, lockUser, resetFailedLoginAttempts, unlockUser, } from "../actions"; type UserActionResult = { ok: boolean; error?: string; }; async function runSupportAction( action: () => Promise, successMessage: string, router: ReturnType, ) { const result = await action(); if (!result.ok) { toast.error(result.error ?? "Aktion konnte nicht ausgeführt werden."); return; } toast.success(successMessage); router.refresh(); } export function UserSupportActions({ user, }: { user: { id: string; email: string; name: string; isLocked: boolean; failedLoginAttempts: number; }; }) { const router = useRouter(); const [isPending, startTransition] = useTransition(); return (
{user.isLocked ? ( ) : ( )}
); } function UserDeleteDialog({ user, }: { user: { id: string; email: string; name: string; }; }) { const router = useRouter(); const [open, setOpen] = useState(false); const [confirmationEmail, setConfirmationEmail] = useState(""); const [isPending, startTransition] = useTransition(); const canSubmit = confirmationEmail === user.email && !isPending; function onSubmit() { startTransition(async () => { const result = await deleteUser({ userId: user.id, confirmationEmail, }); if (!result.ok) { toast.error(result.error ?? "Benutzer konnte nicht gelöscht werden."); return; } toast.success("Benutzer wurde gelöscht."); setOpen(false); router.refresh(); }); } return ( Benutzer endgültig löschen Löscht nur das Benutzerkonto von {user.name}. Familie und Kinder bleiben erhalten.
setConfirmationEmail(event.target.value)} placeholder={user.email} autoComplete="off" />
); }