"use client"; import { useTheme } from "@/components/theme/app-theme"; import CodeMirror from "@uiw/react-codemirror"; import { vscodeDark, vscodeLight } from "@uiw/codemirror-theme-vscode"; import { EditorView } from "@codemirror/view"; import { IconCheck, IconCopy } from "@tabler/icons-react"; import { cn } from "@/lib/utils"; import { getCodeMirrorExtension } from "@/lib/languages"; import { useCopyToClipboard } from "@/hooks/use-copy-to-clipboard"; type CodeBlockProps = { children: React.ReactNode; className?: string; }; const getLanguageExtension = (language?: string) => { if (!language) return undefined; const lang = language.replace("language-", "").toLowerCase(); return getCodeMirrorExtension(lang); }; export function CodeMirrorCodeBlock({ children, className }: CodeBlockProps) { const { copied, copy } = useCopyToClipboard(); const { theme, systemTheme } = useTheme(); const effectiveTheme = theme === "system" ? systemTheme : theme; const code = String(children).replace(/\n$/, ""); const languageExtension = getLanguageExtension(className); // Custom padding theme const paddingTheme = EditorView.theme({ "&": { padding: "2px 2px", }, }); const handleCopy = async () => { await copy(code); }; return (
{/* Copy button */} {/* Code editor */}
); }