import React, { useCallback, useEffect, useState, } from 'react'; import assert from 'assert'; import { Lang } from '@growi/core'; import type { ITemplate } from '@growi/core/dist/interfaces/template'; import type { TemplateSummary } from '@growi/pluginkit/dist/interfaces/v4'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { useSWRxTemplates } from '~/features/templates/stores'; import { useTemplateModal } from '~/stores/modal'; import { usePersonalSettings } from '~/stores/personal-settings'; import { usePreviewOptions } from '~/stores/renderer'; import loggerFactory from '~/utils/logger'; import Preview from '../PageEditor/Preview'; import { useFormatter } from './use-formatter'; const logger = loggerFactory('growi:components:TemplateModal'); type TemplateRadioButtonProps = { templateSummary: TemplateSummary, onChange: (selectedTemplate: TemplateSummary) => void, usersDefaultLang?: Lang, isSelected?: boolean, } const TemplateRadioButton = ({ templateSummary, onChange, usersDefaultLang, isSelected, }: TemplateRadioButtonProps): JSX.Element => { const templateId = templateSummary.default.id; const radioButtonId = `rb-${templateId}`; const template = usersDefaultLang != null && usersDefaultLang in templateSummary ? templateSummary[usersDefaultLang] : templateSummary.default; assert(template.isValid); return (
onChange(templateSummary)} />
); }; export const TemplateModal = (): JSX.Element => { const { t } = useTranslation(['translation', 'commons']); const { data: templateModalStatus, close } = useTemplateModal(); const { data: personalSettingsInfo } = usePersonalSettings(); const { data: rendererOptions } = usePreviewOptions(); const { data: templateSummaries } = useSWRxTemplates(); const [selectedTemplateId, setSelectedTemplateId] = useState(); // const [selectedTemplateLocale, setSelectedTemplateLocale] = useState(); const { format } = useFormatter(); const submitHandler = useCallback((template?: ITemplate) => { if (templateModalStatus == null || selectedTemplateId == null) { return; } if (templateModalStatus.onSubmit == null || template == null) { close(); return; } // templateModalStatus.onSubmit(format(selectedTemplate)); close(); }, [close, selectedTemplateId, templateModalStatus]); useEffect(() => { if (!templateModalStatus?.isOpened) { setSelectedTemplateId(undefined); } }, [templateModalStatus?.isOpened]); if (templateSummaries == null || templateModalStatus == null) { return <>; } return ( {t('template.modal_label.Select template')}
{ Object.entries(templateSummaries).map(([templateId, templateSummary]) => ( setSelectedTemplateId(templateId)} isSelected={templateId === selectedTemplateId} /> )) }

{t('Preview')}

{ rendererOptions != null && selectedTemplateId != null && ( ) }
); };