import PropTypes from "prop-types"; import React from "react"; class Modal extends React.Component { static propTypes = { title: PropTypes.string.isRequired, show: PropTypes.bool.isRequired, onSubmit: PropTypes.func.isRequired, onCancel: PropTypes.func.isRequired, }; static idCounter = 0; // Local, up-to-date copy of modal visibility for time between close and props update (to prevent duplicate close // triggers) visible = false; constructor() { super(); this.id = "modal-" + Modal.idCounter++; } componentDidMount() { this.visible = this.props.show; this.openOrCloseModal(); window["$"]("#" + this.id).on("hide.bs.modal", () => { if (this.visible) { this.props.onCancel(); } }); } componentDidUpdate() { this.visible = this.props.show; this.openOrCloseModal(); } onSubmit() { if (this.visible) { this.props.onSubmit(); this.visible = false; this.closeModal(); } } onCancel() { if (this.visible) { this.props.onCancel(); this.visible = false; this.closeModal(); } } openModal() { window["$"]("#" + this.id).modal("show"); } closeModal() { window["$"]("#" + this.id).modal("hide"); } openOrCloseModal() { if (this.visible) { this.openModal(); } else { this.closeModal(); } } render() { return ( ); } } export default Modal;