Pada artikel kali ini saya akan berbagi tentang Modal Konfirmasi Menggunakan Promise Pada Aplikasi React. Apakah kalian pernah terpikir bisa menggunakan async await pada modal konfirmasi? Contohnya seperti berikut ini:
const isOk = await showConfirmation('Are you sure you want to submit?');
if (isOk) {
callApi();
}

Hanya perlu dipanggil pada level js dan modal akan muncul sehingga sangat praktis dan mudah untuk menggunakan fungsi tersebut berulang-ulang.
Teknik ini juga bisa digunakan pada kasus-kasus lainnya seperti:
- Snackbar/Toast
- Modal peringatan
Untuk mengetahui lebih lanjut bagaimana cara membuatnya, mari baca terus ya sampai selesai dan lebih baik lagi kalau sambil dipraktikkan.
Buat Project React
Kali ini saya akan membuat project React dengan menggunakan yarn dan vite.
yarn create vite

Bisa diisi sesuai dengan yang diinginkan, misalnya:
- Name:
react-confirmation-modal-promise-example. - Framework:
React. - Variant:
JavaScript.
Tambah Element Pada index.html
Buka index.html dan tambah 1 div di bawah element root.
<div id="portal-confirmation"></div>
Jadinya seperti berikut:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>React Confirmation Modal Promise Example</title>
</head>
<body>
<div id="root"></div>
<div id="portal-confirmation"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
Buat Helper ConfirmationPromise
Buat 3 files:
src/utils/ConfirmationPromise/ConfirmationPromise.css.src/utils/ConfirmationPromise/ConfirmationPromise.jsx.src/utils/ConfirmationPromise/index.js.
src/utils/ConfirmationPromise/ConfirmationPromise.css
.confirmation-modal {
position: fixed;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.4);
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
}
.confirmation-container {
background-color: white;
max-width: 500px;
width: 100%;
border-radius: 0.5rem;
padding: 0.25rem 1.5rem 1.5rem 1.5rem;
margin: 0 1rem;
}
.confirmation-action {
text-align: right;
}
.confirmation-button-cancel {
background-color: indianred;
}
src/utils/ConfirmationPromise/ConfirmationPromise.jsx
import ReactDOM from 'react-dom/client';
import './ConfirmationPromise.css';
const ConfirmationModal = ({ message, onResponse }) => {
const onOk = () => {
onResponse(true);
};
const onCancel = () => {
onResponse(false);
};
return (
<div className="confirmation-modal">
<div className="confirmation-container">
<h2>Confirmation</h2>
<div>{message}</div>
<br />
<div className="confirmation-action">
<button className="mr-2" onClick={onOk}>OK</button>
<button
className="confirmation-button-cancel"
onClick={onCancel}
>
Cancel
</button>
</div>
</div>
</div>
);
};
const showConfirmation = async (message) => {
const container = document.getElementById('portal-confirmation');
const root = ReactDOM.createRoot(container);
return await new Promise((resolve) => {
const onResponse = (response) => {
root.unmount();
resolve(response);
};
root.render(<ConfirmationModal message={message} onResponse={onResponse} />);
});
};
export default showConfirmation;
src/utils/ConfirmationPromise/index.js
export { default } from './ConfirmationPromise';
Bisa dilihat pada fungsi showConfirmation, di fungsi tersebut return sebuah Promise yang akan di resolve ketika user klik tombol OK atau Cancel sehingga kita bisa melakukan await pada saat memanggil fungsi tersebut.
Ubah App.jsx
Ubah file src/App.jsx seperti berikut:
import showConfirmation from './utils/ConfirmationPromise';
function App() {
const submit = async () => {
const response = await showConfirmation('Are you sure you want to submit?');
alert(`Response: ${response}`);
};
return (
<div>
<button onClick={submit}>
Show Confirmation
</button>
</div>
)
}
export default App;
Demo


Penutup
Untuk contoh codenya bisa dilihat pada GitHub Repository React Confirmation Modal Promise Example.
Terimakasih sudah membaca artikel Modal Konfirmasi Menggunakan Promise Pada Aplikasi React. Semoga artikel ini bisa bermanfaat bagi teman-teman.