import ReactMarkdown from "react-markdown"; import "katex/dist/katex.min.css"; import RemarkMath from "remark-math"; import RemarkBreaks from "remark-breaks"; import RehypeKatex from "rehype-katex"; import RemarkGfm from "remark-gfm"; import RehypeHighlight from "rehype-highlight"; import { useRef, useState, RefObject, useEffect } from "react"; import { copyToClipboard } from "../utils"; import LoadingIcon from "../icons/three-dots.svg"; export function PreCode(props: { children: any }) { const ref = useRef(null); return (
       {
          if (ref.current) {
            const code = ref.current.innerText;
            copyToClipboard(code);
          }
        }}
      >
      {props.children}
    
); } export function Markdown( props: { content: string; loading?: boolean; fontSize?: number; parentRef: RefObject; } & React.DOMAttributes, ) { const mdRef = useRef(null); const parent = props.parentRef.current; const md = mdRef.current; const rendered = useRef(true); // disable lazy loading for bad ux const [counter, setCounter] = useState(0); useEffect(() => { // to triggr rerender setCounter(counter + 1); // eslint-disable-next-line react-hooks/exhaustive-deps }, [props.loading]); const inView = rendered.current || (() => { if (parent && md) { const parentBounds = parent.getBoundingClientRect(); const mdBounds = md.getBoundingClientRect(); const isInRange = (x: number) => x <= parentBounds.bottom && x >= parentBounds.top; const inView = isInRange(mdBounds.top) || isInRange(mdBounds.bottom); if (inView) { rendered.current = true; } return inView; } })(); const shouldLoading = props.loading || !inView; return (
{shouldLoading ? ( ) : ( {props.content} )}
); }