clone-project-modal.jsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import React, { memo, useCallback, useState } from 'react'
  2. import PropTypes from 'prop-types'
  3. import CloneProjectModalContent from './clone-project-modal-content'
  4. import OLModal from '@/features/ui/components/ol/ol-modal'
  5. function CloneProjectModal({
  6. show,
  7. handleHide,
  8. handleAfterCloned,
  9. projectId,
  10. projectName,
  11. projectTags,
  12. }) {
  13. const [inFlight, setInFlight] = useState(false)
  14. const onHide = useCallback(() => {
  15. if (!inFlight) {
  16. handleHide()
  17. }
  18. }, [handleHide, inFlight])
  19. return (
  20. <OLModal
  21. animation
  22. show={show}
  23. onHide={onHide}
  24. id="clone-project-modal"
  25. // backdrop="static" will disable closing the modal by clicking
  26. // outside of the modal element
  27. backdrop={inFlight ? 'static' : undefined}
  28. >
  29. <CloneProjectModalContent
  30. handleHide={onHide}
  31. inFlight={inFlight}
  32. setInFlight={setInFlight}
  33. handleAfterCloned={handleAfterCloned}
  34. projectId={projectId}
  35. projectName={projectName}
  36. projectTags={projectTags}
  37. />
  38. </OLModal>
  39. )
  40. }
  41. CloneProjectModal.propTypes = {
  42. handleHide: PropTypes.func.isRequired,
  43. show: PropTypes.bool.isRequired,
  44. handleAfterCloned: PropTypes.func.isRequired,
  45. projectId: PropTypes.string,
  46. projectName: PropTypes.string,
  47. projectTags: PropTypes.arrayOf(
  48. PropTypes.shape({
  49. _id: PropTypes.string.isRequired,
  50. name: PropTypes.string.isRequired,
  51. color: PropTypes.string,
  52. })
  53. ),
  54. }
  55. export default memo(CloneProjectModal)