import React, { useCallback, useMemo } from 'react'; import { pathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody } from 'reactstrap'; import { useCreateTemplatePage } from '~/client/services/create-page'; import { toastError } from '~/client/util/toastr'; import type { TargetType, LabelType } from '~/interfaces/template'; type TemplateCardProps = { target: TargetType; label: LabelType; isPageCreating: boolean; onClickHandler: () => void; }; const TemplateCard: React.FC = ({ target, label, isPageCreating, onClickHandler, }) => { const { t } = useTranslation(); return (
{t(`template.${target}.label`)}

{label}

{t(`template.${target}.desc`)}

); }; type CreateTemplateModalProps = { path: string; isOpen: boolean; onClose: () => void; }; export const CreateTemplateModal: React.FC = ({ path, isOpen, onClose, }) => { const { t } = useTranslation(['translation', 'commons']); const { createTemplate, isCreating, isCreatable } = useCreateTemplatePage(); const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => { try { await createTemplate?.(label); onClose(); } catch (err) { toastError(t('toaster.create_failed', { target: path })); } }, [createTemplate, onClose, path, t]); // Memoize computed path const parentPath = useMemo(() => pathUtils.addTrailingSlash(path), [path]); // Memoize template card rendering function const renderTemplateCard = useCallback((target: TargetType, label: LabelType) => (
onClickTemplateButtonHandler(label)} />
), [isCreating, onClickTemplateButtonHandler]); return ( {(isCreatable && isOpen) && ( <> {t('template.modal_label.Create/Edit Template Page')}
{renderTemplateCard('children', '_template')} {renderTemplateCard('descendants', '__template')}
)}
); };