import React, { useCallback, useEffect, useState, } from 'react'; import assert from 'assert'; import { Lang } from '@growi/core'; import type { TemplateSummary } from '@growi/pluginkit/dist/v4'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { useSWRxTemplate, 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'); function constructTemplateId(templateSummary: TemplateSummary): string { const defaultTemplate = templateSummary.default; return `${defaultTemplate.pluginId ?? ''}_${defaultTemplate.id}`; } type TemplateRadioButtonProps = { templateSummary: TemplateSummary, onClick?: () => void, usersDefaultLang?: Lang, isSelected?: boolean, } const TemplateListGroupItem = ({ templateSummary, onClick, usersDefaultLang, isSelected, }: TemplateRadioButtonProps): JSX.Element => { const templateId = constructTemplateId(templateSummary); const locales = new Set(Object.values(templateSummary).map(s => s.locale)); const template = usersDefaultLang != null && usersDefaultLang in templateSummary ? templateSummary[usersDefaultLang] : templateSummary.default; assert(template.isValid); return (

{template.title}

{template.desc}

{ Array.from(locales).map(locale => ( {locale} ))}
); }; 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 [selectedTemplateSummary, setSelectedTemplateSummary] = useState(); const [selectedTemplateLocale, setSelectedTemplateLocale] = useState(); const { data: selectedTemplateMarkdown } = useSWRxTemplate(selectedTemplateSummary, selectedTemplateLocale); const { format } = useFormatter(); const submitHandler = useCallback((markdown?: string) => { if (templateModalStatus == null || markdown == null) { return; } if (templateModalStatus.onSubmit == null) { close(); return; } templateModalStatus.onSubmit(format(selectedTemplateMarkdown)); close(); }, [close, format, selectedTemplateMarkdown, templateModalStatus]); useEffect(() => { if (!templateModalStatus?.isOpened) { setSelectedTemplateSummary(undefined); } }, [templateModalStatus?.isOpened]); if (templateSummaries == null || templateModalStatus == null) { return <>; } return ( {t('template.modal_label.Select template')}
{ templateSummaries.map((templateSummary) => { const templateId = constructTemplateId(templateSummary); return ( setSelectedTemplateSummary(templateSummary)} isSelected={selectedTemplateSummary != null && constructTemplateId(selectedTemplateSummary) === templateId} /> ); }) }

{t('Preview')}

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