import type React from 'react'; import { useCallback, useMemo } from 'react'; import { pathUtils } from '@growi/core/dist/utils'; import { useTranslation } from 'next-i18next'; import { Modal, ModalBody, ModalHeader } from 'reactstrap'; import { useCreateTemplatePage } from '~/client/services/create-page'; import { toastError } from '~/client/util/toastr'; import type { LabelType, TargetType } 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')}
{parentPath}
{t('template.modal_label.Create template under')}
{renderTemplateCard('children', '_template')} {renderTemplateCard('descendants', '__template')}
)}
); };