Using Modals
History
In a previous era, src/components/Modal/Modal.jsx
would import from React USWDS's modal.
However, React USWDS decided to no longer support modals.
As a result, MilMove copied all the code from React USWDS' modal and placed it into src/components/MigratedModal/MigratedModal.jsx
.
Using Modal
src/components/Modal/Modal.jsx
should be used, and not src/components/MigratedModal/MigratedModal.jsx
.
At no point in time should folks be importing from MigratedModal
.
MyModal Example
import styles from "./MyModal.module.scss";
import Modal, {
ModalActions,
ModalClose,
ModalTitle,
connectModal,
} from "components/Modal/Modal";
// MyModal should also be exported by itself so that you can import it as is
// without the overlay and the modal container. This is useful for both testing
// and storybook.
export const MyModal = ({ onClose }) => {
return (
<Modal className={styles.whateverStylesYouWant}>
<ModalClose handleClick={() => onClose()} />
<ModalTitle>
<h4>My Modal</h4>
</ModalTitle>
My Modal Content
<ModalActions>
{/*There is usually another action button, but it has been left out of
this example since I wanted to highlight is how this button passes a
function that calls onClose as the onClick handler.*/}
<Button type="button" secondary onClick={() => onClose()}>
Back
</Button>
</ModalActions>
</Modal>
);
};
MyModal.propTypes = {
onCLose: PropTypes.func.isRequired,
};
// It is important to have this display name so that connectModal knows how to
// re-export the modal. This modal will then be imported as ConnectedMyModal.
MyModal.displayName = "MyModal";
export default connectModal(MyModal);
Using MyModal Example
import React, {useState} from 'React';
import ConnectedMyModal from './MyModal'
const ComponentThatUsesMyModal = () => {
const [myModalIsVisible, setMyModalIsVisible] = useState(false);
const handleOpenMyModal = () => {
setMyModalIsVisible(true)
}
const handleCloseMyModal = () => {
setMyModalIsVisible(false)
}
return (
<>
<Button type="button" onClick={() => handleOpenMyModal()}>
{/* The isOpen prop is passed down through Modal to Migrated modal and
determines whether to return the modal component or return null.*/}
<ConnectedMyModal isOpen={myModalIsVisible} onClose={handleCLoseMyModal}/>
</>
)
}
Testing MyModal
Imports for testing MyModal should work as follows.
import { MyModal } from "./MyModal";
Storybook MyModal
Imports for MyModal in Storybook should work as follows.
import { MyModal } from "./MyModal";