Skip to main content
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

visible
boolean
Current visibility state of the modal. true when the modal should be shown, false when hidden.
show
() => void
Function to show the modal. Sets visible to true.
close
() => void
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>
  );
};
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>
  );
};
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>
      )}
    </>
  );
};
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.

Build docs developers (and LLMs) love