import * as React from 'react'
import fuzzysort from 'fuzzysort'
interface UseFuzzySort {
search: string
items: Input[]
options: Fuzzysort.KeyOptions
transformResult: (spec: Input, indexes: number[]) => Result
}
export const useFuzzySort = ({ search, items, transformResult, options }: UseFuzzySort) => {
const [lastSearchInput, setLastSearchInput] = React.useState(search)
const [results, setResults] = React.useState([])
React.useEffect(() => {
// If no search was entered we just show all the items.
if (!lastSearchInput) {
return setResults(items.map((spec) => transformResult(spec, [])))
}
const promise = fuzzysort.goAsync(lastSearchInput, items, options)
promise.then((result) => setResults(result.map(({ obj, indexes }) => transformResult(obj, indexes))))
return () => {
promise.cancel()
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [lastSearchInput, items, transformResult])
return {
setSearch: setLastSearchInput,
search: lastSearchInput,
matches: results,
}
}