// frontend\src\components\Modal.tsx import type { ReactNode } from 'react' import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react' import { CheckIcon, ExclamationTriangleIcon, XMarkIcon, } from '@heroicons/react/24/outline' type ModalVariant = | 'success-single' | 'success-wide' | 'alert' | 'alert-dismiss' | 'alert-gray-footer' | 'alert-left-buttons' type ModalProps = { open: boolean setOpen: (open: boolean) => void variant?: ModalVariant title?: string description?: string confirmText?: string cancelText?: string onConfirm?: () => void children?: ReactNode panelClassName?: string zIndexClassName?: string } function classNames(...classes: Array) { return classes.filter(Boolean).join(' ') } export default function Modal({ open, setOpen, variant = 'success-single', title, description, confirmText, cancelText = 'Cancel', onConfirm, children, panelClassName, zIndexClassName = 'z-10', }: ModalProps) { const isSuccess = variant === 'success-single' || variant === 'success-wide' const isGrayFooter = variant === 'alert-gray-footer' const isDismiss = variant === 'alert-dismiss' const isLeftButtons = variant === 'alert-left-buttons' const isWideSuccess = variant === 'success-wide' const Icon = isSuccess ? CheckIcon : ExclamationTriangleIcon const resolvedTitle = title ?? (isSuccess ? 'Payment successful' : 'Deactivate account') const resolvedDescription = description ?? (isSuccess ? 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore.' : 'Are you sure you want to deactivate your account? All of your data will be permanently removed from our servers forever. This action cannot be undone.') const resolvedConfirmText = confirmText ?? (isSuccess ? 'Go back to dashboard' : 'Deactivate') function handleConfirm() { onConfirm?.() setOpen(false) } if (children) { return (
{children}
) } if (isGrayFooter) { return (
{resolvedTitle}

{resolvedDescription}

) } return (
{isDismiss && (
)}
{resolvedTitle}

{resolvedDescription}

{variant === 'success-single' && (
)} {variant === 'success-wide' && (
)} {!isSuccess && (
)}
) }