useModal is a React hook that simplifies modal state management. It provides visibility state and functions to show or hide modals.
Usage
import { useModal } from "@refinedev/core";
const MyComponent = () => {
const { visible, show, close } = useModal();
return (
<>
<button onClick={show}>Open Modal</button>
{visible && (
<div className="modal">
<h2>Modal Content</h2>
<button onClick={close}>Close</button>
</div>
)}
</>
);
};
Parameters
Return Values
Current visibility state of the modal.
true when the modal should be shown, false when hidden.Function to show the modal. Sets
visible to true.Function to hide the modal. Sets
visible to false.Examples
Basic Modal
import { useModal } from "@refinedev/core";
const BasicModal = () => {
const { visible, show, close } = useModal();
return (
<div>
<button onClick={show}>Open Modal</button>
{visible && (
<div className="modal-overlay">
<div className="modal-content">
<h2>Modal Title</h2>
<p>Modal content goes here</p>
<button onClick={close}>Close</button>
</div>
</div>
)}
</div>
);
};
Modal with Default Visible
import { useModal } from "@refinedev/core";
const WelcomeModal = () => {
const { visible, close } = useModal({ defaultVisible: true });
return (
visible && (
<div className="modal">
<h2>Welcome!</h2>
<p>Thank you for visiting our application.</p>
<button onClick={close}>Get Started</button>
</div>
)
);
};
Confirmation Dialog
import { useModal } from "@refinedev/core";
const DeleteButton = ({ onDelete }) => {
const { visible, show, close } = useModal();
const handleConfirm = () => {
onDelete();
close();
};
return (
<>
<button onClick={show}>Delete</button>
{visible && (
<div className="modal">
<h3>Confirm Deletion</h3>
<p>Are you sure you want to delete this item?</p>
<div>
<button onClick={handleConfirm}>Yes, Delete</button>
<button onClick={close}>Cancel</button>
</div>
</div>
)}
</>
);
};
Form Modal
import { useModal } from "@refinedev/core";
import { useState } from "react";
const CreateUserModal = () => {
const { visible, show, close } = useModal();
const [formData, setFormData] = useState({ name: "", email: "" });
const handleSubmit = (e) => {
e.preventDefault();
console.log("Submitting:", formData);
close();
};
return (
<>
<button onClick={show}>Create User</button>
{visible && (
<div className="modal">
<h2>Create New User</h2>
<form onSubmit={handleSubmit}>
<input
type="text"
placeholder="Name"
value={formData.name}
onChange={(e) =>
setFormData({ ...formData, name: e.target.value })
}
/>
<input
type="email"
placeholder="Email"
value={formData.email}
onChange={(e) =>
setFormData({ ...formData, email: e.target.value })
}
/>
<div>
<button type="submit">Create</button>
<button type="button" onClick={close}>
Cancel
</button>
</div>
</form>
</div>
)}
</>
);
};
Multiple Modals
import { useModal } from "@refinedev/core";
const MultiModalExample = () => {
const editModal = useModal();
const deleteModal = useModal();
return (
<div>
<button onClick={editModal.show}>Edit</button>
<button onClick={deleteModal.show}>Delete</button>
{editModal.visible && (
<div className="modal">
<h2>Edit Item</h2>
<button onClick={editModal.close}>Close</button>
</div>
)}
{deleteModal.visible && (
<div className="modal">
<h2>Delete Item</h2>
<button onClick={deleteModal.close}>Cancel</button>
</div>
)}
</div>
);
};
Modal with Overlay Click
import { useModal } from "@refinedev/core";
const ModalWithOverlay = () => {
const { visible, show, close } = useModal();
const handleOverlayClick = (e) => {
if (e.target === e.currentTarget) {
close();
}
};
return (
<>
<button onClick={show}>Open Modal</button>
{visible && (
<div className="modal-overlay" onClick={handleOverlayClick}>
<div className="modal-content">
<h2>Click outside to close</h2>
<p>Or use the button below</p>
<button onClick={close}>Close</button>
</div>
</div>
)}
</>
);
};
Modal with Escape Key
import { useModal } from "@refinedev/core";
import { useEffect } from "react";
const ModalWithEscape = () => {
const { visible, show, close } = useModal();
useEffect(() => {
const handleEscape = (e) => {
if (e.key === "Escape" && visible) {
close();
}
};
document.addEventListener("keydown", handleEscape);
return () => document.removeEventListener("keydown", handleEscape);
}, [visible, close]);
return (
<>
<button onClick={show}>Open Modal</button>
{visible && (
<div className="modal">
<h2>Press ESC to close</h2>
<button onClick={close}>Close</button>
</div>
)}
</>
);
};
API Reference
Type definitions:export type useModalProps = {
defaultVisible?: boolean;
};
export type useModalReturnType = {
visible: boolean;
show: () => void;
close: () => void;
};
This hook is framework-agnostic and works with any modal implementation. You can use it with popular UI libraries like Material-UI, Ant Design, or Chakra UI, or with custom modal components.
The
useModal hook only manages state. It doesn’t render any UI elements. You’ll need to implement the actual modal UI using your preferred styling approach.