import { MouseEvent, ReactNode, useCallback, useEffect, useRef } from "react"; import { createPortal } from "react-dom"; import { twJoin } from "tailwind-merge"; interface DialogProps { open: boolean; onClose: () => void; closeOnClickOutside?: boolean; children?: ReactNode; } export function Dialog({ open, onClose, children, closeOnClickOutside = true, }: DialogProps) { const dialogRef = useRef(null); useEffect( function handleShowOrCloseDialog() { const dialog = dialogRef.current; if (!dialog) return; if (open && !dialog.open) { dialog.showModal(); } else if (!open && dialog.open) { dialog.close(); } }, [open], ); const handleClick = useCallback( (e: MouseEvent) => { const dialog = dialogRef.current; if (!closeOnClickOutside || !dialog) return; const rect = dialog.getBoundingClientRect(); const clickedOutside = e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom; if (clickedOutside) { onClose(); } }, [closeOnClickOutside, onClose], ); return createPortal( {children} , document.body, ); }