ConfirmationModal.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React from 'react';
  2. export interface ConfirmationModalProps {
  3. isOpen?: boolean;
  4. title?: React.ReactNode;
  5. onConfirm(): void;
  6. onCancel(): void;
  7. isConfirming?: boolean;
  8. }
  9. const ConfirmationModal: React.FC<ConfirmationModalProps> = ({
  10. isOpen,
  11. children,
  12. title,
  13. onCancel,
  14. onConfirm,
  15. isConfirming = false,
  16. }) => {
  17. if (!isOpen) return null;
  18. const cancelHandler = React.useCallback(() => {
  19. if (!isConfirming) {
  20. onCancel();
  21. }
  22. }, [isConfirming, onCancel]);
  23. return (
  24. <div className="modal is-active">
  25. <div
  26. className="modal-background"
  27. onClick={cancelHandler}
  28. aria-hidden="true"
  29. />
  30. <div className="modal-card">
  31. <header className="modal-card-head">
  32. <p className="modal-card-title">{title || 'Confirm the action'}</p>
  33. <button
  34. onClick={cancelHandler}
  35. type="button"
  36. className="delete"
  37. aria-label="close"
  38. disabled={isConfirming}
  39. />
  40. </header>
  41. <section className="modal-card-body">{children}</section>
  42. <footer className="modal-card-foot is-justify-content-flex-end">
  43. <button
  44. onClick={onConfirm}
  45. type="button"
  46. className="button is-danger"
  47. disabled={isConfirming}
  48. >
  49. Confirm
  50. </button>
  51. <button
  52. onClick={cancelHandler}
  53. type="button"
  54. className="button"
  55. disabled={isConfirming}
  56. >
  57. Cancel
  58. </button>
  59. </footer>
  60. </div>
  61. </div>
  62. );
  63. };
  64. export default ConfirmationModal;