import { Suspense, lazy, useCallback, useState } from "react"; import { Check, Copy } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useThemeValue } from "@/hooks/useTheme"; import { cn } from "@/lib/utils"; interface CodeBlockProps { language?: string; code: string; className?: string; highlight?: boolean; } interface HighlightedCodeProps { language?: string; code: string; isDark: boolean; } const LazyHighlightedCode = lazy(async () => { const [ { default: SyntaxHighlighter }, { default: oneDark }, { default: oneLight }, ] = await Promise.all([ import("react-syntax-highlighter/dist/esm/prism-async-light"), import("react-syntax-highlighter/dist/esm/styles/prism/one-dark"), import("react-syntax-highlighter/dist/esm/styles/prism/one-light"), ]); return { default({ language, code, isDark }: HighlightedCodeProps) { return ( {code} ); }, }; }); function PlainCodeFallback({ code }: { code: string }) { return (
      {code}
    
); } export function CodeBlock({ language, code, className, highlight = true, }: CodeBlockProps) { const { t } = useTranslation(); const [copied, setCopied] = useState(false); const isDark = useThemeValue() === "dark"; const onCopy = useCallback(() => { if (!navigator.clipboard) return; navigator.clipboard.writeText(code).then(() => { setCopied(true); setTimeout(() => setCopied(false), 1_500); }); }, [code]); return (
{language || t("code.fallbackLanguage")}
{highlight ? ( }> ) : ( )}
); }