import React, { useState, useMemo, useCallback } from 'react'; interface CodeSnippetProps { code: string; initialLines?: number; } const ExpandIcon = () => ( ); const CollapseIcon = () => ( ); const CopyIcon = () => ( ); export const CodeSnippet: React.FC = React.memo( ({ code, initialLines = 5 }) => { const [expanded, setExpanded] = useState(false); const [copied, setCopied] = useState(false); const lines = useMemo(() => code.split('\n'), [code]); const shouldTruncate = useMemo( () => lines.length > initialLines, [lines.length, initialLines] ); const displayedLines = useMemo( () => (expanded || !shouldTruncate ? lines : lines.slice(0, initialLines)), [expanded, shouldTruncate, lines, initialLines] ); const toggleExpanded = useCallback( () => setExpanded(prev => !prev), [] ); const handleCopy = useCallback(() => { navigator.clipboard.writeText(code) .then(() => { setCopied(true); setTimeout(() => setCopied(false), 2000); }) .catch(() => {}); }, [code]); return (
{shouldTruncate && (
)}
          {displayedLines.map((line, idx) => (
            
{idx + 1} {line}
))} {shouldTruncate && !expanded && (
...
)}
); } ); export default CodeSnippet;