From c588b6f6b4eafd56c253389d1786c6ace6b17ef5 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Thu, 18 Jun 2026 18:46:51 +0330 Subject: [PATCH] persistent filters --- src/components/Filters.tsx | 56 ++++++++++++++++- src/pages/food/List.tsx | 1 + src/pages/food/hooks/useFoodFilters.ts | 86 +++++++++++++++++++++++--- 3 files changed, 130 insertions(+), 13 deletions(-) diff --git a/src/components/Filters.tsx b/src/components/Filters.tsx index e1381ab..a3ce099 100644 --- a/src/components/Filters.tsx +++ b/src/components/Filters.tsx @@ -49,6 +49,7 @@ interface FiltersProps { className?: string; fieldClassName?: string; searchField?: string; + showClearButton?: boolean; } const Filters: FC = ({ @@ -57,7 +58,8 @@ const Filters: FC = ({ initialValues = {}, className = "flex flex-col md:flex-row justify-between items-start md:items-center gap-4", fieldClassName = "flex flex-col sm:flex-row gap-3 md:gap-4 w-full md:w-auto", - searchField = "search" + searchField = "search", + showClearButton = false, }) => { const [filters, setFilters] = useState({}); const [isFiltersOpen, setIsFiltersOpen] = useState(false); @@ -155,6 +157,42 @@ const Filters: FC = ({ setInputValues(prev => ({ ...prev, [name]: value })); }; + const hasActiveFilters = fields.some((field) => { + const value = field.type === 'input' + ? inputValues[field.name] + : field.type === 'multiselect' + ? multiSelectValues[field.name] + : filters[field.name]; + + if (Array.isArray(value)) { + return value.length > 0; + } + + return Boolean(value); + }); + + const handleClear = () => { + setFilters({}); + setInputValues({}); + setMultiSelectValues({}); + onChange({}); + }; + + const renderClearButton = () => { + if (!showClearButton) { + return null; + } + + return ( +