"use client"; import { useState, useCallback } from "react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { oneDark } from "react-syntax-highlighter/dist/esm/styles/prism"; interface CodeBlockProps { code: string; language?: string; label?: string; } export function CodeBlock({ code, language = "python", label, }: CodeBlockProps) { const [copied, setCopied] = useState(false); const handleCopy = useCallback(async () => { await navigator.clipboard.writeText(code); setCopied(true); setTimeout(() => setCopied(false), 2000); }, [code]); const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); handleCopy(); } }, [handleCopy] ); const codeLabel = label || `${language} code example`; // Map common language names to Prism language identifiers const languageMap: Record = { python: "python", javascript: "javascript", typescript: "typescript", java: "java", cpp: "cpp", c: "c", go: "go", rust: "rust", }; const prismLanguage = languageMap[language.toLowerCase()] || language; return (
{copied ? "Code copied to clipboard" : ""}
{language}
{code.trim()}
); }