<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
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js