import { Checkbox } from "@mui/joy"; import clsx from "clsx"; import copy from "copy-to-clipboard"; import hljs from "highlight.js"; import { useCallback, useMemo, useState } from "react"; import toast from "react-hot-toast"; import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import { useTranslate } from "@/utils/i18n"; import Icon from "../Icon"; import MermaidBlock from "./MermaidBlock"; import { BaseProps } from "./types"; // Special languages that are rendered differently. enum SpecialLanguage { HTML = "__html", MERMAID = "mermaid", } interface Props extends BaseProps { language: string; content: string; } const CodeBlock: React.FC = ({ language, content }: Props) => { const formatedLanguage = useMemo(() => (language || "").toLowerCase() || "text", [language]); // Users can set Markdown code blocks as `__html` to render HTML directly. if (formatedLanguage === SpecialLanguage.HTML) { return
; } else if (formatedLanguage === SpecialLanguage.MERMAID) { return ; } const { md } = useResponsiveWidth(); const t = useTranslate(); const [wrap, setWrap] = useState(true); const handleWrapChange = useCallback(() => setWrap(!wrap), [setWrap, wrap]); const highlightedCode: string = useMemo(() => { try { const lang = hljs.getLanguage(formatedLanguage); if (lang) { return hljs.highlight(content, { language: formatedLanguage, }).value; } } catch (error) { // Skip error and use default highlighted code. } return content; }, [formatedLanguage, content]); const handleCopyButtonClick = useCallback(() => { copy(content); toast.success("Copied to clipboard!"); }, [content]); return (
{formatedLanguage} {md && }
          
        
{!md && (
)}
); }; export default CodeBlock;