import { CloseOutlined } from '@ant-design/icons'; import { cn } from '@imphnen-frontend-service/utils'; import React, { useEffect, useMemo, useCallback } from 'react'; import { createPortal } from 'react-dom'; interface ModalProps { isOpen: boolean; onClose: () => void; children: React.ReactNode; className?: string; overlayClassName?: string; closeButtonClassName?: string; disableEscapeKeyDown?: boolean; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; } const Modal = ({ isOpen, onClose, children, className, overlayClassName, closeButtonClassName, disableEscapeKeyDown = false, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': ariaDescribedBy, }: ModalProps) => { const handleEscapeKey = useCallback( (event: KeyboardEvent) => { if (event.key === 'Escape' && isOpen && !disableEscapeKeyDown) { onClose(); } }, [isOpen, onClose, disableEscapeKeyDown] ); useEffect(() => { if (isOpen) { document.body.style.overflow = 'hidden'; window.addEventListener('keydown', handleEscapeKey); } else { document.body.style.overflow = ''; } return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', handleEscapeKey); }; }, [isOpen, handleEscapeKey]); const modalNode = useMemo(() => document.createElement('div'), []); useEffect(() => { document.body.appendChild(modalNode); return () => { document.body.removeChild(modalNode); }; }, [modalNode]); if (!isOpen) return null; return createPortal(
{children}
, modalNode ); }; interface ModalHeaderProps { className?: string; children: React.ReactNode; } const ModalHeader = ({ className, children }: ModalHeaderProps) => (
{children}
); interface ModalContentProps { className?: string; children: React.ReactNode; } const ModalContent = ({ className, children }: ModalContentProps) => (
{children}
); interface ModalFooterProps { className?: string; children: React.ReactNode; } const ModalFooter = ({ className, children }: ModalFooterProps) => (
{children}
); interface ModalTitleProps { className?: string; children: React.ReactNode; id?: string; } const ModalTitle = ({ className, children, id }: ModalTitleProps) => (

{children}

); interface ModalDescriptionProps { className?: string; children: React.ReactNode; id?: string; } const ModalDescription = ({ className, children, id, }: ModalDescriptionProps) => (

{children}

); Modal.Header = ModalHeader; Modal.Content = ModalContent; Modal.Footer = ModalFooter; Modal.Title = ModalTitle; Modal.Description = ModalDescription; export { Modal }; export type { ModalProps, ModalHeaderProps, ModalContentProps, ModalFooterProps, ModalTitleProps, ModalDescriptionProps, };