|
|
@@ -1,12 +1,8 @@
|
|
|
import React, {
|
|
|
- useCallback, useEffect, useMemo, useState,
|
|
|
+ useCallback, useEffect, useState,
|
|
|
} from 'react';
|
|
|
|
|
|
-import path from 'path';
|
|
|
-
|
|
|
-import type { ITemplate } from '@growi/core';
|
|
|
-import dateFnsFormat from 'date-fns/format';
|
|
|
-import mustache from 'mustache';
|
|
|
+import type { ITemplate } from '@growi/core/dist/interfaces/template';
|
|
|
import { useTranslation } from 'next-i18next';
|
|
|
import {
|
|
|
Modal,
|
|
|
@@ -16,12 +12,13 @@ import {
|
|
|
} from 'reactstrap';
|
|
|
|
|
|
import { useTemplateModal } from '~/stores/modal';
|
|
|
-import { useCurrentPagePath } from '~/stores/page';
|
|
|
import { usePreviewOptions } from '~/stores/renderer';
|
|
|
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');
|
|
|
|
|
|
@@ -54,7 +51,6 @@ const TemplateRadioButton = ({ template, onChange, isSelected }: TemplateRadioBu
|
|
|
export const TemplateModal = (): JSX.Element => {
|
|
|
const { t } = useTranslation();
|
|
|
|
|
|
- const { data: currentPagePath } = useCurrentPagePath();
|
|
|
|
|
|
const { data: templateModalStatus, close } = useTemplateModal();
|
|
|
|
|
|
@@ -63,34 +59,10 @@ export const TemplateModal = (): JSX.Element => {
|
|
|
|
|
|
const [selectedTemplate, setSelectedTemplate] = useState<ITemplate>();
|
|
|
|
|
|
- const formattedMarkdown = useMemo(() => {
|
|
|
- if (selectedTemplate == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- // replace placeholder
|
|
|
- let markdown = selectedTemplate.markdown;
|
|
|
- const now = new Date();
|
|
|
- try {
|
|
|
- markdown = mustache.render(selectedTemplate.markdown, {
|
|
|
- title: path.basename(currentPagePath ?? '/'),
|
|
|
- path: currentPagePath ?? '/',
|
|
|
- yyyy: dateFnsFormat(now, 'yyyy'),
|
|
|
- MM: dateFnsFormat(now, 'MM'),
|
|
|
- dd: dateFnsFormat(now, 'dd'),
|
|
|
- HH: dateFnsFormat(now, 'HH'),
|
|
|
- mm: dateFnsFormat(now, 'mm'),
|
|
|
- });
|
|
|
- }
|
|
|
- catch (err) {
|
|
|
- logger.warn('An error occured while ejs processing.', err);
|
|
|
- }
|
|
|
-
|
|
|
- return markdown;
|
|
|
- }, [currentPagePath, selectedTemplate]);
|
|
|
+ const { format } = useFormatter();
|
|
|
|
|
|
const submitHandler = useCallback((template?: ITemplate) => {
|
|
|
- if (templateModalStatus == null || formattedMarkdown == null) {
|
|
|
+ if (templateModalStatus == null || selectedTemplate == null) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -99,9 +71,9 @@ export const TemplateModal = (): JSX.Element => {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- templateModalStatus.onSubmit(formattedMarkdown);
|
|
|
+ templateModalStatus.onSubmit(format(selectedTemplate));
|
|
|
close();
|
|
|
- }, [close, formattedMarkdown, templateModalStatus]);
|
|
|
+ }, [close, format, selectedTemplate, templateModalStatus]);
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (!templateModalStatus?.isOpened) {
|
|
|
@@ -133,13 +105,13 @@ export const TemplateModal = (): JSX.Element => {
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- { rendererOptions != null && formattedMarkdown != null && (
|
|
|
+ { rendererOptions != null && selectedTemplate != null && (
|
|
|
<>
|
|
|
<hr />
|
|
|
<h3>Preview</h3>
|
|
|
<div className='card'>
|
|
|
<div className="card-body" style={{ maxHeight: '60vh', overflowY: 'auto' }}>
|
|
|
- <Preview rendererOptions={rendererOptions} markdown={formattedMarkdown}/>
|
|
|
+ <Preview rendererOptions={rendererOptions} markdown={format(selectedTemplate)}/>
|
|
|
</div>
|
|
|
</div>
|
|
|
</>
|