gdq-archive/frontend/components/Filter.tsx

57 lines
1.4 KiB
TypeScript
Raw Normal View History

2021-01-05 15:25:09 +00:00
/**
* Copyright (C) 2019-2021 Carl Kittelberger <icedream@icedream.pw>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2020-08-22 20:25:57 +00:00
import Fuse from 'fuse.js';
import React from 'react';
export default function Filter<T, U extends React.ReactNode>({
items,
query = '',
2023-01-09 01:31:33 +00:00
isCaseSensitive,
2020-08-22 20:25:57 +00:00
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,
});
2021-01-03 19:30:35 +00:00
const filteredItems = fuse.search<T>(query);
2020-08-22 20:25:57 +00:00
return (
<>{output(filteredItems)}</>
);
}
return (
<>
{output(items.map((item, refIndex) => ({
item,
refIndex,
})))}
</>
);
}
2023-01-09 01:31:33 +00:00
Filter.defaultProps = {
isCaseSensitive: false,
};