import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Copy, Bookmark, ChevronDown, ChevronRight, Code2, Check } from 'lucide-react'; import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism'; import useChatStore from '../../store/useChatStore'; const customStyle = { ...oneDark, 'pre[class*="language-"]': { ...oneDark['pre[class*="language-"]'], background: 'transparent', padding: '0', margin: '0', fontSize: '13px', lineHeight: '1.7', }, 'code[class*="language-"]': { ...oneDark['code[class*="language-"]'], background: 'transparent', fontSize: '13px', }, }; export default function SQLBlock({ sql, messageId }) { const addToast = useChatStore(s => s.addToast); const saveSqlQuery = useChatStore(s => s.saveSqlQuery); const [collapsed, setCollapsed] = useState(false); const [copied, setCopied] = useState(false); const [saved, setSaved] = useState(false); if (!sql) return null; const lineCount = sql.split('\n').length; const handleCopy = async () => { await navigator.clipboard.writeText(sql).catch(() => {}); setCopied(true); addToast('SQL copied to clipboard', 'success'); setTimeout(() => setCopied(false), 2000); }; const handleSave = () => { saveSqlQuery(sql); setSaved(true); addToast('Query saved to library', 'success'); setTimeout(() => setSaved(false), 2000); }; return ( {/* Header */}
Generated SQL {lineCount} {lineCount === 1 ? 'line' : 'lines'}
{/* Code with line numbers */} {!collapsed && (
3} lineNumberStyle={{ color: 'rgba(255,255,255,0.12)', fontSize: '11px', paddingRight: '12px', minWidth: '2em', userSelect: 'none', }} > {sql}
)}
); }