Skip to content

Commit

Permalink
perf(useSearchResults): memoize search function (nodejs#2996)
Browse files Browse the repository at this point in the history
Perf(useSearchResults): memoize search function

Co-authored-by: Claudio Wunder <cwunder@gnome.org>
  • Loading branch information
shanpriyan and ovflowd authored Nov 10, 2022
1 parent 1ed6258 commit 0399f20
Showing 1 changed file with 35 additions and 31 deletions.
66 changes: 35 additions & 31 deletions src/hooks/useSearchResults.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { useMemo } from 'react';
import { useMemo, useCallback } from 'react';
import { graphql, useStaticQuery } from 'gatsby';
import { Index, SerialisedIndexData } from 'elasticlunr';
import { compareTwoStrings } from 'string-similarity';
Expand All @@ -22,34 +22,38 @@ export const useSearchResults = () => {
[resultData]
);

return (currentQuery: string) => {
const currentResults = storeIndex
.search(currentQuery, { expand: true })
.map(({ ref }) => storeIndex.documentStore.getDoc(ref) as SearchResult);

const mapResult = (result: SearchResult) => {
if (result.tableOfContents) {
const tableArray = result.tableOfContents.split('\n');

const uniqueItems = new Set(
tableArray
.map(replaceDataTagFromString)
.filter(item => compareTwoStrings(currentQuery, item) > 0.3)
);

return [...uniqueItems].map(item => ({
title: result.title,
displayTitle: item.replace(/(`|\(.*\))/g, ''),
id: `${result.id}-${createSlug(item)}`,
slug: `${result.slug}#${createSlug(item)}`,
category: result.category,
wrapInCode: item.startsWith('`'),
}));
}

return result;
};

return currentResults.slice(0, 20).map(mapResult).flat().slice(0, 20);
};
const searchResults = useCallback(
(currentQuery: string) => {
const currentResults = storeIndex
.search(currentQuery, { expand: true })
.map(({ ref }) => storeIndex.documentStore.getDoc(ref) as SearchResult);

const mapResult = (result: SearchResult) => {
if (result.tableOfContents) {
const tableArray = result.tableOfContents.split('\n');

const uniqueItems = new Set(
tableArray
.map(replaceDataTagFromString)
.filter(item => compareTwoStrings(currentQuery, item) > 0.3)
);

return [...uniqueItems].map(item => ({
title: result.title,
displayTitle: item.replace(/(`|\(.*\))/g, ''),
id: `${result.id}-${createSlug(item)}`,
slug: `${result.slug}#${createSlug(item)}`,
category: result.category,
wrapInCode: item.startsWith('`'),
}));
}

return result;
};

return currentResults.slice(0, 20).map(mapResult).flat().slice(0, 20);
},
[storeIndex]
);
return searchResults;
};

0 comments on commit 0399f20

Please sign in to comment.