import { Check, Copy } from "lucide-react"; import Image from "next/image"; import { useTheme } from "next-themes"; import { useEffect, useMemo, useRef, useState } from "react"; import ReactMarkdown from "react-markdown"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { oneDark, oneLight } from "react-syntax-highlighter/dist/cjs/styles/prism"; import rehypeRaw from "rehype-raw"; import rehypeSanitize from "rehype-sanitize"; import remarkGfm from "remark-gfm"; import { Button } from "@/components/ui/button"; import { cn } from "@/lib/utils"; interface MarkdownViewerProps { content: string; className?: string; } export function MarkdownViewer({ content, className }: MarkdownViewerProps) { const ref = useRef(null); // Memoize the markdown components to prevent unnecessary re-renders const components = useMemo(() => { return { // Define custom components for markdown elements p: ({ node, children, ...props }: any) => (

{children}

), a: ({ node, children, ...props }: any) => ( {children} ), li: ({ node, children, ...props }: any) =>
  • {children}
  • , ul: ({ node, ...props }: any) =>