import { CloseButton } from "@headlessui/react"; import { LuCircleAlert, LuInfo, LuTriangleAlert } from "react-icons/lu"; import { m } from "@localizations/messages.js"; import { Button } from "@components/Button"; import Modal from "@components/Modal"; import { cx } from "@/cva.config"; type Variant = "danger" | "success" | "warning" | "info"; interface ConfirmDialogProps { open: boolean; onClose: () => void; title: string; description: React.ReactNode; variant?: Variant; confirmText?: string; cancelText?: string | null; onConfirm: () => void; isConfirming?: boolean; } const variantConfig = { danger: { icon: LuCircleAlert, iconClass: "text-red-600 dark:text-red-400", buttonTheme: "danger", }, success: { icon: LuCircleAlert, iconClass: "text-emerald-600 dark:text-emerald-400", buttonTheme: "primary", }, warning: { icon: LuTriangleAlert, iconClass: "text-amber-600 dark:text-amber-400", buttonTheme: "primary", }, info: { icon: LuInfo, iconClass: "text-slate-700 dark:text-slate-300", buttonTheme: "primary", }, } as Record< Variant, { icon: React.ElementType; iconClass: string; buttonTheme: "danger" | "primary" | "blank" | "light" | "lightDanger"; } >; export function ConfirmDialog({ open, onClose, title, description, variant = "info", confirmText = m.confirm(), cancelText = m.cancel(), onConfirm, isConfirming = false, }: ConfirmDialogProps) { const { icon: Icon, iconClass, buttonTheme } = variantConfig[variant]; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Escape") { e.stopPropagation(); onClose(); } }; return (
{cancelText && ( )}
); }