import React, { useEffect, useState } from "react"; import FilterDropdown from "./filters/FilterDropdown"; import FilterRange from "./filters/FilterRange"; import type { FilterConfig } from "./Filters"; interface FiltersPanelMobileProps { filters: FilterConfig[]; open: boolean; onClose: () => void; onApply?: () => void; searchQuery: string; onSearchChange: (value: string) => void; filterValues?: {[key: string]: any}; onFilterChange?: (type: string, value: any) => void; } const FiltersPanelMobile: React.FC = ({ filters, open, onClose, onApply, searchQuery, onSearchChange, filterValues = {}, onFilterChange }) => { const [localFilterValues, setLocalFilterValues] = useState<{[key: string]: any}>({}); // Синхронизируем локальные значения с внешними при открытии панели useEffect(() => { if (open) { setLocalFilterValues(filterValues); } }, [open, filterValues]); useEffect(() => { if (open) { document.body.style.overflow = "hidden"; } else { document.body.style.overflow = ""; } return () => { document.body.style.overflow = ""; }; }, [open]); const handleLocalFilterChange = (type: string, value: any) => { setLocalFilterValues(prev => ({ ...prev, [type]: value })); }; const handleApply = () => { // Применяем все локальные фильтры к основному состоянию Object.entries(localFilterValues).forEach(([key, value]) => { onFilterChange?.(key, value); }); onApply?.(); }; const handleClearFilters = () => { setLocalFilterValues({}); onSearchChange(''); // Сбрасываем фильтры в родительском компоненте Object.keys(filterValues).forEach(key => { onFilterChange?.(key, []); }); }; return ( <> {/* Overlay */}
{/* Drawer */}
{/* Header */}
Фильтры
{/* Search */}
e.preventDefault()}> onSearchChange(e.target.value)} />
{/* Filters */}
{filters.map((filter, idx) => { if (filter.type === "dropdown") { return ( handleLocalFilterChange(filter.title, values)} isMobile /> ); } if (filter.type === "range") { return ( handleLocalFilterChange(filter.title, value)} isMobile /> ); } return null; })}
{/* Apply Button */}
); }; export default FiltersPanelMobile;