import { Callout, Box, MessageDivider, Throbber } from '@rocket.chat/fuselage'; import { MessageTypes } from '@rocket.chat/message-types'; import { ContextualbarClose, ContextualbarContent, ContextualbarHeader, ContextualbarTitle, ContextualbarIcon, ContextualbarSection, ContextualbarDialog, VirtualizedScrollbars, ContextualbarEmptyContent, } from '@rocket.chat/ui-client'; import { useRoomToolbox, useUserPreference, useSetting } from '@rocket.chat/ui-contexts'; import { useState, memo, Fragment, useId } from 'react'; import { useTranslation } from 'react-i18next'; import { Virtuoso } from 'react-virtuoso'; import MessageSearchForm from './components/MessageSearchForm'; import { useMessageSearchProviderQuery } from './hooks/useMessageSearchProviderQuery'; import { useMessageSearchQuery } from './hooks/useMessageSearchQuery'; import ResultsLiveRegion from '../../../../components/ResultsLiveRegion'; import RoomMessage from '../../../../components/message/variants/RoomMessage'; import SystemMessage from '../../../../components/message/variants/SystemMessage'; import { useFormatDate } from '../../../../hooks/useFormatDate'; import MessageListErrorBoundary from '../../MessageList/MessageListErrorBoundary'; import { isMessageNewDay } from '../../MessageList/lib/isMessageNewDay'; import MessageListProvider from '../../MessageList/providers/MessageListProvider'; import { useRoomSubscription } from '../../contexts/RoomContext'; // TODO: Refactor this component to isolate the data from the visual const MessageSearchTab = () => { const { t } = useTranslation(); const searchListId = useId(); const formatDate = useFormatDate(); const { closeTab } = useRoomToolbox(); const pageSize = useSetting('PageSize', 10); const [limit, setLimit] = useState(pageSize); const subscription = useRoomSubscription(); const showUserAvatar = !!useUserPreference('displayAvatars'); const providerQuery = useMessageSearchProviderQuery(); const [{ searchText, globalSearch }, handleSearch] = useState({ searchText: '', globalSearch: false }); const { isSuccess, data: messageSearchData, isPending } = useMessageSearchQuery({ searchText, limit, globalSearch }); const itemCount = messageSearchData?.length ?? 0; return ( {t('Search_Messages')} {providerQuery.data && ( )} {providerQuery.isSuccess && ( <> {searchText && isPending && } {isSuccess && ( {messageSearchData.length === 0 && } {messageSearchData.length > 0 && ( { const previous = messageSearchData[index - 1]; const newDay = isMessageNewDay(message, previous); const system = MessageTypes.isSystemMessage(message); const unread = subscription?.tunread?.includes(message._id) ?? false; const mention = subscription?.tunreadUser?.includes(message._id) ?? false; const all = subscription?.tunreadGroup?.includes(message._id) ?? false; return ( {newDay && {formatDate(message.ts)}} {system ? ( ) : ( )} ); }} endReached={() => { setLimit((limit) => limit + pageSize); }} /> )} )} )} {providerQuery.isError && ( {t('Search_current_provider_not_active')} )} ); }; export default memo(MessageSearchTab);