| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { 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
|