/* * Copyright (C) 2019 CZ.NIC z.s.p.o. (http://www.nic.cz/) * * This is free software, licensed under the GNU General Public License v3. * See /LICENSE for more information. */ import React, { useRef } from "react"; import PropTypes from "prop-types"; import { Portal } from "../utils/Portal"; import { useClickOutside } from "../utils/hooks"; import "./Modal.css"; Modal.propTypes = { /** Is modal shown value */ shown: PropTypes.bool.isRequired, /** Callback to manage modal visibility */ setShown: PropTypes.func.isRequired, scrollable: PropTypes.bool, /** Modal content use following: `ModalHeader`, `ModalBody`, `ModalFooter` */ children: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.node), PropTypes.node, ]).isRequired, }; export function Modal({ shown, setShown, scrollable, children, }) { const dialogRef = useRef(); useClickOutside(dialogRef, () => setShown(false)); return (
{children}
); } ModalHeader.propTypes = { setShown: PropTypes.func.isRequired, title: PropTypes.string.isRequired, }; export function ModalHeader({ setShown, title }) { return (
{title}
); } ModalBody.propTypes = { children: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.node), PropTypes.node, ]).isRequired, }; export function ModalBody({ children }) { return
{children}
; } ModalFooter.propTypes = { children: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.node), PropTypes.node, ]).isRequired, }; export function ModalFooter({ children }) { return (
{children}
); }