import "katex/dist/katex.min.css"; import katex from "katex"; //import "katex/dist/contrib/mhchem.min.js"; import { useEffect, useRef, useState } from "react"; import { NodeViewProps, NodeViewWrapper } from "@tiptap/react"; import { Popover, Textarea } from "@mantine/core"; import classes from "./math.module.css"; import { v4 } from "uuid"; export default function MathInlineView(props: NodeViewProps) { const { node, updateAttributes, editor, getPos } = props; const mathResultContainer = useRef(null); const mathPreviewContainer = useRef(null); const [error, setError] = useState(null); const [preview, setPreview] = useState(null); const textAreaRef = useRef(null); const [isEditing, setIsEditing] = useState(false); const renderMath = ( katexString: string, container: HTMLDivElement | null, ) => { try { katex.render(katexString, container); setError(null); } catch (e) { //console.error(e); setError(e.message); } }; useEffect(() => { renderMath(node.attrs.text, mathResultContainer.current); }, [node.attrs.text]); useEffect(() => { if (isEditing) { renderMath(preview || "", mathPreviewContainer.current); } else if (preview !== null) { queueMicrotask(() => { updateAttributes({ text: preview }); }); } }, [preview, isEditing]); useEffect(() => { setIsEditing(!!props.selected); if (props.selected) setPreview(node.attrs.text); }, [props.selected]); return ( <>
{((isEditing && !preview?.trim().length) || (!isEditing && !node.attrs.text.trim().length)) && (
Empty equation
)} {error &&
Invalid equation
}