|
|
|
import React, { useEffect, useState, useMemo } from 'react'; |
|
import { marked } from 'marked'; |
|
|
|
interface MarkdownRendererProps { |
|
markdownText: string; |
|
className?: string; |
|
} |
|
|
|
export const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ markdownText, className = '' }) => { |
|
const [sanitizedHtml, setSanitizedHtml] = useState(''); |
|
|
|
useEffect(() => { |
|
if (markdownText) { |
|
|
|
marked.setOptions({ |
|
gfm: true, |
|
breaks: false, |
|
pedantic: false, |
|
|
|
|
|
}); |
|
const rawHtml = marked.parse(markdownText) as string; |
|
setSanitizedHtml(rawHtml); |
|
} else { |
|
setSanitizedHtml(''); |
|
} |
|
}, [markdownText]); |
|
|
|
const combinedClassName = `markdown-content whitespace-pre-wrap break-words ${className}`; |
|
|
|
return ( |
|
<div |
|
className={combinedClassName} |
|
dangerouslySetInnerHTML={{ __html: sanitizedHtml }} |
|
/> |
|
); |
|
}; |
|
|