import React, { useCallback, useEffect, useMemo, useState } from 'react' import PropTypes from 'prop-types' import { cloneProject } from '../utils/api' import CloneProjectModalContent from './clone-project-modal-content' function CloneProjectModal({ show, handleHide, projectId, projectName = '', openProject, }) { const [inFlight, setInFlight] = useState(false) const [error, setError] = useState() const [clonedProjectName, setClonedProjectName] = useState('') // set the cloned project name when the modal opens useEffect(() => { if (show) { setClonedProjectName(`${projectName} (Copy)`) } }, [show, projectName]) // reset error when the modal is opened useEffect(() => { if (show) { setError(undefined) } }, [show]) // close the modal if not in flight const cancel = useCallback(() => { if (!inFlight) { handleHide() } }, [handleHide, inFlight]) // valid if the cloned project has a name const valid = useMemo(() => !!clonedProjectName, [clonedProjectName]) // form submission: clone the project if the name is valid const handleSubmit = event => { event.preventDefault() if (!valid) { return } setError(false) setInFlight(true) // clone the project cloneProject(projectId, clonedProjectName) .then(data => { // open the cloned project openProject(data.project_id) }) .catch(({ response, data }) => { if (response?.status === 400) { setError(data.message) } else { setError(true) } }) .finally(() => { setInFlight(false) }) } return ( ) } CloneProjectModal.propTypes = { handleHide: PropTypes.func.isRequired, projectId: PropTypes.string.isRequired, projectName: PropTypes.string, openProject: PropTypes.func.isRequired, show: PropTypes.bool.isRequired, } export default CloneProjectModal