import React, { useState, useEffect, useCallback, useMemo } from "react"; import { buildCodeHighlighter } from "./CodeHighlighter"; interface CodeBlockProps { language: string; code: string; onRenderComplete: () => void; } const highlighter = buildCodeHighlighter(); const CodeBlock: React.FC = ({ language, code, onRenderComplete, }) => { const [html, setHtml] = useState(""); const [loading, setLoading] = useState(true); const highlightCode = useCallback(async () => { try { const highlighted = (await highlighter).codeToHtml(code, { lang: language, theme: "github-dark", }); setHtml(highlighted); } catch (error) { console.error("Error highlighting code:", error); setHtml(`
${code}
`); } finally { setLoading(false); onRenderComplete(); } }, [language, code, onRenderComplete]); useEffect(() => { highlightCode(); }, [highlightCode]); if (loading) { return (
Loading code...
); } return (
); }; export default React.memo(CodeBlock);