import type { FC } from 'react'; import { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'next-i18next'; import { Modal, ModalBody, ModalFooter, ModalHeader } from 'reactstrap'; import { apiPost } from '~/client/util/apiv1-client'; import type { PutBackPageModalStatus } from '~/states/ui/modal/put-back-page'; import { usePutBackPageModalActions, usePutBackPageModalStatus, } from '~/states/ui/modal/put-back-page'; import { mutateAllPageInfo } from '~/stores/page'; import ApiErrorMessageList from '../PageManagement/ApiErrorMessageList'; type ApiError = { data?: string; }; type ApiResponse = { page: { path: string; }; }; type PutBackPageModalSubstanceProps = { pageDataToRevert: PutBackPageModalStatus & { page: NonNullable; }; closePutBackPageModal: () => void; }; const PutBackPageModalSubstance: FC = ({ pageDataToRevert, closePutBackPageModal, }) => { const { t } = useTranslation(); const { page } = pageDataToRevert; const { pageId, path } = page; const onPutBacked = pageDataToRevert.opts?.onPutBacked; const [errs, setErrs] = useState(null); const [targetPath, setTargetPath] = useState(null); const [isPutbackRecursively, setIsPutbackRecursively] = useState(true); const changeIsPutbackRecursivelyHandler = useCallback(() => { setIsPutbackRecursively(!isPutbackRecursively); }, [isPutbackRecursively]); const putbackPageButtonHandler = useCallback(async () => { setErrs(null); try { // control flag // If is it not true, Request value must be `null`. const recursively = isPutbackRecursively ? true : null; const response = await apiPost('/pages.revertRemove', { page_id: pageId, recursively, }); mutateAllPageInfo(); if (onPutBacked != null) { onPutBacked(response.page.path); } closePutBackPageModal(); } catch (err) { setTargetPath((err as ApiError).data ?? null); setErrs([err as ApiError]); } }, [pageId, isPutbackRecursively, onPutBacked, closePutBackPageModal]); const closeModalHandler = useCallback(() => { closePutBackPageModal(); setErrs(null); }, [closePutBackPageModal]); const headerContent = useMemo( () => ( <> {' '} {t('modal_putback.label.Put Back Page')} ), [t], ); const bodyContent = useMemo( () => ( <>
{t('modal_putback.label.Put Back Page')}:
{path}

{path} {t('modal_putback.help.recursively')}

), [t, path, isPutbackRecursively, changeIsPutbackRecursivelyHandler], ); const footerContent = useMemo( () => ( <> ), [errs, targetPath, putbackPageButtonHandler, t], ); return ( <> {headerContent} {bodyContent} {footerContent} ); }; const PutBackPageModal: FC = () => { const pageDataToRevert = usePutBackPageModalStatus(); const { close: closePutBackPageModal } = usePutBackPageModalActions(); const { isOpened, page } = pageDataToRevert; const closeModalHandler = useCallback(() => { closePutBackPageModal(); }, [closePutBackPageModal]); if (page == null) { return <>; } return ( {isOpened && ( )} ); }; export { PutBackPageModal };