"use client";
import { memo, PropsWithChildren } from "react";
import ReactMarkdown, { type Components } from "react-markdown";
import remarkGfm from "remark-gfm";
import remarkMath from "remark-math";
import rehypeKatex from "rehype-katex";
import { PreBlock } from "./pre-block";
import { isJson, isString, toAny } from "lib/utils";
import JsonView from "ui/json-view";
import { LinkIcon } from "lucide-react";
import {
Table,
TableHeader,
TableBody,
TableRow,
TableHead,
TableCell,
} from "ui/table";
const FadeIn = memo(({ children }: PropsWithChildren) => {
return {children} ;
});
FadeIn.displayName = "FadeIn";
export const WordByWordFadeIn = memo(({ children }: PropsWithChildren) => {
const childrens = [children]
.flat()
.flatMap((child) => (isString(child) ? child.split(" ") : child));
return childrens.map((word, index) =>
isString(word) ? {word} : word,
);
});
WordByWordFadeIn.displayName = "WordByWordFadeIn";
const components: Partial = {
table: ({ node, children, ...props }) => {
return (
);
},
thead: ({ node, children, ...props }) => {
return {children};
},
tbody: ({ node, children, ...props }) => {
return {children};
},
tr: ({ node, children, ...props }) => {
return {children};
},
th: ({ node, children, ...props }) => {
return (
{children}
);
},
td: ({ node, children, ...props }) => {
return (
{children}
);
},
code: ({ children }) => {
return (
{children}
);
},
blockquote: ({ children }) => {
return (
);
},
p: ({ children }) => {
return (
{children}
);
},
pre: ({ children }) => {
return (
);
},
ol: ({ node, children, ...props }) => {
return (
{children}
);
},
li: ({ node, children, ...props }) => {
return (
{children}
);
},
ul: ({ node, children, ...props }) => {
return (
);
},
strong: ({ node, children, ...props }) => {
return (
{children}
);
},
a: ({ node, children, ...props }) => {
return (
{children}
);
},
h1: ({ node, children, ...props }) => {
return (
{children}
);
},
h2: ({ node, children, ...props }) => {
return (
{children}
);
},
h3: ({ node, children, ...props }) => {
return (
{children}
);
},
h4: ({ node, children, ...props }) => {
return (
{children}
);
},
h5: ({ node, children, ...props }) => {
return (
{children}
);
},
h6: ({ node, children, ...props }) => {
return (
{children}
);
},
img: ({ node, children, ...props }) => {
const { src, alt, ...rest } = props;
return src ? (
// eslint-disable-next-line @next/next/no-img-element
) : null;
},
};
const NonMemoizedMarkdown = ({ children }: { children: string }) => {
return (
{isJson(children) ? (
) : (
{children}
)}
);
};
export const Markdown = memo(
NonMemoizedMarkdown,
(prevProps, nextProps) => prevProps.children === nextProps.children,
);