import { useEffect, useMemo } from 'react'; import { useRecoilValue } from 'recoil'; import { Spinner, useToastContext } from '@librechat/client'; import MinimalMessagesWrapper from '~/components/Chat/Messages/MinimalMessages'; import { useNavScrolling, useLocalize, useAuthContext } from '~/hooks'; import SearchMessage from '~/components/Chat/Messages/SearchMessage'; import { useMessagesInfiniteQuery } from '~/data-provider'; import { useFileMapContext } from '~/Providers'; import { buildTree } from '~/utils'; import store from '~/store'; export default function Search() { const localize = useLocalize(); const fileMap = useFileMapContext(); const { showToast } = useToastContext(); const { isAuthenticated } = useAuthContext(); const search = useRecoilValue(store.search); const searchQuery = search.debouncedQuery; const { data: searchMessages, isLoading, isError, fetchNextPage, isFetchingNextPage, hasNextPage: _hasNextPage, } = useMessagesInfiniteQuery( { search: searchQuery || undefined, }, { enabled: isAuthenticated && !!searchQuery, staleTime: 30000, cacheTime: 300000, }, ); const { containerRef } = useNavScrolling({ nextCursor: searchMessages?.pages[searchMessages.pages.length - 1]?.nextCursor, setShowLoading: () => ({}), fetchNextPage: fetchNextPage, isFetchingNext: isFetchingNextPage, }); const messages = useMemo(() => { const msgs = searchMessages?.pages.flatMap((page) => page.messages) || []; const dataTree = buildTree({ messages: msgs, fileMap }); return dataTree?.length === 0 ? null : (dataTree ?? null); }, [fileMap, searchMessages?.pages]); useEffect(() => { if (isError && searchQuery) { showToast({ message: 'An error occurred during search', status: 'error' }); } }, [isError, searchQuery, showToast]); const isSearchLoading = search.isTyping || isLoading || isFetchingNextPage; if (isSearchLoading) { return (
); } if (!searchQuery) { return null; } return ( {(messages && messages.length === 0) || messages == null ? (
{localize('com_ui_nothing_found')}
) : ( <> {messages.map((msg) => ( ))} {isFetchingNextPage && (
)} )}
); }