diff --git a/packages/gitbook/src/components/Search/SearchResults.tsx b/packages/gitbook/src/components/Search/SearchResults.tsx index 21bdc273e..48d7c2a30 100644 --- a/packages/gitbook/src/components/Search/SearchResults.tsx +++ b/packages/gitbook/src/components/Search/SearchResults.tsx @@ -92,17 +92,72 @@ export const SearchResults = React.forwardRef(function SearchResults( }); }, [global, getCtx, pointer, query, revisionId, trackEvent]); - // const timeoutRef = React.useRef(null); + const timeoutRef = React.useRef(null); React.useEffect(() => { - if (query) { - const timeout = setTimeout(() => { + if (!query) { + if (!withAsk) { + setResultsState({ results: [], fetching: false }); + return; + } + + if (suggestedQuestionsRef.current) { + setResultsState({ results: suggestedQuestionsRef.current, fetching: false }); + return; + } + + let cancelled = false; + + setResultsState({ results: [], fetching: true }); + getRecommendedQuestions(getCtx(), spaceId).then((questions) => { + if (!questions) { + if (!cancelled) { + setResultsState({ results: [], fetching: false }); + } + captureException( + new Error(`corrupt-cache: getRecommendedQuestions is ${questions}`), + ); + return; + } + + const results = questions.map((question) => ({ + type: 'recommended-question', + id: question, + question: question, + })) satisfies ResultType[]; + + suggestedQuestionsRef.current = results; + + if (cancelled) { + return; + } + + setResultsState({ results, fetching: false }); + }); + + return () => { + cancelled = true; + }; + } else { + let cancelled = false; + + timeoutRef.current = setTimeout(() => { + if (cancelled) { + return; + } + fetchResults(); }, 1000); - return () => clearTimeout(timeout); + return () => { + cancelled = true; + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + }; } - }, [query, fetchResults]); + }, [query, fetchResults, global, pointer, spaceId, revisionId, withAsk, getCtx]); // React.useEffect(() => { // if (!query) {