diff --git a/services/web/frontend/js/features/chat/components/chat-pane.jsx b/services/web/frontend/js/features/chat/components/chat-pane.jsx index 768fc9a76f..040a847f33 100644 --- a/services/web/frontend/js/features/chat/components/chat-pane.jsx +++ b/services/web/frontend/js/features/chat/components/chat-pane.jsx @@ -1,8 +1,7 @@ -import React, { useEffect } from 'react' +import React, { lazy, Suspense, useEffect, useState } from 'react' import PropTypes from 'prop-types' import { useTranslation } from 'react-i18next' -import MessageList from './message-list' import MessageInput from './message-input' import InfiniteScroll from './infinite-scroll' import ChatFallbackError from './chat-fallback-error' @@ -14,6 +13,8 @@ import { FetchError } from '../../../infrastructure/fetch-json' import { useChatContext } from '../context/chat-context' import LoadingSpinner from '../../../shared/components/loading-spinner' +const MessageList = lazy(() => import('./message-list')) + const ChatPane = React.memo(function ChatPane() { const { t } = useTranslation() @@ -48,6 +49,14 @@ const ChatPane = React.memo(function ChatPane() { 0 ) + // Keep the chat pane in the DOM to avoid resetting the form input and re-rendering MathJax content. + const [chatOpenedOnce, setChatOpenedOnce] = useState(chatIsOpen) + useEffect(() => { + if (chatIsOpen) { + setChatOpenedOnce(true) + } + }, [chatIsOpen]) + if (error) { // let user try recover from fetch errors if (error instanceof FetchError) { @@ -59,6 +68,9 @@ const ChatPane = React.memo(function ChatPane() { if (!user) { return null } + if (!chatOpenedOnce) { + return null + } return (