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.