import { useState, useRef, useEffect } from 'react'; import type { FilterState } from '../types/project'; interface FilterToolbarProps { query: string; selectedTags: string[]; availableTags: string[]; sort: FilterState['sort']; projectCount: number; onSearchChange: (query: string) => void; onTagsChange: (tags: string[]) => void; onSortChange: (sort: FilterState['sort']) => void; } const sortOptions: { value: FilterState['sort']; label: string }[] = [ { value: 'stars', label: 'Most Stars' }, { value: 'alphabetical', label: 'Alphabetical' } ]; export default function FilterToolbar({ query, selectedTags, availableTags, sort, projectCount, onSearchChange, onTagsChange, onSortChange }: FilterToolbarProps) { const [showTagDropdown, setShowTagDropdown] = useState(false); const searchRef = useRef(null); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === '/' && document.activeElement?.tagName !== 'INPUT') { e.preventDefault(); searchRef.current?.focus(); } if (e.key === 'Escape') { setShowTagDropdown(false); } }; const handleClickOutside = (e: MouseEvent) => { // Check if click is outside the dropdown const target = e.target as HTMLElement; if (!target.closest('.tag-dropdown-container')) { setShowTagDropdown(false); } }; window.addEventListener('keydown', handleKeyDown); if (showTagDropdown) { document.addEventListener('click', handleClickOutside); } return () => { window.removeEventListener('keydown', handleKeyDown); document.removeEventListener('click', handleClickOutside); }; }, [showTagDropdown]); const toggleTag = (tag: string) => { if (selectedTags.includes(tag)) { onTagsChange(selectedTags.filter(t => t !== tag)); } else { onTagsChange([...selectedTags, tag]); } }; return (
onSearchChange(e.target.value)} placeholder="Search projects or tags" className="w-full pl-10 pr-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-gray-100 placeholder-gray-500 focus:outline-none focus:border-blue-500" />
{showTagDropdown && (
{availableTags.map(tag => ( ))}
)}
Showing {projectCount} projects
{selectedTags.length > 0 && (
{selectedTags.map(tag => ( {tag} ))}
)}
); }