71 lines
1.7 KiB
JavaScript

import ReactMarkdown from 'react-markdown'
import remarkGfm from 'remark-gfm'
import { Typography } from 'antd'
import PropTypes from 'prop-types'
const { Paragraph, Text } = Typography
const UlComponent = ({ children }) => <ul>{children}</ul>
UlComponent.propTypes = {
children: PropTypes.node
}
const OlComponent = ({ children }) => (
<ol style={{ paddingLeft: '20px', margin: 0 }}>{children}</ol>
)
OlComponent.propTypes = {
children: PropTypes.node
}
const LiComponent = ({ children }) => <li>{children}</li>
LiComponent.propTypes = {
children: PropTypes.node
}
const BlockquoteComponent = ({ children }) => (
<Paragraph>
<blockquote>{children}</blockquote>
</Paragraph>
)
BlockquoteComponent.propTypes = { children: PropTypes.node }
const MarkdownDisplay = ({ content }) => {
const components = {
h1: (props) => <h1 {...props} />,
h2: (props) => <h2 {...props} />,
h3: (props) => <h3 {...props} />,
h4: (props) => <h4 {...props} />,
h5: (props) => <h5 {...props} />,
h6: (props) => <h6 {...props} />,
p: (props) => <p {...props} />,
ul: UlComponent,
ol: OlComponent,
li: LiComponent,
strong: (props) => <Text strong {...props} />,
em: (props) => <Text italic {...props} />,
code: ({ inline, ...props }) =>
inline ? (
<Text code {...props} />
) : (
<Paragraph>
<pre {...props} />
</Paragraph>
),
blockquote: BlockquoteComponent
}
return (
<div className="markdown markdown-display">
<ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>
{content}
</ReactMarkdown>
</div>
)
}
MarkdownDisplay.propTypes = {
content: PropTypes.string.isRequired
}
export default MarkdownDisplay