"use client"; import "./markdown-styles.css"; 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"; interface CodeHeaderProps { language?: string; code: string; } 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 CodeHeader: FC = ({ language, code }) => { const { isCopied, copyToClipboard } = useCopyToClipboard(); const onCopy = () => { if (!code || isCopied) return; copyToClipboard(code); }; return (
{language} {!isCopied && } {isCopied && }
); }; const defaultComponents: any = { h1: ({ className, ...props }: { className?: string }) => (

), h2: ({ className, ...props }: { className?: string }) => (

), h3: ({ className, ...props }: { className?: string }) => (

), h4: ({ className, ...props }: { className?: string }) => (

), h5: ({ className, ...props }: { className?: string }) => (

), h6: ({ className, ...props }: { className?: string }) => (
), p: ({ className, ...props }: { className?: string }) => (

), a: ({ className, ...props }: { className?: string }) => ( ), blockquote: ({ className, ...props }: { className?: string }) => (

), ul: ({ className, ...props }: { className?: string }) => (
    li]:mt-2", className)} {...props} /> ), ol: ({ className, ...props }: { className?: string }) => (
      li]:mt-2", className)} {...props} /> ), hr: ({ className, ...props }: { className?: string }) => (
      ), table: ({ className, ...props }: { className?: string }) => ( ), th: ({ className, ...props }: { className?: string }) => ( td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg", className, )} {...props} /> ), sup: ({ className, ...props }: { className?: string }) => ( a]:text-xs [&>a]:no-underline", className)} {...props} /> ), pre: ({ className, ...props }: { className?: string }) => (
        ),
        code: ({
          className,
          children,
          ...props
        }: {
          className?: string;
          children: React.ReactNode;
        }) => {
          const match = /language-(\w+)/.exec(className || "");
      
          if (match) {
            const language = match[1];
            const code = String(children).replace(/\n$/, "");
      
            return (
              <>
                
                
                  {code}
                
              
            );
          }
      
          return (
            
              {children}
            
          );
        },
      };
      
      const MarkdownTextImpl: FC<{ children: string }> = ({ children }) => {
        return (
          
      {children}
      ); }; export const MarkdownText = memo(MarkdownTextImpl);
      ), td: ({ className, ...props }: { className?: string }) => ( ), tr: ({ className, ...props }: { className?: string }) => (