- Showing {filteredPackages.length} package - {filteredPackages.length !== 1 ? 's' : ''} +
+ Showing {filteredPackages.length} package{filteredPackages.length !== 1 ? 's' : ''}
An error occurred while fetching packages: {error}
diff --git a/src/App.tsx b/src/App.tsx index f9dc817..a025e8f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { Header } from './components/Header'; import { SearchBar } from './components/SearchBar'; import { PackageList } from './components/PackageList'; @@ -7,43 +7,57 @@ import { usePackages } from './hooks/usePackages'; export default function App() { const { packages, loading, error } = usePackages(); const [search, setSearch] = useState(''); + const [selectedRepository, setSelectedRepository] = useState<'core' | 'extra' | 'all'>('all'); + const [debouncedSearch, setDebouncedSearch] = useState(search); - // Filter packages based on search query - const filteredPackages = packages.filter((pkg) => - pkg.name.toLowerCase().includes(search.toLowerCase()) || - pkg.description.toLowerCase().includes(search.toLowerCase()) - ); + // Debounce search to optimize performance + useEffect(() => { + const timeoutId = setTimeout(() => { + setDebouncedSearch(search); + }, 300); // Wait for 300ms after the last keystroke + return () => clearTimeout(timeoutId); + }, [search]); + + // Filter packages based on search query and selected repository + const filteredPackages = packages + .filter((pkg) => { + // Filter by repository + if (selectedRepository !== 'all' && pkg.repository !== selectedRepository) { + return false; + } + // Filter by search query + return pkg.name.toLowerCase().includes(debouncedSearch.toLowerCase()) || + pkg.description.toLowerCase().includes(debouncedSearch.toLowerCase()); + }); + + const handleSearchChange = (value: string) => { + setSearch(value); + }; + + const handleRepositoryFilterChange = (repo: 'core' | 'extra' | 'all') => { + setSelectedRepository(repo); + }; return ( -
- Showing {filteredPackages.length} package - {filteredPackages.length !== 1 ? 's' : ''} +
+ Showing {filteredPackages.length} package{filteredPackages.length !== 1 ? 's' : ''}
An error occurred while fetching packages: {error}