import React, { FC, useState, useEffect, MouseEventHandler } from "react"; import { createPortal } from "react-dom"; import { Modal as BsModal } from "bootstrap"; // Este componente es un react portal. No se va a montar adentro de el componente donde lo uses. // Cuando lo uses, va a montarse siempre en el mismo lugar, pero tenes acceso a todos sus eventos de todas formas. const Modal: FC = ({ children, accept, dismiss, acceptText = "Aceptar", dismissText = "Cancelar", title, buttons = true, staticBackdrop = false, }) => { // Mounting point const root = document.getElementById("modal-portal"); const [bsModal, setBsModal] = useState(null); useEffect(() => { const modalEl = document.getElementById("page-modal"); let modalTemp: null | BsModal = null; if (!modalEl) return; console.log("Effect run", { staticBackdrop }); if (staticBackdrop) { console.log({ modalEl }); modalEl.setAttribute("data-bs-backdrop", "static"); } if (!bsModal) { modalTemp = new BsModal(modalEl); setBsModal(modalTemp); } modalTemp?.show(); return () => { modalTemp?.hide(); modalEl?.removeAttribute("data-bs-backdrop"); }; }, []); const content = (
{title ? (
{title}
) : null}
{children}
{buttons && (dismiss || accept) && (
{dismiss && ( )} {accept && ( )}
)}
); if (!root) return null; return createPortal(content, root); }; interface ModalProps { title?: string; buttons?: boolean; dismiss?: MouseEventHandler; accept?: MouseEventHandler; dismissText?: string; acceptText?: string; staticBackdrop?: boolean; } export default Modal;