"use client";
import { useState } from "react";
import {
Filter,
X,
AlertTriangle,
Zap,
Grid,
List,
RefreshCw,
ArrowUpDown,
LayoutGrid,
Tag,
Beaker,
BarChart3,
} 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 { SortDropdown } from "@/app/components/SortDropdown";
import { FilterBadges } from "@/app/components/FilterBadge";
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;
sortBy?: string;
onSortChange?: (sortBy: string) => void;
viewMode?: "grid" | "list";
onViewModeChange?: (mode: "grid" | "list") => void;
onRefresh?: () => void;
onClearCache?: () => void;
isCached?: boolean;
onRemoveFilter?: (key: string, value?: string) => void;
}
export function FilterSidebar({
filters,
onFiltersChange,
onClearFilters,
isLoading = false,
totalResults = 0,
className = "",
sortBy = "relevance",
onSortChange,
viewMode = "grid",
onViewModeChange,
onRefresh,
onClearCache,
isCached = false,
onRemoveFilter,
}: 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" : ""}
)}
{/* Controles de Visualização e Cache */}
{/* Modo de Visualização */}
{onViewModeChange && (
Modo de visualização
)}
{/* Controles de Cache */}
{(onRefresh || onClearCache) && (
Controles
{onRefresh && (
)}
{onClearCache && isCached && (
)}
)}
{/* Filtros Ativos */}
{onRemoveFilter && hasActiveFilters && (
)}
{/* Ordenação */}
Ordenar por
{onSortChange && (
)}
{/* 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
{/* 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 */}
);
}