Skip to content

Commit

Permalink
Fix Markdown Component May Output Blank Content (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
Soulike authored Jan 16, 2025
1 parent 185a0c2 commit 2359abd
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 18 deletions.
10 changes: 5 additions & 5 deletions apps/admin-vite/src/components/ArticlePreviewModal/container.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {useCallback, useEffect, useState} from 'react';
import {useCallback, useState} from 'react';

import {
ArticlePreviewModalView,
Expand All @@ -7,16 +7,15 @@ import {

type Props = Omit<
ArticlePreviewModalViewProps,
'loading' | 'onMarkdownRenderFinish'
'loading' | 'onMarkdownRenderStart' | 'onMarkdownRenderFinish'
>;

export function ArticlePreviewModal(props: Props) {
const [isMarkdownRendering, setIsMarkdownRendering] = useState(true);
const {contentMarkdown} = props;

useEffect(() => {
const onMarkdownRenderStart = useCallback(() => {
setIsMarkdownRendering(true);
}, [contentMarkdown]);
}, []);

const onMarkdownRenderFinish = useCallback(() => {
setIsMarkdownRendering(false);
Expand All @@ -26,6 +25,7 @@ export function ArticlePreviewModal(props: Props) {
<ArticlePreviewModalView
{...props}
loading={isMarkdownRendering}
onMarkdownRenderStart={onMarkdownRenderStart}
onMarkdownRenderFinish={onMarkdownRenderFinish}
/>
);
Expand Down
7 changes: 6 additions & 1 deletion apps/admin-vite/src/components/ArticlePreviewModal/view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export interface ArticlePreviewModalViewProps {
onCancel: ModalProps['onCancel'];
loading: boolean;
onMarkdownRenderFinish: () => unknown;
onMarkdownRenderStart: () => unknown;
contentMarkdown: string;
}

Expand All @@ -21,6 +22,7 @@ export function ArticlePreviewModalView(props: ArticlePreviewModalViewProps) {
onOk,
onCancel,
contentMarkdown,
onMarkdownRenderStart,
onMarkdownRenderFinish,
} = props;
return (
Expand All @@ -42,7 +44,10 @@ export function ArticlePreviewModalView(props: ArticlePreviewModalViewProps) {
/>
)}
<div className={loading ? styles.hide : ''}>
<Markdown onRenderFinish={onMarkdownRenderFinish}>
<Markdown
onRenderStart={onMarkdownRenderStart}
onRenderFinish={onMarkdownRenderFinish}
>
{contentMarkdown}
</Markdown>
</div>
Expand Down
39 changes: 27 additions & 12 deletions packages/react-components/src/csr/Markdown/container.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,42 @@
import {useHljs, useMdConverter, useTeXRenderer} from '@website/hooks';
import {useEffect} from 'react';
import {useCallback, useEffect, useState} from 'react';

import {MarkdownView} from '../../shared-views/MarkdownView';

interface IProps {
children: string;
onRenderStart?: () => unknown;
onRenderFinish?: () => unknown;
}

export function Markdown(props: IProps) {
const {children, onRenderFinish} = props;
const {loading: converterLoading, html} = useMdConverter(children);
const {loading: hljsLoading, highlightedHtml} = useHljs(html);
const {loading: texRendererLoading, renderedHtml} = useTeXRenderer(
highlightedHtml,
[],
);
const {children, onRenderStart, onRenderFinish} = props;
const [renderedHtml, setRenderedHtml] = useState('');

const renderChildrenToHtml = useCallback(async () => {
const [{highlightAll}, {converter}, {TeXRenderer}] = await Promise.all([
import('@website/hljs/csr'),
import('@website/md-converter'),
import('@website/tex-renderer/csr'),
]);

const rawHtml = converter.makeHtml(children);
const codeHighlightedHtml = await highlightAll(rawHtml);
const texRenderedHtml =
await TeXRenderer.renderAllTexInHTML(codeHighlightedHtml);
return texRenderedHtml;
}, [children]);

useEffect(() => {
if (!converterLoading && !hljsLoading && !texRendererLoading) {
if (onRenderFinish) onRenderFinish();
if (onRenderStart) {
onRenderStart();
}
}, [converterLoading, hljsLoading, texRendererLoading, onRenderFinish]);
void renderChildrenToHtml().then((textRenderedHtml) => {
setRenderedHtml(textRenderedHtml);
if (onRenderFinish) {
onRenderFinish();
}
});
}, [onRenderFinish, onRenderStart, renderChildrenToHtml]);

return <MarkdownView htmlContent={renderedHtml} />;
}

0 comments on commit 2359abd

Please sign in to comment.