Modal.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { Dialog, Transition } from '@headlessui/react'
  2. import { Dispatch, Fragment, SetStateAction } from 'react'
  3. import CloseIcon from '../icons/CloseIcon'
  4. import Spinner from './Spinner'
  5. const Modal: React.FC<{
  6. isModalOpen: boolean
  7. setIsModalOpen: Dispatch<SetStateAction<boolean>>
  8. closeModal: () => void
  9. changes: any
  10. handleSendProposalButtonClick: () => void
  11. isSendProposalButtonLoading: boolean
  12. }> = ({
  13. isModalOpen,
  14. setIsModalOpen,
  15. closeModal,
  16. changes,
  17. handleSendProposalButtonClick,
  18. isSendProposalButtonLoading,
  19. }) => {
  20. return (
  21. <Transition appear show={isModalOpen} as={Fragment}>
  22. <Dialog
  23. as="div"
  24. className="relative z-10"
  25. onClose={() => setIsModalOpen(false)}
  26. >
  27. <Transition.Child
  28. as={Fragment}
  29. enter="ease-out duration-300"
  30. enterFrom="opacity-0"
  31. enterTo="opacity-100"
  32. leave="ease-in duration-200"
  33. leaveFrom="opacity-100"
  34. leaveTo="opacity-0"
  35. >
  36. <div className="fixed inset-0 bg-black bg-opacity-50" />
  37. </Transition.Child>
  38. <div className="fixed inset-0 overflow-y-auto">
  39. <div className="flex min-h-full items-center justify-center p-4 text-center">
  40. <Transition.Child
  41. as={Fragment}
  42. enter="ease-out duration-300"
  43. enterFrom="opacity-0 scale-95"
  44. enterTo="opacity-100 scale-100"
  45. leave="ease-in duration-200"
  46. leaveFrom="opacity-100 scale-100"
  47. leaveTo="opacity-0 scale-95"
  48. >
  49. <Dialog.Panel className="diaglogPanel">
  50. <button className="diaglogClose" onClick={closeModal}>
  51. <span className="mr-3">close</span> <CloseIcon />
  52. </button>
  53. <div className="max-w-full">
  54. <Dialog.Title as="h3" className="diaglogTitle">
  55. Proposed Changes
  56. </Dialog.Title>
  57. {!changes ? (
  58. <p className="mb-8 leading-6 ">No proposed changes.</p>
  59. ) : (
  60. Object.keys(changes).map((key) => {
  61. if (changes[key].prev !== changes[key].new) {
  62. return (
  63. <div
  64. key={key}
  65. className="flex items-center justify-between pb-4"
  66. >
  67. <span className="pr-4 text-left font-bold">
  68. {key}
  69. </span>
  70. <span className="mr-2">
  71. {changes[key].prev} &rarr; {changes[key].new}
  72. </span>
  73. </div>
  74. )
  75. }
  76. })
  77. )}
  78. <button
  79. className="action-btn text-base "
  80. onClick={handleSendProposalButtonClick}
  81. disabled={!changes}
  82. >
  83. {isSendProposalButtonLoading ? (
  84. <Spinner />
  85. ) : (
  86. 'Send Proposal'
  87. )}
  88. </button>
  89. </div>
  90. </Dialog.Panel>
  91. </Transition.Child>
  92. </div>
  93. </div>
  94. </Dialog>
  95. </Transition>
  96. )
  97. }
  98. export default Modal