You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/shared/hooks/useSearch.ts

24 lines
586 B
TypeScript

import { useMemo, useState } from 'react';
export interface UseSearchOptions<T> {
dataSource: T[];
filterFn: (item: T, searchText: string) => boolean;
}
export function useSearch<T>(options: UseSearchOptions<T>) {
const { dataSource, filterFn } = options;
const [searchText, setSearchText] = useState('');
const isSearching = searchText !== '';
const searchResult = useMemo(() => {
return dataSource.filter((item) => filterFn(item, searchText));
}, [dataSource, searchText]);
return {
searchText,
setSearchText,
isSearching,
searchResult,
};
}