Organize/components/confirm-delete-dialog.tsx

58 lines
1.3 KiB
TypeScript

"use client";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
export function ConfirmDeleteDialog({
open,
onOpenChange,
title,
description,
confirmLabel = "Delete",
onConfirm,
}: {
open: boolean;
onOpenChange: (open: boolean) => void;
title: string;
description: string;
confirmLabel?: string;
onConfirm: () => void | Promise<void>;
}) {
const [pending, setPending] = useState(false);
async function handleConfirm() {
setPending(true);
await onConfirm();
setPending(false);
onOpenChange(false);
}
return (
<Dialog open={open} onOpenChange={(next) => !pending && onOpenChange(next)}>
<DialogContent>
<DialogHeader>
<DialogTitle>{title}</DialogTitle>
<DialogDescription>{description}</DialogDescription>
</DialogHeader>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)} disabled={pending}>
Cancel
</Button>
<Button variant="destructive" onClick={handleConfirm} disabled={pending}>
{pending ? "Deleting…" : confirmLabel}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}