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"; import React from "react"; export function PreCode(props: { children: any }) { const ref = useRef(null); return (
       {
          if (ref.current) {
            const code = ref.current.innerText;
            copyToClipboard(code);
          }
        }}
      >
      {props.children}
    
); } function _MarkDownContent(props: { content: string }) { return ( {props.content} ); } export const MarkdownContent = React.memo(_MarkDownContent); export function Markdown( props: { content: string; loading?: boolean; fontSize?: number; parentRef: RefObject; } & React.DOMAttributes, ) { const mdRef = useRef(null); const renderedHeight = useRef(0); const inView = useRef(false); const parent = props.parentRef.current; const md = mdRef.current; const checkInView = () => { if (parent && md) { const parentBounds = parent.getBoundingClientRect(); const twoScreenHeight = Math.max(500, parentBounds.height * 2); const mdBounds = md.getBoundingClientRect(); const isInRange = (x: number) => x <= parentBounds.bottom + twoScreenHeight && x >= parentBounds.top - twoScreenHeight; inView.current = isInRange(mdBounds.top) || isInRange(mdBounds.bottom); } if (inView.current && md) { renderedHeight.current = Math.max( renderedHeight.current, md.getBoundingClientRect().height, ); } }; useEffect(() => { setTimeout(() => { if (!inView.current) { checkInView(); } }, 30); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); checkInView(); return (
0 ? renderedHeight.current : "auto", }} ref={mdRef} onContextMenu={props.onContextMenu} onDoubleClickCapture={props.onDoubleClickCapture} > {inView.current && (props.loading ? ( ) : ( ))}
); }