import React, { cloneElement, useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import noScroll from 'no-scroll'; import { createPortal } from 'react-dom'; import { ReactComponent as IconClose } from '../../icons/close-sm.svg'; import { Button } from '../Button'; import { Card, CardBody, CardFooter, CardHeader } from '../Card'; const transitionMs = 350; export const Modal = ({ children, actions = [], hideOnBackdropClick = true, locked = false, isOpen = false, onClose, showCloseButton = true, title = null, ...props }) => { const [isVisible, setIsVisible] = useState(isOpen); const modalRef = useRef(null); useEffect(() => { if (isOpen) { setIsVisible(true); noScroll.on(); } return () => noScroll.off(); }, [isOpen]); const close = () => { setIsVisible(false); setTimeout(() => { onClose?.(); }, transitionMs); }; const handleBackdropClick = (ev) => { const isBackDropTarget = ev.target === ev.currentTarget; const isFocusOutside = !ev.currentTarget.contains(document.activeElement); // close only if backdrop is actually clicked if (isBackDropTarget && isFocusOutside && hideOnBackdropClick && !locked) { close(); } }; if (!isOpen) { return null; } return createPortal(