| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import type { FC } from 'react';
- import {
- Suspense, useState, useCallback,
- } from 'react';
- import nodePath from 'path';
- import { pathUtils } from '@growi/core/dist/utils';
- import { useTranslation } from 'next-i18next';
- import {
- Modal, ModalHeader, ModalBody, ModalFooter, Button,
- } from 'reactstrap';
- import SimpleBar from 'simplebar-react';
- import type { IPageForItem } from '~/interfaces/page';
- import { useTargetAndAncestors, useIsGuestUser, useIsReadOnlyUser } from '~/stores-universal/context';
- import { usePageSelectModal } from '~/stores/modal';
- import { useSWRxCurrentPage } from '~/stores/page';
- import { ItemsTree } from '../ItemsTree';
- import ItemsTreeContentSkeleton from '../ItemsTree/ItemsTreeContentSkeleton';
- import { usePagePathRenameHandler } from '../PageEditor/page-path-rename-utils';
- import { TreeItemForModal } from './TreeItemForModal';
- export const PageSelectModal: FC = () => {
- const {
- data: PageSelectModalData,
- close: closeModal,
- } = usePageSelectModal();
- const isOpened = PageSelectModalData?.isOpened ?? false;
- const [clickedParentPagePath, setClickedParentPagePath] = useState<string | null>(null);
- const { t } = useTranslation();
- const { data: isGuestUser } = useIsGuestUser();
- const { data: isReadOnlyUser } = useIsReadOnlyUser();
- const { data: targetAndAncestorsData } = useTargetAndAncestors();
- const { data: currentPage } = useSWRxCurrentPage();
- const pagePathRenameHandler = usePagePathRenameHandler(currentPage);
- const onClickTreeItem = useCallback((page: IPageForItem) => {
- const parentPagePath = page.path;
- if (parentPagePath == null) {
- return <></>;
- }
- setClickedParentPagePath(parentPagePath);
- }, []);
- const onClickCancel = useCallback(() => {
- setClickedParentPagePath(null);
- closeModal();
- }, [closeModal]);
- const onClickDone = useCallback(() => {
- if (clickedParentPagePath != null) {
- const currentPageTitle = nodePath.basename(currentPage?.path ?? '') || '/';
- const newPagePath = nodePath.resolve(clickedParentPagePath, currentPageTitle);
- pagePathRenameHandler(newPagePath);
- }
- closeModal();
- }, [clickedParentPagePath, closeModal, currentPage?.path, pagePathRenameHandler]);
- const parentPagePath = pathUtils.addTrailingSlash(nodePath.dirname(currentPage?.path ?? ''));
- const targetPathOrId = clickedParentPagePath || parentPagePath;
- const targetPath = clickedParentPagePath || parentPagePath;
- if (isGuestUser == null) {
- return <></>;
- }
- return (
- <Modal
- isOpen={isOpened}
- toggle={closeModal}
- centered
- >
- <ModalHeader toggle={closeModal}>{t('page_select_modal.select_page_location')}</ModalHeader>
- <ModalBody className="p-0">
- <Suspense fallback={<ItemsTreeContentSkeleton />}>
- <SimpleBar style={{ maxHeight: 'calc(85vh - 133px)' }}> {/* 133px = 63px(ModalHeader) + 70px(ModalFooter) */}
- <div className="p-3">
- <ItemsTree
- CustomTreeItem={TreeItemForModal}
- isEnableActions={!isGuestUser}
- isReadOnlyUser={!!isReadOnlyUser}
- targetPath={targetPath}
- targetPathOrId={targetPathOrId}
- targetAndAncestorsData={targetAndAncestorsData}
- onClickTreeItem={onClickTreeItem}
- />
- </div>
- </SimpleBar>
- </Suspense>
- </ModalBody>
- <ModalFooter>
- <Button color="secondary" onClick={onClickCancel}>{t('Cancel')}</Button>
- <Button color="primary" onClick={onClickDone}>{t('Done')}</Button>
- </ModalFooter>
- </Modal>
- );
- };
|