import { Check, ChevronDown, ChevronUp, Copy } from "lucide-react"; import { memo, useMemo, useState } from "react"; import { Badge } from "./ui/badge"; import { Button } from "./ui/button"; type CodeComponentProps = { code: string; language: string; }; const CodeComponent = memo(function CodeComponent({ code, language, }: CodeComponentProps) { const [isCopied, setIsCopied] = useState(false); const [isExpanded, setIsExpanded] = useState(false); const { lineCount, shouldCollapse, previewCode } = useMemo(() => { const lines = code.split("\n"); const lineCount = lines.length; const shouldCollapse = lineCount > 10; const previewCode = shouldCollapse ? lines.slice(0, 8).join("\n") + "\n..." : code; return { lineCount, shouldCollapse, previewCode }; }, [code]); const copyToClipboard = () => { if (!navigator.clipboard || !navigator.clipboard.writeText) { return; } navigator.clipboard.writeText(code).then(() => { setIsCopied(true); setTimeout(() => { setIsCopied(false); }, 2000); }); }; const displayCode = shouldCollapse && !isExpanded ? previewCode : code; const maxHeight = isExpanded ? "600px" : shouldCollapse ? "200px" : "400px"; return (
{/* Header with language and controls */}
{language && ( {language.toLowerCase()} )} {lineCount} line{lineCount !== 1 ? "s" : ""}
{shouldCollapse && ( )}
{/* Code content */}
{displayCode}
{/* Fade overlay for collapsed state */} {shouldCollapse && !isExpanded && (
)}
); }); export default CodeComponent;