xpaintdev / components /ConfirmModal.tsx
suisuyy
Initialize xpaintai project with core files and basic structure
763be49
import React from 'react';
import { CloseIcon } from './icons'; // Assuming CloseIcon can be used for a general "cancel" or is styled appropriately
interface ConfirmModalProps {
isOpen: boolean;
title: string;
message: string | React.ReactNode;
confirmText?: string;
cancelText?: string;
onConfirm: () => void;
onCancel: () => void;
isConfirmDestructive?: boolean; // Optional: to style confirm button differently for destructive actions
}
const ConfirmModal: React.FC<ConfirmModalProps> = ({
isOpen,
title,
message,
confirmText = 'Confirm',
cancelText = 'Cancel',
onConfirm,
onCancel,
isConfirmDestructive = false,
}) => {
if (!isOpen) return null;
return (
<div
className="fixed inset-0 bg-black bg-opacity-70 backdrop-blur-sm flex justify-center items-center z-[1100] p-4"
aria-modal="true"
role="dialog"
aria-labelledby="confirm-modal-title"
>
<div className="bg-white rounded-lg shadow-2xl p-6 w-full max-w-md transform transition-all">
<div className="flex justify-between items-center mb-4">
<h2 id="confirm-modal-title" className="text-lg font-semibold text-slate-800">
{title}
</h2>
<button
onClick={onCancel}
className="text-slate-400 hover:text-slate-600 transition-colors"
aria-label="Close confirmation dialog"
>
<CloseIcon className="w-5 h-5" />
</button>
</div>
<div className="mb-6 text-sm text-slate-600">
{typeof message === 'string' ? <p>{message}</p> : message}
</div>
<div className="flex flex-col sm:flex-row justify-end gap-3">
<button
onClick={onCancel}
className="px-4 py-2 bg-slate-200 text-slate-700 rounded-md hover:bg-slate-300 transition-colors disabled:opacity-50 disabled:cursor-not-allowed text-sm font-medium w-full sm:w-auto"
>
{cancelText}
</button>
<button
onClick={onConfirm}
className={`px-4 py-2 text-white rounded-md transition-colors disabled:opacity-50 disabled:cursor-not-allowed text-sm font-medium w-full sm:w-auto
${isConfirmDestructive ? 'bg-red-600 hover:bg-red-700 focus:ring-red-500'
: 'bg-blue-600 hover:bg-blue-700 focus:ring-blue-500'}
focus:ring-2 focus:ring-offset-2`}
>
{confirmText}
</button>
</div>
</div>
</div>
);
};
export default ConfirmModal;