mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
2901de7830
[frontend] chat: gracefully access MathJax details GitOrigin-RevId: 5a68bf715a21c8b3881957afc7ac0ba83c353602
56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
import React, { useRef, useEffect } from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import Linkify from 'react-linkify'
|
|
|
|
function MessageContent({ content }) {
|
|
const root = useRef(null)
|
|
|
|
useEffect(() => {
|
|
if (!(window.MathJax && window.MathJax.Hub)) {
|
|
return
|
|
}
|
|
const MJHub = window.MathJax.Hub
|
|
const inlineMathConfig =
|
|
(MJHub.config &&
|
|
MJHub.config.tex2jax &&
|
|
MJHub.config.tex2jax.inlineMath) ||
|
|
[]
|
|
const alreadyConfigured = inlineMathConfig.some(
|
|
c => c[0] === '$' && c[1] === '$'
|
|
)
|
|
if (!alreadyConfigured) {
|
|
MJHub.Config({
|
|
tex2jax: {
|
|
inlineMath: inlineMathConfig.concat([['$', '$']]),
|
|
},
|
|
})
|
|
}
|
|
}, [])
|
|
|
|
useEffect(() => {
|
|
// adds attributes to all the links generated by <Linkify/>, required due to https://github.com/tasti/react-linkify/issues/99
|
|
for (const a of root.current.getElementsByTagName('a')) {
|
|
a.setAttribute('target', '_blank')
|
|
a.setAttribute('rel', 'noreferrer noopener')
|
|
}
|
|
|
|
// MathJax typesetting
|
|
const MJHub = window.MathJax.Hub
|
|
const timeoutHandler = setTimeout(() => {
|
|
MJHub.Queue(['Typeset', MJHub, root.current])
|
|
}, 0)
|
|
return () => clearTimeout(timeoutHandler)
|
|
}, [content])
|
|
|
|
return (
|
|
<p ref={root}>
|
|
<Linkify>{content}</Linkify>
|
|
</p>
|
|
)
|
|
}
|
|
|
|
MessageContent.propTypes = {
|
|
content: PropTypes.string.isRequired,
|
|
}
|
|
|
|
export default MessageContent
|