= ({ language, code }) => {
const { isCopied, copyToClipboard } = useCopyToClipboard();
const onCopy = () => {
if (!code || isCopied) return;
copyToClipboard(code);
};
return (
{language}
{!isCopied && }
{isCopied && }
);
};
const useCopyToClipboard = ({
copiedDuration = 3000,
}: {
copiedDuration?: number;
} = {}) => {
const [isCopied, setIsCopied] = useState(false);
const copyToClipboard = (value: string) => {
if (!value) return;
navigator.clipboard.writeText(value).then(() => {
setIsCopied(true);
setTimeout(() => setIsCopied(false), copiedDuration);
});
};
return { isCopied, copyToClipboard };
};
const defaultComponents = memoizeMarkdownComponents({
h1: ({ className, ...props }) => (
),
h2: ({ className, ...props }) => (
),
h3: ({ className, ...props }) => (
),
h4: ({ className, ...props }) => (
),
h5: ({ className, ...props }) => (
),
h6: ({ className, ...props }) => (
),
p: ({ className, ...props }) => (
),
a: ({ className, ...props }) => (
),
blockquote: ({ className, ...props }) => (
),
ul: ({ className, ...props }) => (
li]:mt-2", className)} {...props} />
),
ol: ({ className, ...props }) => (
li]:mt-2", className)} {...props} />
),
hr: ({ className, ...props }) => (
),
table: ({ className, ...props }) => (
),
th: ({ className, ...props }) => (
|
),
td: ({ className, ...props }) => (
|
),
tr: ({ className, ...props }) => (
td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg", className)} {...props} />
),
sup: ({ className, ...props }) => (
a]:text-xs [&>a]:no-underline", className)} {...props} />
),
pre: ({ className, ...props }) => (
),
code: function Code({ className, ...props }) {
const isCodeBlock = useIsMarkdownCodeBlock();
return (
);
},
CodeHeader,
});