"use client"; import "@assistant-ui/react-markdown/styles/dot.css"; import { CodeHeaderProps, unstable_memoizeMarkdownComponents as memoizeMarkdownComponents, useIsMarkdownCodeBlock, } from "@assistant-ui/react-markdown"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; import rehypeKatex from "rehype-katex"; import remarkMath from "remark-math"; import { FC, memo, useState } from "react"; import { CheckIcon, CopyIcon } from "lucide-react"; import { SyntaxHighlighter } from "@/components/thread/syntax-highlighter"; import { TooltipIconButton } from "@/components/thread/tooltip-icon-button"; import { cn } from "@/lib/utils"; import "katex/dist/katex.min.css"; const MarkdownTextImpl = ({ children }: { children: string }) => { return ( {children} ); }; export const MarkdownText = memo(MarkdownTextImpl); const CodeHeader: FC = ({ 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: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,
        SyntaxHighlighter,
      });
      
      ), td: ({ className, ...props }) => ( ), tr: ({ className, ...props }) => (