import React, { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { withTranslation } from 'react-i18next'; import { withUnstatedContainers } from './UnstatedUtils'; import AppContainer from '../services/AppContainer'; import PageContainer from '../services/PageContainer'; import PagePathAutoComplete from './PagePathAutoComplete'; import ApiErrorMessage from './PageManagement/ApiErrorMessage'; const PageDuplicateModal = (props) => { const { t, appContainer, pageContainer } = props; const config = appContainer.getConfig(); const isReachable = config.isSearchServiceReachable; const { pageId, path } = pageContainer.state; const { crowi } = appContainer.config; const [pageNameInput, setPageNameInput] = useState(path); const [errorCode, setErrorCode] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [subordinatedPaths, setSubordinatedPaths] = useState([]); const [getSubordinatedError, setGetSuborinatedError] = useState(null); const [isDuplicateRecursively, setIsDuplicateRecursively] = useState(true); /** * change pageNameInput for PagePathAutoComplete * @param {string} value */ function ppacInputChangeHandler(value) { setPageNameInput(value); } /** * change pageNameInput * @param {string} value */ function inputChangeHandler(value) { setPageNameInput(value); } function changeIsDuplicateRecursivelyHandler() { setIsDuplicateRecursively(!isDuplicateRecursively); } async function getSubordinatedList() { try { const res = await appContainer.apiv3Get('/pages/subordinated-list', { path }); setSubordinatedPaths(res.data.resultPaths); } catch (err) { setGetSuborinatedError(t('modal_duplicate.label.Fail to get subordinated pages')); } } useEffect(() => { getSubordinatedList(); }, [props.isOpen]); async function duplicate() { try { setErrorCode(null); setErrorMessage(null); const res = await appContainer.apiv3Post('/pages/duplicate', { page_id: pageId, new_path: pageNameInput }); const { page } = res; window.location.href = encodeURI(`${page.path}?duplicated=${path}`); } catch (err) { setErrorCode(err.code); setErrorMessage(err.message); } } function ppacSubmitHandler() { duplicate(); } return ( { t('modal_duplicate.label.Duplicate page') }

{path}

{crowi.url}
{isReachable ? ( ) : ( inputChangeHandler(e.target.value)} required /> )}
    {isDuplicateRecursively && subordinatedPaths.map(duplicatedNewPath =>
  • {duplicatedNewPath}
  • )}
{getSubordinatedError}
); }; /** * Wrapper component for using unstated */ const PageDuplicateModallWrapper = withUnstatedContainers(PageDuplicateModal, [AppContainer, PageContainer]); PageDuplicateModal.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, }; export default withTranslation()(PageDuplicateModallWrapper);