import { AI_LICENSE_MODULE, MAX_SEARCH_ANSWER_MESSAGES } from '@rocket.chat/ai-search'; import { Box, Button, Callout, Icon } from '@rocket.chat/fuselage'; import { Page, PageHeader, PageScrollableContentWithShadow, useFeaturePreview } from '@rocket.chat/ui-client'; import { useSearchParameter, useSetting } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import SearchAnswerPanel from './SearchAnswerPanel'; import SearchSourceResult from './SearchSourceResult'; import { useAISearchAnswer } from './hooks/useAISearchAnswer'; import { useAISearchResults } from './hooks/useAISearchResults'; import { useHasLicenseModule } from '../../hooks/useHasLicenseModule'; const SearchPage = (): ReactElement => { const { t } = useTranslation(); const queryParam = useSearchParameter('q') ?? ''; const aiSearchFeatureEnabled = useFeaturePreview('aiSearch'); const intelligentSearchEnabled = useSetting('AI_Intelligent_Search_Enabled', false); const { data: hasIntelligentSearchLicense } = useHasLicenseModule(AI_LICENSE_MODULE); const canUseAISearch = Boolean(hasIntelligentSearchLicense && aiSearchFeatureEnabled); const { query: debouncedQuery, intelligent, meta, hasMoreResults, loadMore, isLoading, isPlaceholderData, error: searchError, } = useAISearchResults(queryParam, canUseAISearch && intelligentSearchEnabled); const answerMessages = useMemo( () => intelligent.slice(0, MAX_SEARCH_ANSWER_MESSAGES).map((item) => ({ _id: item.msgId || item._id, score: item.score, })), [intelligent], ); const canGenerateAnswer = Boolean(meta?.answerGenerationConfigured && !isPlaceholderData && debouncedQuery && intelligent.length > 0); const answerResult = useAISearchAnswer(debouncedQuery, answerMessages, canGenerateAnswer); const answerEmptyReason = useMemo(() => { if (!debouncedQuery) { return t('Search_AI_answer_start_from_top_bar'); } if (isLoading) { return t('Search_AI_answer_waiting_for_sources'); } if (searchError) { return t('Search_AI_answer_sources_error'); } if (!intelligent.length) { return t('Search_AI_answer_no_sources'); } if (!meta?.answerGenerationConfigured) { return t('Search_AI_answer_disabled'); } return t('Search_AI_answer_ready'); }, [debouncedQuery, intelligent.length, isLoading, meta?.answerGenerationConfigured, searchError, t]); return ( {debouncedQuery ? ( {t('Results')} {debouncedQuery} ) : ( {t('Intelligent_Search_page_empty_state')} )} {t('Intelligent_Search_scope_all_rooms')} {hasIntelligentSearchLicense === false && ( {t('Intelligent_Search_upsell_description')} )} {hasIntelligentSearchLicense && !aiSearchFeatureEnabled && ( {t('AI_Search_feature_disabled_description')} )} {canUseAISearch && !intelligentSearchEnabled && ( {t('Intelligent_Search_disabled_description')} )} {canUseAISearch && intelligentSearchEnabled && meta && !meta.intelligentSearchConfigured && ( {t('Intelligent_Search_missing_configuration_description')} )} {searchError && ( {t('AI_Search_request_failed')} )} {debouncedQuery && ( void answerResult.refetch()} /> )} {t('Sources')} ยท {intelligent.length} {t('Messages')} {hasMoreResults && ( )} {!debouncedQuery && ( {t('Intelligent_Search_start_from_top_bar')} )} {isLoading && ( {t('Loading')} )} {debouncedQuery && !isLoading && !searchError && intelligent.length === 0 && ( {t('No_results_found')} )} {intelligent.map((item) => ( ))} ); }; export default SearchPage;