import React, { useState, useEffect, useCallback } 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 ApiErrorMessageList from './PageManagement/ApiErrorMessageList'; const PageRenameModal = (props) => { const { t, appContainer, pageContainer, } = props; const { path } = pageContainer.state; const { crowi } = appContainer.config; const [pageNameInput, setPageNameInput] = useState(path); const [errs, setErrs] = useState(null); const [isRenameRecursively, SetIsRenameRecursively] = useState(true); const [isRenameRedirect, SetIsRenameRedirect] = useState(false); const [isRenameMetadata, SetIsRenameMetadata] = useState(false); const [subordinatedPaths, setSubordinatedPaths] = useState([]); const [getSubordinatedError, setGetSuborinatedError] = useState(null); const getSubordinatedList = useCallback(async() => { try { const res = await appContainer.apiv3Get('/pages/subordinated-list', { path }); setSubordinatedPaths(res.data.resultPaths); } catch (err) { setGetSuborinatedError(t('modal_rename.label.Fail to get subordinated pages')); } }, [appContainer, path, t]); useEffect(() => { if (props.isOpen) { getSubordinatedList(); } }, [props.isOpen, getSubordinatedList]); function changeIsRenameRecursivelyHandler() { SetIsRenameRecursively(!isRenameRecursively); } function changeIsRenameRedirectHandler() { SetIsRenameRedirect(!isRenameRedirect); } function changeIsRenameMetadataHandler() { SetIsRenameMetadata(!isRenameMetadata); } /** * change pageNameInput * @param {string} value */ function inputChangeHandler(value) { setPageNameInput(value); } async function rename() { setErrs(null); try { const response = await pageContainer.rename( pageNameInput, isRenameRecursively, isRenameRedirect, isRenameMetadata, ); const { page } = response.data; const url = new URL(page.path, 'https://dummy'); url.searchParams.append('renamedFrom', path); if (isRenameRedirect) { url.searchParams.append('withRedirect', true); } window.location.href = `${url.pathname}${url.search}`; } catch (err) { setErrs(err); } } return ( { t('modal_rename.label.Move/Rename page') }

{ path }

{crowi.url}
{ e.preventDefault(); rename() }}> inputChangeHandler(e.target.value)} required />
{isRenameRecursively && subordinatedPaths.map(renamedNewPath =>
  • {renamedNewPath}
  • ) }
    {getSubordinatedError}
    ); }; /** * Wrapper component for using unstated */ const PageRenameModalWrapper = withUnstatedContainers(PageRenameModal, [AppContainer, PageContainer]); PageRenameModal.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, pageContainer: PropTypes.instanceOf(PageContainer).isRequired, isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func.isRequired, path: PropTypes.string.isRequired, }; export default withTranslation()(PageRenameModalWrapper);