clone-project-modal-content.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React, { useMemo, useState } from 'react'
  2. import {
  3. Modal,
  4. Alert,
  5. Button,
  6. FormGroup,
  7. ControlLabel,
  8. FormControl
  9. } from 'react-bootstrap'
  10. import PropTypes from 'prop-types'
  11. import { useTranslation } from 'react-i18next'
  12. function CloneProjectModalContent({
  13. cloneProject,
  14. projectName = '',
  15. error,
  16. cancel,
  17. inFlight
  18. }) {
  19. const { t } = useTranslation()
  20. const [clonedProjectName, setClonedProjectName] = useState(
  21. `${projectName} (Copy)`
  22. )
  23. const valid = useMemo(() => !!clonedProjectName, [clonedProjectName])
  24. function handleSubmit(event) {
  25. event.preventDefault()
  26. if (valid) {
  27. cloneProject(clonedProjectName)
  28. }
  29. }
  30. return (
  31. <>
  32. <Modal.Header closeButton>
  33. <Modal.Title>{t('copy_project')}</Modal.Title>
  34. </Modal.Header>
  35. <Modal.Body>
  36. <form id="clone-project-form" onSubmit={handleSubmit}>
  37. <FormGroup>
  38. <ControlLabel htmlFor="cloned-project-name">
  39. {t('new_name')}
  40. </ControlLabel>
  41. <FormControl
  42. id="cloned-project-name"
  43. type="text"
  44. placeholder="New Project Name"
  45. required
  46. value={clonedProjectName}
  47. onChange={event => setClonedProjectName(event.target.value)}
  48. />
  49. </FormGroup>
  50. </form>
  51. {error && (
  52. <Alert bsStyle="danger">
  53. {error.message || t('generic_something_went_wrong')}
  54. </Alert>
  55. )}
  56. </Modal.Body>
  57. <Modal.Footer>
  58. <Button type="button" disabled={inFlight} onClick={cancel}>
  59. {t('cancel')}
  60. </Button>
  61. <Button
  62. form="clone-project-form"
  63. type="submit"
  64. bsStyle="primary"
  65. disabled={inFlight || !valid}
  66. >
  67. {inFlight ? <span>{t('copying')}…</span> : <span>{t('copy')}</span>}
  68. </Button>
  69. </Modal.Footer>
  70. </>
  71. )
  72. }
  73. CloneProjectModalContent.propTypes = {
  74. cloneProject: PropTypes.func.isRequired,
  75. error: PropTypes.oneOfType([
  76. PropTypes.bool,
  77. PropTypes.shape({
  78. message: PropTypes.string
  79. })
  80. ]),
  81. cancel: PropTypes.func.isRequired,
  82. inFlight: PropTypes.bool.isRequired,
  83. projectName: PropTypes.string
  84. }
  85. export default CloneProjectModalContent