"use client"; import { useState } from "react"; import { Filter, X, AlertTriangle, Zap } from "lucide-react"; import * as LucideIcons from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Checkbox } from "@/components/ui/checkbox"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Switch } from "@/components/ui/switch"; import { Slider } from "@/components/ui/slider"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { ProductFilters, NUTRITION_GRADES, NOVA_GROUPS, POPULAR_CATEGORIES_WITH_ICONS, COMMON_ALLERGENS, } from "@/lib/types"; interface FilterSidebarProps { filters: ProductFilters; onFiltersChange: (filters: ProductFilters) => void; onClearFilters: () => void; isLoading?: boolean; totalResults?: number; className?: string; } export function FilterSidebar({ filters, onFiltersChange, onClearFilters, isLoading = false, totalResults = 0, className = "", }: FilterSidebarProps) { const [searchBrands, setSearchBrands] = useState(""); const [searchCategories, setSearchCategories] = useState(""); const [searchAllergens, setSearchAllergens] = useState(""); const updateFilter = (key: keyof ProductFilters, value: unknown) => { onFiltersChange({ ...filters, [key]: value }); }; const updateArrayFilter = ( key: keyof ProductFilters, value: string, checked: boolean ) => { const currentArray = (filters[key] as string[]) || []; const newArray = checked ? [...currentArray, value] : currentArray.filter((item) => item !== value); updateFilter(key, newArray); }; const updateNutritionRange = ( nutrient: string, type: "min" | "max", value: number ) => { const currentRanges = filters.nutritionRanges || {}; const currentRange = currentRanges[nutrient as keyof typeof currentRanges] || {}; updateFilter("nutritionRanges", { ...currentRanges, [nutrient]: { ...currentRange, [type]: value, }, }); }; const hasActiveFilters = Object.values(filters).some((value) => { if (Array.isArray(value)) return value.length > 0; if (typeof value === "object" && value !== null) { return Object.values(value).some((v) => v !== undefined && v !== null); } return value !== undefined && value !== null && value !== ""; }); return (
{/* Header */}

Filtros

{hasActiveFilters && ( )}
{/* Resultados */} {totalResults > 0 && (
{totalResults.toLocaleString()} produto{totalResults !== 1 ? "s" : ""}{" "} encontrado{totalResults !== 1 ? "s" : ""}
)} {/* Nutri-Score */}
Classificação Nutricional
Nutri-Score
{NUTRITION_GRADES.map((grade) => (
updateArrayFilter( "nutritionGrades", grade.grade, checked as boolean ) } />
))}
NOVA (Processamento)
updateFilter( "novaGroups", value ? [parseInt(value) as 1 | 2 | 3 | 4] : [] ) } className="space-y-2" > {NOVA_GROUPS.map((group) => (
))}
{/* Categorias */}
Categorias
setSearchCategories(e.target.value)} className="h-8" />
{POPULAR_CATEGORIES_WITH_ICONS.filter( (cat) => cat.label .toLowerCase() .includes(searchCategories.toLowerCase()) || cat.value .toLowerCase() .includes(searchCategories.toLowerCase()) ).map((category) => { const IconComponent = LucideIcons[ category.icon as keyof typeof LucideIcons ] as React.ComponentType<{ className?: string }> | undefined; return (
updateArrayFilter( "categories", category.value, checked as boolean ) } />
); })}
{/* Marcas */}
Marcas
setSearchBrands(e.target.value)} className="h-8" />
Digite o nome da marca para buscar
{/* Alérgenos */}
Alérgenos
setSearchAllergens(e.target.value)} className="h-8" />
{COMMON_ALLERGENS.filter((allergen) => allergen.toLowerCase().includes(searchAllergens.toLowerCase()) ).map((allergen) => (
updateArrayFilter( "allergens", allergen, checked as boolean ) } />
))}
{/* Aditivos */}
Aditivos
updateFilter("noAdditives", checked) } />
Mostrar apenas produtos sem aditivos
{/* Valores Nutricionais */}
Valores Nutricionais
{/* Energia */}
{ updateNutritionRange("energy", "min", min); updateNutritionRange("energy", "max", max); }} max={500} step={10} className="w-full" />
{filters.nutritionRanges?.energy?.min || 0} kcal {filters.nutritionRanges?.energy?.max || 500} kcal
{/* Açúcares */}
{ updateNutritionRange("sugars", "min", min); updateNutritionRange("sugars", "max", max); }} max={50} step={1} className="w-full" />
{filters.nutritionRanges?.sugars?.min || 0}g {filters.nutritionRanges?.sugars?.max || 50}g
{/* Sódio */}
{ updateNutritionRange("sodium", "min", min); updateNutritionRange("sodium", "max", max); }} max={3} step={0.1} className="w-full" />
{filters.nutritionRanges?.sodium?.min || 0}g {filters.nutritionRanges?.sodium?.max || 3}g
{/* Botões de ação */}
); }