import React, { useState, FC } from 'react'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { useTranslation } from 'react-i18next'; import { apiPost } from '~/client/util/apiv1-client'; import { apiv3Post } from '~/client/util/apiv3-client'; import { usePageDeleteModal } from '~/stores/modal'; import { IDeleteSinglePageApiv1Result, IDeleteManyPageApiv3Result } from '~/interfaces/page'; import ApiErrorMessageList from './PageManagement/ApiErrorMessageList'; const deleteIconAndKey = { completely: { color: 'danger', icon: 'fire', translationKey: 'completely', }, temporary: { color: 'primary', icon: 'trash', translationKey: 'page', }, }; type Props = { isDeleteCompletelyModal: boolean, isAbleToDeleteCompletely: boolean, onClose?: () => void, } const PageDeleteModal: FC = (props: Props) => { const { t } = useTranslation(''); const { isDeleteCompletelyModal, isAbleToDeleteCompletely, } = props; const { data: deleteModalData, close: closeDeleteModal } = usePageDeleteModal(); const isOpened = deleteModalData?.isOpened ?? false; const [isDeleteRecursively, setIsDeleteRecursively] = useState(true); const [isDeleteCompletely, setIsDeleteCompletely] = useState(isDeleteCompletelyModal && isAbleToDeleteCompletely); const deleteMode = isDeleteCompletely ? 'completely' : 'temporary'; // eslint-disable-next-line @typescript-eslint/no-unused-vars const [errs, setErrs] = useState(null); function changeIsDeleteRecursivelyHandler() { setIsDeleteRecursively(!isDeleteRecursively); } function changeIsDeleteCompletelyHandler() { if (!isAbleToDeleteCompletely) { return; } setIsDeleteCompletely(!isDeleteCompletely); } async function deletePage() { if (deleteModalData == null || deleteModalData.pages == null) { return; } /* * When multiple pages */ if (deleteModalData.pages.length > 1) { try { const isRecursively = isDeleteRecursively === true ? true : undefined; const isCompletely = isDeleteCompletely === true ? true : undefined; const pageIdToRevisionIdMap = {}; deleteModalData.pages.forEach((p) => { pageIdToRevisionIdMap[p.pageId] = p.revisionId }); const { data } = await apiv3Post('/pages/delete', { pageIdToRevisionIdMap, isRecursively, isCompletely, }); if (deleteModalData.onDeleted != null) { deleteModalData.onDeleted(data.paths, data.isRecursively, data.isCompletely); } } catch (err) { setErrs([err]); } } /* * When single page */ else { try { const recursively = isDeleteRecursively === true ? true : undefined; const completely = isDeleteCompletely === true ? true : undefined; const page = deleteModalData.pages[0]; const { path, isRecursively, isCompletely } = await apiPost('/pages.remove', { page_id: page.pageId, revision_id: page.revisionId, recursively, completely, }) as IDeleteSinglePageApiv1Result; if (deleteModalData.onDeleted != null) { deleteModalData.onDeleted(path, isRecursively, isCompletely); } } catch (err) { setErrs([err]); } } } async function deleteButtonHandler() { await closeDeleteModal(); await deletePage(); } function renderDeleteRecursivelyForm() { return (
); } // DeleteCompletely is currently disabled // TODO1 : Retrive isAbleToDeleteCompleltly state everywhere in the system via swr. // Story: https://redmine.weseek.co.jp/issues/82222 // TODO2 : use toaster // TASK : https://redmine.weseek.co.jp/issues/82299 function renderDeleteCompletelyForm() { return (
{/* ↓↓ undo this comment out at https://redmine.weseek.co.jp/issues/82222 ↓↓ */} {/*
); } const renderPagePathsToDelete = () => { if (deleteModalData != null && deleteModalData.pages != null) { return deleteModalData.pages.map(page =>
{ page.path }
); } return <>; }; return ( { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }

{/* Todo: change the way to show path on modal when too many pages are selected */} {/* https://redmine.weseek.co.jp/issues/82787 */} {renderPagePathsToDelete()}
{renderDeleteRecursivelyForm()} {!isDeleteCompletelyModal && renderDeleteCompletelyForm()}
); }; export default PageDeleteModal;