import React, { useEffect, useRef, useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faAngleDown } from '@fortawesome/free-solid-svg-icons'; import sqlFormatter from 'sql-formatter'; import CopyButton from './CopyButton'; import HighlightedCode from './HighlightedCode'; import RoundedButton from './RoundedButton'; type Props = { value: string; limitHeight?: boolean; language?: null | 'sql' | 'curl' | 'json'; transparent?: boolean; overflowX?: boolean; }; // TODO: Json/Curl editor? export default function CodeSnippet({ value, limitHeight = true, language = null, transparent = false, overflowX = true, }: Props) { const [isCollapsed, setIsCollapsed] = useState(limitHeight); const [isOverflowing, setIsOverflowing] = useState(language === 'sql'); const ref = useRef(null); const containerRef = useRef(null); useEffect(() => { if (ref.current) { setIsOverflowing(ref.current.scrollHeight > ref.current.clientHeight); } }, [ref.current, isCollapsed, value, limitHeight]); function handleClick(event: React.MouseEvent) { // Triple click means select all if (event.detail === 3) { selectAll(); return; } if (!isOverflowing) { return; } // Ignore click even when selecting expanded code. if ((!isCollapsed && window.getSelection()?.toString().length) || 0 > 0) { return; } setIsCollapsed(!isCollapsed); } function selectAll() { const range = document.createRange(); range.selectNodeContents(containerRef.current!); const selection = window.getSelection()!; selection.removeAllRanges(); selection.addRange(range); } return (
{language === 'sql' && ( <> {isCollapsed ? (
                                
                                    {value}
                                
                            
) : (
                                
                                    
                                        {sqlFormatter.format(value, { language: 'mysql' })}
                                    
                                
                            
)} )} {language !== 'sql' && (
                        
                            {language ? {value} : value}
                        
                    
)}
{isOverflowing && ( setIsCollapsed(!isCollapsed)} className=" absolute -bottom-3 left-1/2 -translate-x-1/2 opacity-0 group-hover:opacity-100 scale-80 group-hover:scale-100 delay-100 " > )}
); }