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,
|
|
|
|
};
|