'use client'; import { useState, useEffect } from 'react'; import SelectedTags from './SelectedTags'; import TagSelector from './TagSelector'; import type { FilterState } from '@/lib/types'; interface RecipesSidebarProps { categories: string[]; tags: string[]; filters: FilterState; onFilterChange: (filters: FilterState) => void; } export default function RecipesSidebar({ categories, tags, filters, onFilterChange }: RecipesSidebarProps) { const [searchInput, setSearchInput] = useState(filters.search); // Sync external search changes (e.g. "Clear All" or URL-driven) to local input useEffect(() => { setSearchInput(filters.search); }, [filters.search]); // Debounce local search input → parent useEffect(() => { const timer = setTimeout(() => { if (searchInput !== filters.search) { onFilterChange({ ...filters, search: searchInput }); } }, 300); return () => clearTimeout(timer); }, [searchInput, filters, onFilterChange]); const handleTagToggle = (tag: string) => { const selectedTags = filters.selectedTags.includes(tag) ? filters.selectedTags.filter((t) => t !== tag) : [...filters.selectedTags, tag]; onFilterChange({ ...filters, selectedTags }); }; const handleRemoveTag = (tag: string) => { onFilterChange({ ...filters, selectedTags: filters.selectedTags.filter((t) => t !== tag) }); }; const handleClearTags = () => { onFilterChange({ ...filters, selectedTags: [] }); }; const handleClearFilters = () => { setSearchInput(''); onFilterChange({ search: '', category: '', selectedTags: [] }); }; const hasActiveFilters = searchInput || filters.category || filters.selectedTags.length > 0; return (
setSearchInput(e.target.value)} placeholder="Search recipes..." className="w-full px-2 py-1.5 text-sm border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500" />
{hasActiveFilters && ( )}
); }