<div id="app"></div>
.button-wrapper {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.modal-wrapper {
position: fixed;
top: 0px;
left: 0px;
width: 100%;
height: 100vh;
background-color: lightgrey;
z-index: 999;
}
.align-center {
display: flex;
justify-content: center;
align-items: center;
}
.modal-container {
width: 50%;
height: 50vh;
border: 1px solid black;
border-radius: 4px;
background: white;
opacity: 1;
display: flex;
flex-direction: column;
padding: 16px;
justify-content: space-between;
align-items: flex-start;
flex-wrap: wrap;
}
.full-width {
width: 100%;
}
/*
* https://frontendeval.com/questions/modal-overlay
*
* Build a modal control and overlay
*/
function ModalOverlay(props) {
const { closeModal, acceptOffer } = props;
const handleOutsideClick = (e) => {
if (e?.target?.id === "modal-box-wrapper") {
closeModal(false);
}
};
const handleAcceptOffer = () => {
acceptOffer(true);
};
return (
<div
className="modal-wrapper align-center"
id="modal-box-wrapper"
onClick={handleOutsideClick}
>
<div className="modal-container " id="modal-box">
<div id="modal-close-button">
<button
onClick={() => {
closeModal(false);
}}
>
Close
</button>
</div>
<div>Click the button below to accept amazing offer!</div>
<div className="align-center full-width" id="modal-accept-button">
<button onClick={handleAcceptOffer}>Accept Offer</button>
</div>
</div>
</div>
);
}
const App = () => {
const [isModalOpen, setIsModalOpen] = React.useState(false);
const [isOfferAccepted, setIsOfferAccepted] = React.useState(false);
const handleAceeptOffer = (isAccepted) => {
if (isAccepted) {
setIsModalOpen(false);
setIsOfferAccepted(true);
} else {
setIsModalOpen(false);
}
};
return (
<div className="App">
{!isOfferAccepted && (
<div className="button-wrapper">
<button
onClick={() => {
setIsModalOpen(!isModalOpen);
}}
>
Show Offer
</button>
</div>
)}
{isModalOpen && (
<ModalOverlay
closeModal={setIsModalOpen}
acceptOffer={handleAceeptOffer}
/>
)}
{isOfferAccepted && (
<div className="button-wrapper">
<div>Offer Accepted</div>
</div>
)}
</div>
);
}
ReactDOM.render(<App />, document.getElementById('app'));
View Compiled
This Pen doesn't use any external CSS resources.