|
@@ -1,6 +1,8 @@
|
|
|
-import React, { useCallback, useState } from 'react';
|
|
|
|
|
|
|
+import React, {
|
|
|
|
|
+ useCallback, useEffect, useState,
|
|
|
|
|
+} from 'react';
|
|
|
|
|
|
|
|
-import { ITemplate } from '@growi/core';
|
|
|
|
|
|
|
+import type { ITemplate } from '@growi/core/dist/interfaces/template';
|
|
|
import { useTranslation } from 'next-i18next';
|
|
import { useTranslation } from 'next-i18next';
|
|
|
import {
|
|
import {
|
|
|
Modal,
|
|
Modal,
|
|
@@ -12,8 +14,13 @@ import {
|
|
|
import { useTemplateModal } from '~/stores/modal';
|
|
import { useTemplateModal } from '~/stores/modal';
|
|
|
import { usePreviewOptions } from '~/stores/renderer';
|
|
import { usePreviewOptions } from '~/stores/renderer';
|
|
|
import { useTemplates } from '~/stores/template';
|
|
import { useTemplates } from '~/stores/template';
|
|
|
|
|
+import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
|
|
-import Preview from './PageEditor/Preview';
|
|
|
|
|
|
|
+import Preview from '../PageEditor/Preview';
|
|
|
|
|
+
|
|
|
|
|
+import { useFormatter } from './use-formatter';
|
|
|
|
|
+
|
|
|
|
|
+const logger = loggerFactory('growi:components:TemplateModal');
|
|
|
|
|
|
|
|
|
|
|
|
|
type TemplateRadioButtonProps = {
|
|
type TemplateRadioButtonProps = {
|
|
@@ -44,6 +51,7 @@ const TemplateRadioButton = ({ template, onChange, isSelected }: TemplateRadioBu
|
|
|
export const TemplateModal = (): JSX.Element => {
|
|
export const TemplateModal = (): JSX.Element => {
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
|
|
|
|
|
|
|
|
+
|
|
|
const { data: templateModalStatus, close } = useTemplateModal();
|
|
const { data: templateModalStatus, close } = useTemplateModal();
|
|
|
|
|
|
|
|
const { data: rendererOptions } = usePreviewOptions();
|
|
const { data: rendererOptions } = usePreviewOptions();
|
|
@@ -51,16 +59,27 @@ export const TemplateModal = (): JSX.Element => {
|
|
|
|
|
|
|
|
const [selectedTemplate, setSelectedTemplate] = useState<ITemplate>();
|
|
const [selectedTemplate, setSelectedTemplate] = useState<ITemplate>();
|
|
|
|
|
|
|
|
|
|
+ const { format } = useFormatter();
|
|
|
|
|
+
|
|
|
const submitHandler = useCallback((template?: ITemplate) => {
|
|
const submitHandler = useCallback((template?: ITemplate) => {
|
|
|
- if (templateModalStatus == null) { return }
|
|
|
|
|
|
|
+ if (templateModalStatus == null || selectedTemplate == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (templateModalStatus.onSubmit == null || template == null) {
|
|
if (templateModalStatus.onSubmit == null || template == null) {
|
|
|
close();
|
|
close();
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- templateModalStatus.onSubmit(template.markdown);
|
|
|
|
|
|
|
+ templateModalStatus.onSubmit(format(selectedTemplate));
|
|
|
close();
|
|
close();
|
|
|
- }, [close, templateModalStatus]);
|
|
|
|
|
|
|
+ }, [close, format, selectedTemplate, templateModalStatus]);
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ if (!templateModalStatus?.isOpened) {
|
|
|
|
|
+ setSelectedTemplate(undefined);
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [templateModalStatus?.isOpened]);
|
|
|
|
|
|
|
|
if (templates == null || templateModalStatus == null) {
|
|
if (templates == null || templateModalStatus == null) {
|
|
|
return <></>;
|
|
return <></>;
|
|
@@ -86,13 +105,13 @@ export const TemplateModal = (): JSX.Element => {
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- { rendererOptions != null && (
|
|
|
|
|
|
|
+ { rendererOptions != null && selectedTemplate != null && (
|
|
|
<>
|
|
<>
|
|
|
<hr />
|
|
<hr />
|
|
|
<h3>Preview</h3>
|
|
<h3>Preview</h3>
|
|
|
<div className='card'>
|
|
<div className='card'>
|
|
|
<div className="card-body" style={{ maxHeight: '60vh', overflowY: 'auto' }}>
|
|
<div className="card-body" style={{ maxHeight: '60vh', overflowY: 'auto' }}>
|
|
|
- <Preview rendererOptions={rendererOptions} markdown={selectedTemplate?.markdown}/>
|
|
|
|
|
|
|
+ <Preview rendererOptions={rendererOptions} markdown={format(selectedTemplate)}/>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</>
|
|
</>
|