import { ClipboardDocumentCheckIcon, ClipboardDocumentIcon, } from '@heroicons/react/24/outline'; // @ts-ignore import { CopyToClipboard } from 'react-copy-to-clipboard'; // @ts-ignore import SyntaxHighlighter, { createElement } from 'react-syntax-highlighter'; import { JSX, ReactNode, useEffect, useMemo, useState } from 'react'; import { twMerge } from 'tailwind-merge'; export function JsonCodeBlockPreTag({ children, }: { children: ReactNode; }): JSX.Element { return (
{children}
); } export interface JsonCodeBlockProps { data: any; renderSource: (propertyName: string) => ReactNode; } export function JsonCodeBlock(props: JsonCodeBlockProps): JSX.Element { const [copied, setCopied] = useState(false); const jsonString = useMemo( () => JSON.stringify(props.data, null, 2), [props.data] ); useEffect(() => { if (!copied) return; const t = setTimeout(() => { setCopied(false); }, 3000); return () => clearTimeout(t); }, [copied]); return (
{ setCopied(true); }} >
); } export function sourcesRenderer( renderSource: (propertyName: string) => ReactNode ) { return ({ rows, stylesheet }: any) => { return rows.map((node: any, idx: number) => { const element = createElement({ node, stylesheet, useInlineStyles: false, key: `code-line-${idx}`, }); let sourceElement: ReactNode; const attrNode = node.children.find( (c: any) => c.type === 'element' && c.properties?.className?.includes('hljs-attr') ); if (attrNode?.children?.length) { for (const child of attrNode.children) { sourceElement = renderSource(child.value); // e.g. command if (sourceElement) break; } } return ( {element} {sourceElement && ( {sourceElement} )} ); }); }; }