36 lines
677 B
TypeScript
36 lines
677 B
TypeScript
|
import Fuse from 'fuse.js';
|
||
|
import React from 'react';
|
||
|
|
||
|
export default function Filter<T, U extends React.ReactNode>({
|
||
|
items,
|
||
|
query = '',
|
||
|
isCaseSensitive = false,
|
||
|
keys,
|
||
|
output,
|
||
|
}: {
|
||
|
items: Array<T>,
|
||
|
query: string,
|
||
|
isCaseSensitive?: boolean,
|
||
|
keys: Array<string>,
|
||
|
output: (filteredItems: Array<Fuse.FuseResult<T>>) => U,
|
||
|
}) {
|
||
|
if (query.length > 0) {
|
||
|
const fuse = new Fuse(items, {
|
||
|
isCaseSensitive,
|
||
|
keys,
|
||
|
});
|
||
|
const filteredItems = fuse.search(query);
|
||
|
return (
|
||
|
<>{output(filteredItems)}</>
|
||
|
);
|
||
|
}
|
||
|
return (
|
||
|
<>
|
||
|
{output(items.map((item, refIndex) => ({
|
||
|
item,
|
||
|
refIndex,
|
||
|
})))}
|
||
|
</>
|
||
|
);
|
||
|
}
|