import {MouseEventHandler, useCallback, useEffect} from 'react'; import {createPortal} from 'react-dom'; import {__} from '@wordpress/i18n'; import {ExitIcon} from '@givewp/components/AdminUI/Icons'; import './style.scss'; export interface ModalProps { children: JSX.Element | JSX.Element[]; title: string; isOpen?: boolean; icon?: JSX.Element | JSX.Element[]; insertInto?: string; handleClose?: MouseEventHandler; showHeader?: boolean; showCloseIcon?: boolean; wrapperClassName?: string; } export default function Modal({ title, icon, children, insertInto, handleClose, isOpen = true, showHeader = true, showCloseIcon = true, wrapperClassName = '', }: ModalProps) { // ESC key closes modal const closeModal = useCallback((e) => { if (e.keyCode === 27 && typeof handleClose === 'function') { handleClose(e); } }, []); useEffect(() => { document.addEventListener('keydown', closeModal, false); return () => { document.removeEventListener('keydown', closeModal, false); }; }, []); useEffect(() => { if (isOpen) { document.body.classList.add('modalDialog-open'); } else { document.body.classList.remove('modalDialog-open'); } return () => { document.body.classList.remove('modalDialog-open'); }; }, [isOpen]); if (!isOpen) return null; return createPortal(
{showHeader ? (
{icon &&
{icon}
} {title} {showCloseIcon && handleClose && ( )}
) : ( <> {showCloseIcon && handleClose && ( )} {icon &&
{icon}
} )}
{children}
, insertInto ? document.querySelector(insertInto) : document.body ); }