mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-16 07:35:16 +00:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a705c6d3b | |||
| 4ee22f767d | |||
| 1accb6e28a | |||
| d4289c387c | |||
| 6ba70e649f | |||
| ee78e745d4 | |||
| c0ec780a53 | |||
| bffdef4370 | |||
| 848aaa808f | |||
| 8401b1362f | |||
| 063b05b1e1 | |||
| 4df83559f7 | |||
| e02c922464 | |||
| 9fde9517b6 | |||
| 3be3324329 | |||
| cfac92add6 | |||
| 1b849823b0 | |||
| c49f5862a4 | |||
| 14b3eafd0b | |||
| 776f8a8f5f |
@@ -64,7 +64,38 @@ export const SearchResults = React.forwardRef(function SearchResults(
|
||||
const [cursor, setCursor] = React.useState<number | null>(null);
|
||||
const refs = React.useRef<(null | HTMLAnchorElement)[]>([]);
|
||||
const suggestedQuestionsRef = React.useRef<null | ResultType[]>(null);
|
||||
const getCtx = useEventCallback(() => ctx);
|
||||
|
||||
// const getCtx = useEventCallback(() => ctx);
|
||||
const memoizedCtx = React.useMemo(() => ctx, [ctx.apiToken, ctx.visitorToken]);
|
||||
const getCtx = useEventCallback(() => memoizedCtx);
|
||||
|
||||
const fetchResults = React.useCallback(async () => {
|
||||
setResultsState((prev) => ({ ...prev, fetching: true }));
|
||||
|
||||
const results = await (global
|
||||
? searchAllSiteContent(getCtx(), query, pointer)
|
||||
: searchSiteSpaceContent(getCtx(), query, pointer, revisionId));
|
||||
|
||||
if (!results) {
|
||||
captureException(
|
||||
new Error(
|
||||
`corrupt-cache: ${global ? 'searchAllSiteContent' : 'searchSiteSpaceContent'} is ${results}`,
|
||||
),
|
||||
{ extra: { results } },
|
||||
);
|
||||
setResultsState({ results: [], fetching: false });
|
||||
return;
|
||||
}
|
||||
|
||||
setResultsState({ results, fetching: false });
|
||||
|
||||
trackEvent({
|
||||
type: 'search_type_query',
|
||||
query,
|
||||
});
|
||||
}, [global, getCtx, pointer, query, revisionId, trackEvent]);
|
||||
|
||||
const timeoutRef = React.useRef<Timer | null>(null);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (!query) {
|
||||
@@ -111,42 +142,124 @@ export const SearchResults = React.forwardRef(function SearchResults(
|
||||
cancelled = true;
|
||||
};
|
||||
} else {
|
||||
setResultsState((prev) => ({ results: prev.results, fetching: true }));
|
||||
let cancelled = false;
|
||||
const timeout = setTimeout(async () => {
|
||||
const results = await (global
|
||||
? searchAllSiteContent(getCtx(), query, pointer)
|
||||
: searchSiteSpaceContent(getCtx(), query, pointer, revisionId));
|
||||
|
||||
timeoutRef.current = setTimeout(() => {
|
||||
if (cancelled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!results) {
|
||||
captureException(
|
||||
new Error(
|
||||
`corrupt-cache: ${global ? 'searchAllSiteContent' : 'searchSiteSpaceContent'} is ${results}`,
|
||||
),
|
||||
{ extra: { results } },
|
||||
);
|
||||
setResultsState({ results: [], fetching: false });
|
||||
return;
|
||||
}
|
||||
|
||||
setResultsState({ results, fetching: false });
|
||||
|
||||
trackEvent({
|
||||
type: 'search_type_query',
|
||||
query,
|
||||
});
|
||||
}, 350);
|
||||
fetchResults();
|
||||
}, 1000);
|
||||
|
||||
return () => {
|
||||
cancelled = true;
|
||||
clearTimeout(timeout);
|
||||
if (timeoutRef.current) {
|
||||
clearTimeout(timeoutRef.current);
|
||||
timeoutRef.current = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}, [query, global, pointer, spaceId, revisionId, withAsk, trackEvent, getCtx]);
|
||||
}, [query, fetchResults, global, pointer, spaceId, revisionId, withAsk, getCtx]);
|
||||
|
||||
// React.useEffect(() => {
|
||||
// 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 {
|
||||
// setResultsState((prev) => ({ results: prev.results, fetching: true }));
|
||||
|
||||
// let cancelled = false;
|
||||
// timeoutRef.current = setTimeout(async () => {
|
||||
// // const timeout = setTimeout(async () => {
|
||||
// const results = await (global
|
||||
// ? searchAllSiteContent(getCtx(), query, pointer)
|
||||
// : searchSiteSpaceContent(getCtx(), query, pointer, revisionId));
|
||||
|
||||
// if (cancelled) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (!results) {
|
||||
// captureException(
|
||||
// new Error(
|
||||
// `corrupt-cache: ${global ? 'searchAllSiteContent' : 'searchSiteSpaceContent'} is ${results}`,
|
||||
// ),
|
||||
// { extra: { results } },
|
||||
// );
|
||||
// // setResultsState({ results: [], fetching: false });
|
||||
// setResultsState((prev) => {
|
||||
// if (prev.results.length === 0 && !prev.fetching) return prev;
|
||||
// return { results: [], fetching: false };
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
|
||||
// // setResultsState({ results, fetching: false });
|
||||
// setResultsState((prev) => {
|
||||
// if (prev.results === results && !prev.fetching) return prev;
|
||||
// return { results, fetching: false };
|
||||
// });
|
||||
|
||||
// trackEvent({
|
||||
// type: 'search_type_query',
|
||||
// query,
|
||||
// });
|
||||
// }, 1000);
|
||||
|
||||
// // return () => {
|
||||
// // cancelled = true;
|
||||
// // clearTimeout(timeout);
|
||||
// // };
|
||||
// return () => {
|
||||
// cancelled = true;
|
||||
// if (timeoutRef.current) {
|
||||
// clearTimeout(timeoutRef.current);
|
||||
// timeoutRef.current = null;
|
||||
// }
|
||||
// };
|
||||
// }
|
||||
// }, [query, global, pointer, spaceId, revisionId, withAsk, trackEvent, getCtx]);
|
||||
|
||||
const results: ResultType[] = React.useMemo(() => {
|
||||
if (!withAsk) {
|
||||
|
||||
Reference in New Issue
Block a user