93 lines
2.5 KiB
TypeScript
93 lines
2.5 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
import {
|
|
AlertDialog,
|
|
AlertDialogAction,
|
|
AlertDialogCancel,
|
|
AlertDialogContent,
|
|
AlertDialogDescription,
|
|
AlertDialogFooter,
|
|
AlertDialogHeader,
|
|
AlertDialogTitle,
|
|
} from "@/components/ui/alert-dialog";
|
|
import { useToast } from "@/components/ui/use-toast";
|
|
import type { AdminUserData } from "@/lib/services/admin.service";
|
|
|
|
interface DeleteUserDialogProps {
|
|
user: AdminUserData;
|
|
open: boolean;
|
|
onOpenChange: (open: boolean) => void;
|
|
onSuccess: () => void;
|
|
}
|
|
|
|
export function DeleteUserDialog({
|
|
user,
|
|
open,
|
|
onOpenChange,
|
|
onSuccess,
|
|
}: DeleteUserDialogProps) {
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
const { toast } = useToast();
|
|
|
|
const handleDelete = async () => {
|
|
setIsLoading(true);
|
|
|
|
try {
|
|
const response = await fetch(`/api/admin/users/${user.id}`, {
|
|
method: "DELETE",
|
|
});
|
|
|
|
if (!response.ok) {
|
|
const data = await response.json();
|
|
throw new Error(data.error || "Erreur lors de la suppression");
|
|
}
|
|
|
|
toast({
|
|
title: "Succès",
|
|
description: "L'utilisateur a été supprimé",
|
|
});
|
|
|
|
onSuccess();
|
|
} catch (error) {
|
|
toast({
|
|
variant: "destructive",
|
|
title: "Erreur",
|
|
description: error instanceof Error ? error.message : "Une erreur est survenue",
|
|
});
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<AlertDialog open={open} onOpenChange={onOpenChange}>
|
|
<AlertDialogContent>
|
|
<AlertDialogHeader>
|
|
<AlertDialogTitle>Êtes-vous sûr?</AlertDialogTitle>
|
|
<AlertDialogDescription>
|
|
Vous allez supprimer l'utilisateur <strong>{user.email}</strong>.
|
|
<br />
|
|
Cette action est irréversible et supprimera également :
|
|
<ul className="list-disc list-inside mt-2">
|
|
<li>Sa configuration Komga</li>
|
|
<li>Ses préférences</li>
|
|
<li>Ses favoris ({user._count?.favorites || 0})</li>
|
|
</ul>
|
|
</AlertDialogDescription>
|
|
</AlertDialogHeader>
|
|
<AlertDialogFooter>
|
|
<AlertDialogCancel disabled={isLoading}>Annuler</AlertDialogCancel>
|
|
<AlertDialogAction
|
|
onClick={handleDelete}
|
|
disabled={isLoading}
|
|
className="bg-destructive/90 backdrop-blur-md text-destructive-foreground hover:bg-destructive/80"
|
|
>
|
|
{isLoading ? "Suppression..." : "Supprimer"}
|
|
</AlertDialogAction>
|
|
</AlertDialogFooter>
|
|
</AlertDialogContent>
|
|
</AlertDialog>
|
|
);
|
|
}
|
|
|