Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | import Fuse from 'fuse.js'
import {graphql, useStaticQuery} from 'gatsby'
import path from 'path'
import React from 'react'
function useSearch(query) {
const data = useStaticQuery(graphql`
{
allMdx {
nodes {
fileAbsolutePath
frontmatter {
title
}
rawBody
parent {
... on File {
relativeDirectory
name
}
}
}
}
}
`)
const list = React.useMemo(
() =>
data.allMdx.nodes.map(node => ({
path: path.join(
node.parent.relativeDirectory,
node.parent.name === 'index' ? '/' : node.parent.name,
),
title: node.frontmatter.title,
rawBody: node.rawBody,
})),
[data],
)
const fuse = React.useMemo(
() =>
new Fuse(list, {
threshold: 0.2,
keys: ['title', 'rawBody'],
tokenize: true,
}),
[list],
)
const [results, setResults] = React.useState(list)
React.useEffect(() => {
if (query) {
setResults(fuse.search(query).slice(0, 20)) // Return top 20 results
} else {
setResults(list)
}
}, [query, fuse, list])
return results
}
export default useSearch
|