"use client"; import { useEffect, useRef } from "react"; import { X } from "lucide-react"; import { cn } from "@/app/_utils/cn"; import { Button } from "./Button"; interface ModalProps { isOpen: boolean; onClose: () => void; title: string; children: React.ReactNode; size?: "sm" | "md" | "lg" | "xl"; showCloseButton?: boolean; preventCloseOnClickOutside?: boolean; } export function Modal({ isOpen, onClose, title, children, size = "md", showCloseButton = true, preventCloseOnClickOutside = false, }: ModalProps) { const modalRef = useRef(null); useEffect(() => { const handleEscape = (e: KeyboardEvent) => { if (e.key === "Escape") { onClose(); } }; if (isOpen) { document.addEventListener("keydown", handleEscape); document.body.style.overflow = "hidden"; } return () => { document.removeEventListener("keydown", handleEscape); document.body.style.overflow = "unset"; }; }, [isOpen, onClose]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( modalRef.current && !modalRef.current.contains(event.target as Node) && !preventCloseOnClickOutside ) { const target = event.target as Element; const isClickingOnModal = target.closest('[data-modal="true"]'); const isClickingOnBackdrop = target.classList.contains("modal-backdrop"); if (isClickingOnBackdrop) { onClose(); } } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen, onClose, preventCloseOnClickOutside]); if (!isOpen) return null; const sizeClasses = { sm: "max-w-md", md: "max-w-lg", lg: "max-w-2xl", xl: "max-w-4xl", }; return (

{title}

{showCloseButton && ( )}
{children}
); }