|
|
| 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 }} |
| /> |
| ); |
| }; |
| |