From 7e05dc7a885cf562052461565376e174e6a9c962 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Wed, 28 Oct 2020 00:36:19 +0100 Subject: Migrate to Reactstrap for Modal implementation --- frontend/src/components/modals/Modal.js | 163 +++++++++----------------------- 1 file changed, 45 insertions(+), 118 deletions(-) (limited to 'frontend/src/components/modals/Modal.js') diff --git a/frontend/src/components/modals/Modal.js b/frontend/src/components/modals/Modal.js index 40656dc1..36bb498e 100644 --- a/frontend/src/components/modals/Modal.js +++ b/frontend/src/components/modals/Modal.js @@ -1,124 +1,51 @@ -import classNames from 'classnames' +import React, { useState, useEffect } from 'react' import PropTypes from 'prop-types' -import React from 'react' -import jQuery from '../../util/jquery' - -class Modal extends React.Component { - static propTypes = { - title: PropTypes.string.isRequired, - show: PropTypes.bool.isRequired, - onSubmit: PropTypes.func.isRequired, - onCancel: PropTypes.func.isRequired, - submitButtonType: PropTypes.string, - submitButtonText: PropTypes.string, - } - static defaultProps = { - submitButtonType: 'primary', - submitButtonText: 'Save', - } - static idCounter = 0 - - // Local, up-to-date copy of modal visibility for time between close event and a props update (to prevent duplicate - // 'close' triggers) - visible = false - - constructor(props) { - super(props) - this.id = 'modal-' + Modal.idCounter++ - } - - componentDidMount() { - this.visible = this.props.show - this.openOrCloseModal() - - // Trigger auto-focus - jQuery('#' + this.id) - .on('shown.bs.modal', function () { - jQuery(this).find('input').first().focus() - }) - .on('hide.bs.modal', () => { - if (this.visible) { - this.props.onCancel() - } - }) - .on('keydown', (e) => { - e.stopPropagation() - }) - } - - componentDidUpdate() { - if (this.visible !== this.props.show) { - 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() { - jQuery('#' + this.id).modal('show') - } - - closeModal() { - jQuery('#' + this.id).modal('hide') - } +import { Modal as RModal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap' + +function Modal({ children, title, show, onSubmit, onCancel, submitButtonType, submitButtonText }) { + const [modal, setModal] = useState(show) + + useEffect(() => setModal(show), [show]) + + const toggle = () => setModal(!modal) + const cancel = () => { + toggle() + onCancel() + } + const submit = () => { + toggle() + onSubmit() + } + + return ( + + {title} + {children} + + + + + + ) +} - openOrCloseModal() { - if (this.visible) { - this.openModal() - } else { - this.closeModal() - } - } +Modal.propTypes = { + title: PropTypes.string.isRequired, + show: PropTypes.bool.isRequired, + onSubmit: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, + submitButtonType: PropTypes.string, + submitButtonText: PropTypes.string, +} - render() { - return ( - - ) - } +Modal.defaultProps = { + submitButtonType: 'primary', + submitButtonText: 'Save', + show: false, } export default Modal -- cgit v1.2.3