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 (
);
}
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}
)}
);
});
};
}