'use client'; import React, { Children, ReactElement, ReactNode, useState, } from 'react'; import styles from './CodeSnippet.module.css'; interface MarkdocFenceProps { language?: string; content?: string; className?: string; } function isMarkdocElement( child: ReactNode ): child is ReactElement { return React.isValidElement(child); } function CodeSnippetCopyButton({ copyText, }: { copyText: string; }) { const [copyButtonTooltip, setCopyButtonTooltip] = useState(false); const [showTooltip, setShowTooltip] = useState(false); const handleCopy = () => { setCopyButtonTooltip(true); setTimeout(() => { setCopyButtonTooltip(false); }, 1000); navigator.clipboard.writeText(copyText ?? ''); }; return (
{copyButtonTooltip ? 'Copied!' : 'Click to Copy'}
); } function SnippetLanguageDropdown({ selectedLanguage, snippetLanguages, handleSelectChange, }: { selectedLanguage: string; snippetLanguages: string[]; handleSelectChange: ( e: React.ChangeEvent ) => void; }) { return (
); } export default function CodeSnippet({ children, method, heading, defaultLanguage, }: { children: ReactNode; method?: string; heading: string; defaultLanguage: string; }) { const methodStyles: { [key: string]: string } = { GET: styles.get, POST: styles.post, PUT: styles.put, DELETE: styles.delete, }; const [selectedLanguage, setSelectedLanguage] = useState(defaultLanguage); const handleSelectChange = ( e: React.ChangeEvent ) => { setSelectedLanguage(e.target.value); }; const childrenArray = Children.toArray(children); const code = childrenArray.find( (child): child is ReactElement => { if (!isMarkdocElement(child)) return false; const { language, className } = child.props; return ( language === selectedLanguage || className === `language-${selectedLanguage}` ); } ); const snippetLanguages = childrenArray .map(child => { if (isMarkdocElement(child)) { const { language, className } = child.props; return language || className?.split('-')[1]; } return undefined; }) .filter((l): l is string => typeof l === 'string'); return (
{method ? ( {method} ) : null}{' '} {heading}
{snippetLanguages.length > 1 ? ( <>
) : null}
{code}
); }